[파이썬] 토픽 모델링 - 잠재 디리클레 할당 LDA ( 자연어 처리 / 주제 분류)

2021. 1. 25. 18:38머신러닝

728x90

 
 

 

※ 토픽 모델링 ( Topic modeling )

토픽 모델 (Topic model) 이란, 문서 집합의 추상적인 주제를 발견하기 위한 통계적 모델.
문헌 내에 어떤 주제가 들어있고, 주제 간의 비중이 어떤지는 문헌 집합 내의 단어 통계를 수학적으로 분석함으로써 알아낼 수 있다.

토픽 모델링의 중요한 특징은 레이블이 된 데이터가 필요 없다는 점이며, 스스로 패턴을 식별하는 비지도학습 방식이다.

 
 

 


◎ 토픽 모델링에 대한 사용 사례


문서 토픽 요약 : 문서의 토픽을 요약할 수 있어서, 신속하게 분류할 수 있도록 도와줌.
준다.

검색엔진 최적화 : 토픽과 관련 키워드를 식별하여, 온라인 기사, 블로그 및 문서를 쉽게 태그 할 수 있으므로 검색 결과 최적화가 향상됨.

고객 지원 개선 : 제품 및 서비스 사양, 부서 등 고객 불만이나 피드백에 관련해, 토픽과 관련 키워드를 발견할 수 있다.

 
 
 



잠재 디리클레 할당 ( Latent Dirichlet Allocation )


- 주어진 문서에 대해 각 문서에 어떤 주제들이 존재하는지에 대한 확률 모델.
'선발', '마무리', '홈런' 단어와 '사고’, '시속'이 있다면 어느 단어를 보았는지에 따라 다양한 주제가 나올 수 있다.

'잠재 디리클레 할당' 이라는 이름은 이런 잠재 정보를 알아내는 방법에서 잠재라는 명칭을 따왔고, 이 때 각 토픽들이 나올 확률이 디리클레 (dirichlet) 분포를 따른다는 가정을 하기 때문에 디리클레라는 단어가 붙었다.
무엇보다 문서의 토픽은 단 하나로 정해지는 것이 아니라, 여러 토픽의 비율로 표현할 수 있다.
 

from gensim import corpora 
from gensim import models
from wordcloud import WordCloud
import matplotlib.pyplot as plt

documents=[
    '나는 아침에 라면을 자주 먹는다.',
    '나는 아침에 밥 대신에 라면을 자주 먹는다.',
    '현대인의 삶에서 스마트폰은 필수품이 되었다.',
    '현대인들 중에서 스마트폰을 사용하지 않는 사람은 거의 없다. ',
    '점심시간에 스마트폰을 이용해 영어 회화 공부를 하느라 혼자 밥을 먹는다.'
]

stoplist = ('.!?')                                        # 불용어 처리
texts = [[word for word in document.split() if word not in stoplist]
        for document in documents]

dictionary = corpora.Dictionary(texts)                    # 사전 생성 (토큰화)
print(dictionary)

corpus = [dictionary.doc2bow(text) for text in texts]     # 말뭉치 생성 (벡터화)
print('corpus : {}'.format(corpus))

#-----------------------------------------------------------------

lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, 
        num_topics=2, random_state = 1)                   # 모델구축

for t in lda.show_topics():  # 주제마다 출현 확률이 높은 단어 순으로 출력
	print(t)

#-----------------------------------------------------------------

wc = WordCloud(background_color='white',
        font_path='./sample/SeoulNamsanM.ttf')            # 워드클라우드

plt.figure(figsize=(30,30))
for t in range(lda.num_topics):
    plt.subplot(5,4,t+1)
    x = dict(lda.show_topic(t,200))
    im = wc.generate_from_frequencies(x)
    plt.imshow(im)
    plt.axis("off")
    plt.title("Topic #" + str(t))

plt.savefig('LDA_wordcloud.png', bbox_inches='tight')     # 이미지 저장

 

 
 

▷ 1. 토픽 A : 먹는다 7.5%, 나는 6%, 라면을 5.7%...
▷ 2. 토픽 B :  스마트폰은 5%, 필수품이 5%, 먹는다 5% …
 
 
※ 참고도서 :  실무가 훤히 보이는 머신러닝 & 딥러닝 ※

 
 
 

반응형