[텍스트 분석] LDA
전처리는 [토픽 모델링을 위한 전처리](/course/text-mining/토픽 모델링을 위한 전처리)를 참조
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)