Friday, May 3, 2024

LDA, GenSIM 한글 토픽모델링 코드 설명

Share

토픽 모델링은 텍스트 데이터에서 주제를 찾아내는 방법으로, 문서 집합에서 각 문서가 어떤 주제들로 구성되어 있는지를 파악하는 분석 방법론입니다. 여러 토픽 모델 중에서 LDA(Latent Dirichlet Allocation)Gensim은 대표적인 분석 방법론입니다.

1.LDA

  • 기본적인 가정으로 각 문서는 여러 개의 토픽들의 혼합으로 이루어져 있으며, 각 토픽은 단어들의 확률 분포를 가지고 있다는 가정으로 분석됩니다.
  • 모델은 주어진 문서와 단어들을 바탕으로, 각 문서가 어떤 토픽들을 얼마나 포함하고 있을지를 추정합니다.
  • LDA는 Gibbs 샘플링과 같은 방법을 사용하여 문서와 단어들 간의 토픽 분포를 학습합니다.

1-1.LDA 주요 함수

사이킷런의 LatentDirichletAllocation가 LDA 토픽모델링 함수이며 주요 하이퍼파라미터는 아래를 참고하며 Sklearn에서 LatentDirichletAllocation 전문을 참고하면 더욱 자세한 사용법을 알 수 있다.

  • n_components : 토픽의 수
  • doc_topic_prior : 문서의 토픽 분포의 초기 하이퍼파라미터
  • topic_word_prior: 토픽의 단어 분포의 초기 하이퍼파라미터
  • max_iter: 학습 데이터에 대한 학습 횟수 (epoch)
  • learning_method: 기본값은 batch, component를 업데이트 하는 방식을 의미하며, 데이타가 클 경우 online모드가 속도가 더 빠르게 진행한다.
  • n_job: 본 모델을 수행함에 있어 사용되어질 프로세스 수. -1이면 모든 포로세스가 해당 작업을 위해 사용된다.

2.Gensim 특징

  • Gensim은 토픽 모델링 및 자연어 처리를 위한 오픈 소스 라이브러리
  • LDA뿐만 아니라 다양한 토픽 모델링 알고리즘을 구현하고 있으며, 특히 대량의 텍스트 데이터에 대한 효과적인 토픽 모델링을 제공합니다.
  • Gensim은 문서와 단어를 벡터 형태로 표현하여 처리하며, LDA뿐만 아니라 Word2Vec, Doc2Vec 등 다양한 모델을 지원합니다.
  • 사용자가 쉽게 텍스트 데이터를 처리하고 토픽 모델링을 수행할 수 있는 편리한 인터페이스를 제공합니다.

2-1.Gensim 절차

Gensim을 이용하여 Topic모델을 수행하기 위해서는 Dictionary, Corpus 그리고 이 두가지를 이용한 Model이 필요하다.

  • Gensim은 먼저 토큰화 결과로부터 토큰과 gendim모듈이 내부적으로 사용하는 id를 매칭하는 사전을 생성: Dictionary 클래스 사용
  • filter_extremes() 메소드에서, 사이킷런의 max_features에 해당하는 keep_n인수, min_df에 해당하는 no_below, max_df에 해당하는 no_above인수를 이용해 특성을 선택
  • doc2bow()메소드로 토큰화된 결과를 카운트 벡터, 즉 BOW형태로 변환
  • Gensim에서 LDA 모델을 수행하는 클래스인 LdaModel 시행
  • num_topics : 토픽의 수
  • id2word : Dictionary를 의미
  • passes : 사이킷런의 max_iter와 같다고 보면 됨, 학습하는 횟수를 지정한다.
  • 더욱 정확한 내용은 GENSIM 공식 싸이트를 확인하는 것이 좋다.
from gensim.corpora.dictionary import Dictionary
from gensim.models import LdaModel

# 토큰화 결과로부터 dictionay 생성
dictionary = Dictionary(sentences_list_word)
print('#Number of initial unique words in documents:', len(dictionary))

# 문서 빈도수가 너무 적거나 높은 단어를 필터링하고 특성을 단어의 빈도 순으로 선택
dictionary.filter_extremes(keep_n=2000, no_below=5, no_above=0.5)
print('#Number of unique words after removing rare and common words:', len(dictionary))

# 카운트 벡터로 변환
corpus = [dictionary.doc2bow(text) for text in sentences_list_word]
print('#Number of unique tokens: %d' % len(dictionary))
print('#Number of documents: %d' % len(corpus))

num_topics = 10
passes = 5
%time model = LdaModel(corpus=corpus,id2word=dictionary,passes=passes,num_topics=num_topics,random_state=7)

3. 토픽의 수 결정

3-1.혼란도(혼잡도)-Perplexity

  • 확률 모형이 실제로 관측되는 값을 얼마나 유사하게 예측해내는지를 평가할 때 사용한다.
  • 문서 집합을 얼마나 유사하게 생성할수 있는지 나타낸다고 해석 가능
  • 값이 작을수록 좋다.

3-2.응집도-Cohence

  • 각 토픽에서 상위 비중을 차지하는 단어들이 의미적으로 유사한지를 나타내는 척도
  • 만일 토픽이 단일 주제를 잘 표현한다면 의미적으로 유사한 단어들의 비중이 높을 것이라는 가정에 성능을 표현한다.
  • 값이 클수록 좋다.

아래와 같이 Perplexity는 토픽수가 10인 경우, Coherence는 6이 좋은 경우는 어떻게 해야 할까? 적정선에 대한 토픽은 분석가에 의해 결정된다 할 수 있다. 이런 이유로, 두가지 지표는 좋은 참고용으로 삼고 실제적으로 결과로 도출된 토픽의 내용을 확인할 필요가 있다.

토픽모델링 혼잡도 결과 예시
토픽모델링 응집도 결과 예시

4.Github 코드 확인하기

Read more

Recent Information