728x90

국민청원글을 대상으로 토픽모델링을 진행했습니다.

첫번째로 LDA를 활용하여 토픽모델링 함으로써 공통적인 속성을 알고자 했습니다

두번째로 ATM은 카테고리별 문서주제 분포를 파악하여 유사도를 분석해 보고자 했습니다 

corab url

 

Google Colaboratory

 

colab.research.google.com

1.  import/ 파일 불러오기


2. 텍스트 전처리 전 시각화

>각 청원글을 공백 기준으로 단어로 만듭니다


>공백으로 잘라준 total_tokens의 빈도를 확인합니다


> 전처리 전 청원글의 빈도 그래프 입니다. 보다시피 유의미한 의미를 찾기 힘들기 때문에

명사만을 추출하여 진행했습니다.


3. 텍스트 전처리 후 시각화

전처리 과정에 앞서서 먼저 author2doc를 만들어 줍니다 (전처리 후에 해도 상관없습니다) 

> 카테고리 별로 group by를 해줍니다. 총 882개의 청원글의 인덱스가 카테고리별로 이쁘게 모입니다.

cls2doc은 ATM의 author2doc에 해당됩니다.


이제 카테고리 중 "행정" 청원글을 가지고 텍스트 전처리/시각화를 진행하겠습니다.  

>cls2doc['행정']을 실행하면 문서 인덱스가 list로 나오기 때문에 for문을 이용할수 있습니다.


>행정 문서내용이 담긴 cls1을 doc으로 넘겨준 뒤 mecab.nouns(doc) 통해 명사만 추출하는데 

길이가 1이상인 것만 가져옵니다. 한글자 단어는 이 청원글에서 큰 의미를 주지 못하기 때문에 제외 시켜줬습니다.

각 명사별 빈도 top3가 "국민,정부,코로나" 인것을 확인할수 있습니다.

시각화를 하기 앞서서 불용어 처리를 위해 불용어 사전을 업로드 후 그래프 및 워드 클라우드를 시각화 합니다.


> 텍스트 전처리 후 상위 100개 단어를 가지고 그래피와 워드클라우 시각화 결과입니다.

ngram을 하지 않아서 각 단어가 어떤 연결성이 존재하는지는 알수 없지만 일자리에 관련된 청원글의 

키워드를 대략 파악할수 있었습니다.


4. topic modeling

lda/atm 모델에는 dictionary ,corpus가 필요합니다.  dictionary는 영어 단어장 처럼 청원글에 제시된 단어를 말합니다.

저는 mecab.nouns를 사용해서 dictionary를 만들었습니다. corpus는 각 단어를 (단어의 인덱스,빈도) 형식으로 수치화 시켜준 것을 말합니다. 이해를 돋기 위해서 아래 그림을 참고해주세요

>왼쪽이미자가 corpus, 오른쪽이미지는 인덱스를 단어로 변경했을때 모습입니다.


그러면 dictionary와 corpus를 어떻게 만드는지 아래 코드를 보면서 설명드리겠습니다.

>왼쪽그림에서 문서를 명사 추출 후 text_cleaning통해 한번더 걸러줍니다. 

명사를 추출하면서 특수문자나 url와 같은 문자들은 추출이 되지 않지만 한 글자만 남아 있는 것들 제거 하기 위해서 실행해 줬습니다.

왼쪽그림에서 한 글자을 제거하는 코드를 여러 방면으로 시도해 봤지만 모델을 돌릴때 인덱스 오류가 지속적으로 발생했습니다. 제 생각에는 한 글자들이 빠지면서 생긴 공백 때문이지 않을까 생각됩니다. 

좀더 쉽고 간단하게 할수 있는 방법을 찾다가 실습때 배웠던 text_cleaning 함수에 len(doc)>1를 추가 했는데 에러가 잡히지 않았습니다.


>명사화된 token들을 Dictionary,doc2bow를 통해 dictionary,corpus를 만들어줍니다.


4-1 LDA Model

>토픽 수를 결정하기 위해서 최소 4개~20개까지 각각 계산해 합니다.


>corpus, dictionary를 넣어주고 num_topic를 이용해서 4개일때,5개일때, ... , 20개일때의 lda를 각각 계산합니다.

