견리더의 알(R)파(Python)고
고용 관련 뉴스기사 분류 및 토픽 모델링 - 5 (토픽 모델링하기 gensim, lda) 본문
저번 4탄에서 각 기사들의 고용 관련 점수를 뽑아 보았다.
이제 이 고용 기사들로 토픽모델링을 하여 크게 어떤 이슈가 있었는지 알아보자
먼저, 우리가 형태소 분석을 했던 리스트 형식의 데이터가 필요하다.
형태소 분석을 하여 명사만 저장했다.
기사는 2020년 3월 부터 8월 까지의 기사이다.
토픽모델링은 gensim 패키지의 lda모델을 사용 했다. 전제적인 코드는 같은 직장의 누님이 주신 코드이다.
누님도 인터넷을 참고 했다고 한다. 모두 구글을 애용하자
토픽모델링에 사용한 임포트는 다음과 같다. 이 프로젝트 임포트한 것에 포함 되어 있으니 여기엔 올려만 놔야겠다.
import gensim
import gensim.corpora as corpora
from gensim.models import CoherenceModel
import pyLDAvis
import pyLDAvis.gensim
아마 더 필요할지도 모르지만, 내가 써놓은 것을 다 임포트하면 에러나지는 않을 것이다.
먼저 고용관련 점수 상위 1000개의 기사를 가져와보자
data50 = data50.sort_values(by='score', ascending=False)
data1000 = data50[:1000]
data1000
위 사진과 같은 형태의 데이터 들을 코퍼스 사전안에 넣어준다.
news = data1000['words']
id2word = corpora.Dictionary(news)
corpus = [id2word.doc2bow(text) for text in news]
자세히 알기보단 토픽모델링을 하는데에 필요한 기본 작업이라고 생각하면 편하다.
다음은 토픽모델링을 하기위한 함수 만드는 과정이다.
def compute_coherence_values(dictionary, corpus, texts, limit, start=2, step=3):
coherence_values = []
model_list = []
for num_topics in tqdm(range(start, limit, step)):
model = gensim.models.ldamodel.LdaModel(corpus=corpus,
id2word=id2word,
num_topics=num_topics,
random_state=100,
update_every=1,
chunksize=100,
passes=10,
alpha='auto',
per_word_topics=True)
model_list.append(model)
coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v')
coherence_values.append(coherencemodel.get_coherence())
return model_list, coherence_values
ldamodel의 설정값은 이 사이트를 참고하길 바란다. gensim 공식 사이트 이다.
Gensim: topic modelling for humans
Efficient topic modelling in Python
radimrehurek.com
for num_topics in tqdm(range(start, limit, step)):
여기서 start, limit, step은 주제수를 설정하는 부분이다. 보통 토픽모델링은 주제 갯수를 정해줘햐 그 기준으로 분류를 하는데, 몇 개의 주제가 가장 적절한지 모르기 때문에 일정 범위의 수를 정해 모두 돌려본다. 그 후 coherence를 통해 점수가 가장 높은 주제를 설정하는게 정석이다.
model_list, coherence_values = compute_coherence_values(dictionary=id2word, corpus=corpus, texts=texts, start=2, limit=20, step=2)
# Show graph
limit=20; start=2; step=2;
x = range(start, limit, step)
plt.plot(x, coherence_values)
plt.xlabel("Num Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()
첫번째 행에서 시간이 좀 걸린다. 그리고, 이것은 파이참 보다 주피터를 사용하는 것이 더 좋다. 이유는 주피터에서 아주 편리하게 시각화가 가능하기 때문이다.
model_list는 각 주제수 별 모델을 저장한 것이고, coherence_values는 해당 모델의 일관성을 나타내는 점수를 저장한 것이다.
주제가 6개일때 주제 일관성이 가장 높다는 뜻이다. 어떻게 6개로 나뉘었는지 살펴보자
# Select the model and print the topics
optimal_model = model_list[2]
model_topics = optimal_model.show_topics(formatted=False)
pprint(optimal_model.print_topics(num_words=15))
Topic 0 => 특수고용직 고용보험 관련 주제
Topic 1 => 제조업 분야의 실업급여 관련 주제
Topic 2 => 코로나로 인한 고용, 일자리 관련 주제
Topic 3 => 일자리 문제에 대한 정부의 입장
Topic 4 => 최저임금 문제
Topic 5 => 소상공인, 중소기업 실업 문제
로 나뉘는것 같다.
이제 토픽들이 어떤식으로 분포되어있는지 알아보자. 이건 아마 주피터에서만 지원되는 것으로 알고있다.
(파이참을 사용안한 이유)
# Visualize the topics
pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(optimal_model, corpus, id2word)
vis
3가지의 주제가 비슷한 위치에 있고, 나머지는 떨어져있다. 저 숫자는 모델리스트에 대한 숫자가 아니고 크기 순위 이므로 주의해야한다. 저 원 위에 마우스를 올리면 어떤 토픽인지 알 수 있다.
역시 2020년 자료라서 실업과, 실업급여, 코로나 등의 문제가 주요 주제라는 것을 알 수 있었다.
웅아ㅏ아아아ㅏㅇ
이제 프로젝트가 하나 끝났다.
고용관련 뉴스도 뽑아보았고, 그것을 이용하여 토픽모델링도 사용해 보았다.
이 포스팅에선 고용 관련 뉴스를 단지 상위 n개를 뽑아 사용하여 신뢰도가 떨어지지만,
진짜 프로젝트에서는 이런식으로 사용하지 않았다.
프로젝트에서는 고용관련 뉴스를 직접 라벨링하여 구분을 하고 이 데이터를 이용해 ML,DL 다 사용해 보았다.
또한 토픽모델링도 lda모델만이 아닌 토마토파이 패키지를 이용해 다이나믹 토픽모델링이나, TF-IDF 가중을 두어서 하는 모델링 등등을 모두 사용해 보았다.
다른 포스팅에서 내가 사용한 것들을 다 차례차례 올려야 겠다.
끝까지 봐주셔서 감사합니다 ㅎㅎㅎ
'프로젝트' 카테고리의 다른 글
고용 관련 뉴스기사 분류 및 토픽 모델링 - 4 (word2vec활용하기) (0) | 2020.11.30 |
---|---|
고용 관련 뉴스기사 분류 및 토픽 모델링 - 3 (word2vec) (0) | 2020.11.23 |
고용 관련 뉴스기사 분류 및 토픽 모델링 - 2 (사전에 단어 추가, ckonlpy) (0) | 2020.11.10 |
고용 관련 뉴스기사 분류 및 토픽 모델링 - 1 (0) | 2020.11.09 |
프로젝트의 쓸 패키지들 (0) | 2020.11.05 |