일단 이 문제를 뒤로하고 모델을 어떤걸 써야 할지 고민하다가 파이썬 머신러닝 완벽 가이드 책을 보면서 앙상블 기법을 공부했습니다 평소에 XGBoost, LightGBM에 관심이 있었던 터라(캐글에서 유명한 모델이라는 소문을 들었습니다) 실습도 진행해 가면서 살펴봤습니다 실습한 코드는 내일쯤에 업로드할 예정입니다
그 외에도 스태킹과 딥러닝의 RNN 등 여러 모델을 공부해서 견문 좀 넓히려고 합니다:)
머리에 인풋이 있어야 활용을 할 수 있으니까요
아마 다음주도 모델 공부를 계~속 할 것 같아요
이번 프로젝트 기회로 여러가지를 경험할 수 있어서 좋은 것 같습니다
CNN이나 토픽 모델링을 했을 때와는 다르게 이번에는 시간을 좀 넉넉하게 하려고 합니다
목표는 다음 주까지 완성하는 건데, 시간에 쫓겨서 대충 만들기는 싫으므로 완성도 있게 만들도록 노력해보겠습니다
전처리 과정에 앞서서 먼저 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가 파고들수록 어려운 분야 라는걸 깨달았습니다. 문맥,뉘앙스 처럼 사람만이 이해하는 것들을 학습시키는게 상당히 어려울 거란걸 초보인 저도 가늠할수 있었습니다. 이처럼 어려운 분야의 전문가가 되는 제 모습을 상상하면서 더욱 매진해 볼 생각입니다 :)