본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

AI/LLM

비슷한것들끼리 묶어서 주제를 생성하는 토픽 군집화의 전통적인 방법: LDA Latent Dirichlet Allocation. (feat.pyLDAvis)

비슷한 맥락에서 등장하는 단어들은 비슷한 의미를 가진다는 분산가설 Distributional Hypothesis 에서 출발함

“You shall know a word by the company it keeps”

Word2Vec, BERT, GPT 전부의 철학.

 

단어를 여러 축 차원에 따라 좌표로 표현하며 같은 공간에 위치한 단어들은 비슷한 뉘앙스나 시제를 가졌다고 판단함. 

유사성 측정뿐만 아니라 단어간의 관계를 수학적으로 처리가 가능해 왕 - 남자 + 여자 = 여왕 추론이 가능함. 

우리말을 벡터공간으로 변환해 의미를 숫자로 파악하고 다시 자연어로 변환하는 과정을 거침. chat gpt

 

 사람의 언어로는 약간 비슷하다 처럼 추상적이지만 컴퓨터로 10점만점에 몇점 식으로 정량적 연산을 수행할 수 있음. 

충분한 양의 고품질 데이터가 있는지 고려해야한다, 특정분야에 특화된 데이터 사용시 성능이 향상됨.

차원수가 너무 높으면 과적합과 계산 비용이 증가하고 너무 낮으면 서로 다른 단어가 같은 좌표에 묶여 의미 왜곡이 발생함

불균형한 데이터는 편향된 임베딩을 생성할 수 있으므로 전처리 품질이 중요함

 


LDA Latent Dirichlet Allocation.

단어를 백터로 바꾸진 않고 확률분포로 토픽을 생성한다.

여러단어 확률분포로 토픽, 토픽이 혼합되어 문서. Topic 1: 영화(0.3), 배우(0.2), 연기(0.15)

doc_topic = lda.transform(X)

for i, dist in enumerate(doc_topic):
    print(f"문서 {i}:", dist)
문서 0: [0.8 0.2]
문서 2: [0.1 0.9]

 

 

 

문서 - 주제 분포확인 - 주제 단어분포확인 - 주제선택 - 단어생성 순 진행

문서 수집
   ↓
토큰화 + 정제
   ↓
TF-IDF or CountVectorizer
   ↓
LDA 학습
   ↓
문서-토픽 분포 (θ)
   ↓
토픽-단어 분포 (φ)
   ↓
해석 (사람이 검토)

 

 

 

분석결과로가는 주제별로 어떤 단어들이 어떤 비율과 빈도로쓰였는지를 수치화된 키워드 묶음으로 보여준다. 

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation

# 예시 문서
docs = [
    "영화 배우 연기가 좋았다",
    "액션 영화 폭발 장면이 많다",
    "축구 경기 선수 골",
    "배우 연기 스토리가 좋다",
    "축구 팀 경기 승리"
]

# 1. BoW 벡터화 (TF-IDF 아님, Count 기반)
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(docs)

# 2. LDA 모델 학습
lda = LatentDirichletAllocation(
    n_components=2,   # 토픽 개수
    random_state=42
)
lda.fit(X)

# 3. 단어 목록
words = vectorizer.get_feature_names_out()

# 4. 토픽 출력
def print_topics(model, words, top_n=5):
    for idx, topic in enumerate(model.components_):
        print(f"\nTopic {idx}")
        print([words[i] for i in topic.argsort()[-top_n:]])

print_topics(lda, words)

 

 

주제들 간의 유사성을 2d 공간에 표현하여 가까울 수록 유사한 내용을 가룬다. intertopic Distance 결과시각화 pyLDAvis와 같은 시각도구 결과가 있다. 토픽간 유사도를 2d로 보여줌.

import pyLDAvis
import pyLDAvis.sklearn

panel = pyLDAvis.sklearn.prepare(lda, X, vectorizer)
pyLDAvis.display(panel)

 

 

 

차원이 너무 많아 주제가 잘 안나뉘는 경우 차원축소를 통해 축의 개수를 조정함.

지표를 바탕으로 사람이 직접 결과물을 검토하고 보정하는 판단 과정이 필요하며 이러한 번거로움을 해결하기 위해 현재 발전중.