LDA
전처리는 토픽 모델링을 위한 전처리를 참조
gensim 전처리
설치
!pip install gensim
문서 단어 행렬을 gensim 형식으로 변환
from gensim.matutils import Sparse2Corpus
words = cv.get_feature_names_out().tolist()
corpus = Sparse2Corpus(dtm.T)
id2word = dict(enumerate(words))
0번 문서의 단어 수 보기
corpus[0]
[(92, 2), (235, 3), (286, 3), (333, 2), (80, 1), (218, 1), (269, 1), (339, 1), (292, 2), (145, 2), (262, 1), (83, 1), (226, 1), (258, 1), (96, 1), (254, 1), (161, 1), (315, 1)]
LDA
from gensim.models.ldamodel import LdaModel
lda_model = LdaModel(
corpus=corpus,
id2word=id2word,
num_topics=15,
random_state=100,
update_every=1,
chunksize=100,
passes=10,
iterations=400,
alpha='auto',
eta='auto',
per_word_topics=True)
토픽 보기
0번 토픽 보기
lda_model.show_topic(0)
[('제조', 0.14855433), ('공정', 0.06653029), ('물질', 0.063249685), ('방법', 0.06227303), ('액상', 0.053464703), ('사용', 0.04483812), ('분리', 0.043456074), ('발명', 0.040224843), ('적용', 0.028568083), ('최소', 0.025208062)]
특정 단어와 관련된 토픽 보기
word_idx = words.index('모발')
lda_model.get_term_topics(word_idx)
[(6, 0.11275391), (9, 0.06061363)]
문서별 토픽 보기
doc_idx = 0
lda_model.get_document_topics(corpus[doc_idx])
[(0, 0.09816825), (3, 0.5412478), (6, 0.11051823), (8, 0.12786797), (9, 0.07444884)]
평가
로그 혼란도(0에 가까울 수록 성능이 높음)
lda_model.log_perplexity(corpus)
-5.022117447022388
다양도(1에 가까울 수록 성능이 높음)
topn = 25
top_words = set()
for topic in range(lda_model.num_topics):
for word, prob in lda_model.show_topic(topic, topn=topn):
top_words.add(word)
len(top_words) / (lda_model.num_topics * topn)
0.6373333333333333
시각화
설치
!pip install pyLDAvis==2.1.2
단어 목록
from gensim.corpora.dictionary import Dictionary
dic = Dictionary()
dic.id2token = id2word
dic.token2id = {w: i for i, w in id2word.items()}
시각화
import pyLDAvis.gensim
p = pyLDAvis.gensim.prepare(
lda_model, corpus, dic, sort_topics=False)
pyLDAvis.display(p)