[텍스트분석] 토픽 모델링
토픽모델링(Topic Modeling)
문서 집합에서 숨겨진 주제를 자동으로 추출하는 기법
지도학습/비지도학습 있으나 주로 비지도학습을 사용하며, 주제별로 요약하거나 문서간의 유사성을
분석할때 활용
<비지도학습>
LDA(Latent Dirichlet Allocation)
문서를 주제의 혼합으로 주제를 단어의 혼합으로 가정하는 확률적 모델
문서> 주제> 단어라는 계층적 구조를 따름
각 문서는 다수의 주제에 속할 수 있으며, 각 주제는 단어 집합의 분포로 표현
LDA는 문서에서 단어가 생성되는 과정을 확률적으로 추정하여 주제를 발견
정리해서 말하면,
- 문서는 여러 주제의 혼합물:
- 각 문서는 여러 주제(topic)에 속할 수 있으며, 주제별로 가중치를 가짐.
- 주제는 단어의 확률 분포:
- 각 주제는 특정 단어들에 대한 확률 분포를 가짐.
- 단어는 주제에서 샘플링된 결과:
- 문서의 각 단어는 해당 문서의 주제 분포에서 주제를 선택한 후, 그 주제에서 단어를 샘플링한 결과로 간주.
LDA(Latent Dirichlet Allocation) 기본절차
1. 문서 전처리 : 불용어제거, 소문자 변환, 토큰화 등의 작업 수행.
2. 토픽 수 결정 : 분석 목표에 따라 미리 정의하거나, 평가 지표를 활용하여 최적의 토픽 수를 선택
3. LDA 모델 학습 : 각 문서에 대해 주제 분포와 단어 분포를 추정
4. 결과 해석 : 각 주제에 속한 주요 단어와 문서별 주제 분포를 분석
*토픽 수 결정하는방법
-직관적 판단
-Perplexity : 모델의 예측 정확성을 평가 (값이 낮을수록 좋음)
-Coherence Score : 토픽 내 단어간의 일관성을 측정 (값이 높을수록 측정)
LDA(Latent Dirichlet Allocation) 모델 및 시각화 코드
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import pyLDAvis
import pyLDAvis.sklearn
# 예제 데이터
documents = [
"I love reading books about machine learning.",
"Data science is a growing field with exciting opportunities.",
"Deep learning is a subset of machine learning.",
"Natural language processing is a fascinating topic.",
"I enjoy reading about artificial intelligence."
]
# 문서 벡터화
vectorizer = CountVectorizer(stop_words='english')
doc_term_matrix = vectorizer.fit_transform(documents)
# LDA 모델 학습
n_topics = 3
lda_model = LatentDirichletAllocation(n_components=n_topics, random_state=42)
lda_model.fit(doc_term_matrix)
# pyLDAvis 시각화
panel = pyLDAvis.sklearn.prepare(lda_model, doc_term_matrix, vectorizer, mds='tsne')
pyLDAvis.display(panel)
BERTopic
BERT 임베딩과 군집화를 결합한 최신 토픽 모델링 방법
1. 문서 임베딩 생성
사전 학습된 언어모델을 사용하여 문장을 벡터화
각 문장을 고차원 임베딩 공간으로 변환
*임베딩 : 고차원 데이터를 저차원의 연속공간으로 변환하는 기법
2. 차원 축소(UMAP)
UMAP(Unified Mainfold Approximation and Projection)을 사용해 고차원 임베딩을 2~5차원으로 축소
문서간의 거리를 유지하면서 시각화와 군집화를 용이하게 만듦
*UMAP : 군집 구조 보존력이 뛰어난 차원 축소 기법
3. 군집화(HDBSCAN)
HDBSCAN을 사용하여 문서를 군집화
군집 크기와 밀도 기반으로 토픽을 형성
*HDBSCAN : 밀도기반 클러스터링 알고리즘(추후정리)
4. 토픽 표현
각 군집의 주요 단어를 분석하여 해당 군집을 대표하는 토픽을 생성
BERTopic Python 코드
from bertopic import BERTopic
# 예제 데이터
documents = [
"I love reading books about machine learning.",
"Data science is a growing field with exciting opportunities.",
"Deep learning is a subset of machine learning.",
"Natural language processing is a fascinating topic.",
"I enjoy reading about artificial intelligence."
]
# BERTopic 모델 생성 및 학습
topic_model = BERTopic()
topics, probs = topic_model.fit_transform(documents)
# 토픽 정보 확인
print(topic_model.get_topic_info())
# 토픽 시각화
topic_model.visualize_topics()
<지도학습>
지도학습을 사용하는 이유
특정 토픽이나 주제에 대한 사전 정보를 반영하고 싶을때
문서가 사전에 정의된 주제로 분류되어 있을때
예측 모델을 학습하면서 주제와 문서간의 관계를 동시에 학습하려고 할때
sLDA(Supervised Latent Dirichlet Allocation)
- LDA를 확장한 모델로, 문서의 토픽 분포와 함께 문서 수준의 레이블을 학습
- 문서의 레이블을 활용해 각 토픽이 레이블과 연관되는 정도를 학습
L-LDA(Labelled Latent Dirichlet Allocation)
- 각 문서가 하나 이상의 사전 정의된 레이블을 가지고 있을때 LDA를 확장하여 레이블 정보를 반영
- 각 토픽이 특정 레이블에 매핑되므로 해석이 명확