우리는 이제 LDA model를 학습시켜봅시다. 모형 자체에 대한 설명은 잠시 미루어두고, 우선 학습 파라미터를 먼저 봅시다.
저희는 오늘 이 파라미터중 topic 의 갯수, 그리고 passes 를 변화시켜보면서 더 좋은 모델을 설계해 보려고 합니다.
바로 Perplexity, Topic Coherence입니다.
perpelxity는 사전적으로는 혼란도 라고 쓰인다고 합니다. 즉 특정 확률 모델이 실제도 관측되는 값을 어마나 잘 예측하는지를 뜻합니다. Perlexity값이 작으면 토픽모델이 문서를 잘 반영된다고 알 수 있습니다. 따라서 작아지는것이 중요합니다.
의미 의미확률 모델이 결과를 얼마나 정확하게 예측하는지.낮을수록 정확하게 예측.
토픽 모델링 기법이 얼마나 빠르게 수렴하는지 확인할 때,
확률 모델이 다른 모델에 비해 얼마나 개선되었는지 평가할 때,
동일 모델 내 파라미터에 따른 성능 평가할 때 주로 사용
한계 Perplexity가 낮다고 해서, 결과가 해석 용이하다는 의미가 아님
이와달리 coherence는 주제의 일관성을 측정합니다. 해당 토픽모델이, 모델링이 잘 되었을수록 한 주제 안에는 의미론적으로 유사한 단어가 많이 모여있게 마련입니다. 따라서 상위 단어 간의 유사도를 계산하면 실제로 해당 주제가 의미론적으로 일치하는 단어들끼리 모여있는지 알 수 있습니다.
토픽이 얼마나 의미론적으로 일관성 있는지.
높을수록 의미론적 일관성 높음
해당 모델이 얼마나 실제로 의미있는 결과를 내는지 확인하기 위해 사용
평가를 진행하기 위해 다른 외부 데이터(코퍼스, 시소러스 등)가 필요
어떻게 문서들 집합간의 일관성을 정량화 할 것인가? 문서 집합의 Coherence 가 높아지면 monotonic 해지는 문제점이 생긴다. 하지만 다른 사실을 추가한다면 단조로움이 보다 감소되는 경향이 있다. 이 것은 마치 Bias-Variance tradeoff 처럼, 만약 특정 coherence가 너무 높아지면 정보의 양이 줄어들게 되고, coherence가 너무 낮아 정보들이 인관성이 없다면, 분석의 의미가 낲아지게 됩니다.
num_topics = 10
chunksize = 2000
passes = 20
iterations = 400
eval_every = None
%time model = LdaModel(corpus = corpus, id2word = id2word, chunksize = chunksize,\
alpha ="auto", eta="auto",\
iterations = iterations, num_topics = num_topics,\
passes = passes, eval_every = eval_every)
coherencesT=[]
perplexitiesT=[]
passes=[]
warnings.filterwarnings('ignore')
for i in range(10):
if i==0:
ntopics = 2
else:
ntopics = 20*i
nwords = 100
tic = time.time()
lda4 = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=ntopics, iterations=400, passes=30)
print('ntopics',ntopics,time.time() - tic)
cm = CoherenceModel(model=lda4, corpus=corpus, coherence='u_mass')
coherence = cm.get_coherence()
print("Cpherence",coherence)
coherencesT.append(coherence)
print('Perplexity: ', lda4.log_perplexity(corpus),'\n\n')
perplexitiesT.append(lda4.log_perplexity(corpus))