주석처리된 부분은 모델을 저장 할때 사용합니다. 


>계산 결과 topic 8개 일때 coherence가 0.45로 가장 높은결과를 얻었습니다(passes=100일때)

coherence의 기준을 보면 0.45가 낮은 수준임을 알수가 있습니다. 즉 유사한 단어끼리 뭉쳤다고는 좋게 볼수가 없습니다. passes를 1000회 이상 높이면 지금보다 더 좋은 결과를 얻을수 있을 거라 생각됩니다. 

이어서 topic_num=8 일때의 lda결과를 보겠습니다.

 

> num_topic를 8로 설정하고, passes= 100 으로 모델을 실행합니다.


> topic label를 정해줍니다.

 

>각 토픽별 어떤 단어끼리 뭉쳤는지 출력합니다. 


>LDA model 결과로는 총 8개의 topic으로 구분되었습니다. 가장 많은 비중을 차지한 topic1은 코로나와 관련된 키워드 "코로나,방역,정부" 등이 있으며 topic3은 "주택,부동산,지역" 등 부동산과 관련된 topic임을 짐작 할수 있었습니다.

coherence가 낮기때문에 양질의 분류는 아닐지라도 어느정도 유추 할수 있는 topic들이 있었습니다. 

여기까지 전체 청원글에 대한 LDA를 이용하여 topic modeling을 진행해 보았습니다.


4-2 ATM_model

> author2doc이 추가 되었고 나머지는 LDA와 같습니다.

 

 

>실행결과 num_topic=8 일때 수치가 가장 높았지만 lda와 같은 0.45로 낮은 수치를 기록했습니다.

그러면 num_topic=8로 다시 설정하여 ATM을 실행하겠습니다.


 

 

>각 토픽별 word를 출력한 결과입니다. topic0은 범죄와 관련되어 있고, topic1은 사회적 거리두기 방역지침과 밀접해 보입니다. LDA와 마찬가지로 같은 num_topic(8), coherence를 보였습니다. 전반적으로 토픽의 성격도 비슷하게 묶였음을 확인할수 있었습니다. 그러면 author 간의 거리를 측정해서 유사도를 보겠습니다.


> 특정 저자가 어떠한 저자와 유사한지를 구하는 함수입니다.

즉, author-topic space에서 가장 가까운 벡터를 구해야 합니다. 거리를 재는 방법 중 hellinger distance를

사용합니다. hellinger distance는 두 개의 확률분포가 가우시안 분포를 따를 때 그 사이의 거리를 재는 방법입니다.

get_author_topics에는 해당 저자(카테고리)가 7개 토픽 중 차지하는 비율 정보가 있습니다.

이 정보로 가지고 저자 간의 거리를 구합니다.

(해당 함수는 강의 실습 코드를 참고했습니다.)


>일자리 author와 가장 유사도가 높은 것은 경제 민주화입니다.

따라서 이 두개의 author는 청원글의 주제가 겹칠수 있다는걸 알수 있습니다.

 

토픽모델링을 공부하면서 느낌점

부트캠프에서 크롤링->R의 워드클라우드로 프로젝트를 한적이 있었습니다. 그 당시에도 들었던 생각은 키워드만 가지고 뭔가 인사이트를 얻는게 충분치 않다 라는 느낌을 받았습니다. 이번계기로 NLP가 파고들수록 어려운 분야 라는걸 깨달았습니다. 문맥,뉘앙스 처럼 사람만이 이해하는 것들을 학습시키는게 상당히 어려울 거란걸 초보인 저도 가늠할수 있었습니다.  이처럼 어려운 분야의 전문가가 되는 제 모습을 상상하면서 더욱 매진해 볼 생각입니다 :) 

만일 틀린거라든가 보완해야 할 점이 있다면 언제점 말씀해주세요 ~!  

728x90

'projects' 카테고리의 다른 글

따릉이 자전거 이용 예측_dacon  (0) 2021.09.30
Face Mask Detection  (0) 2021.08.25
동서발전 태양광 발전량 예측 프로젝트_dacon  (0) 2021.06.29
뉴욕 택시수요예측  (0) 2021.02.16
CNN_BTS 멤버 image classification  (0) 2021.01.10

+ Recent posts