logo

[텍스트 분석] 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)

Previous
문서 클러스터링