[NLP] 0-4. 주제 분석을 위해 사용되는 LDA / TF-IDF

Paper2Code·2025년 8월 7일

NLP Project

목록 보기
5/12
post-thumbnail

✅ 1. TF-IDF (Term Frequency-Inverse Document Frequency)

📌 무엇인가요?

  • 단어의 중요도를 수치화하는 방식이에요.
  • 전체 문서 중 특정 단어가 자주 나오지만 흔하지 않으면 중요하다고 판단합니다.

💡 직관적 이해

TF: 문서 내 얼마나 자주 나왔는가
IDF: 다른 문서에도 흔하게 나왔는가? → 흔하면 중요하지 않음

📘 예시

단어TFIDFTF-IDF
"안녕"5회전체 문서에 다 있음 → 낮음낮음
"헬스장예약"2회특정 문서에서만 → 높음높음

✅ 쓰는 목적

  • 키워드 추출, 검색엔진, 문서 유사도 계산, 요약
  • TF-IDF 점수가 높은 단어는 그 문서의 대표 키워드로 간주

✅ 기본 전처리 + TF-IDF 기반 주제 키워드 추출

해당 코드 사용 x : 주제를 뽑아내는 것보다 정말, 우리, 여기 등 빈도가 높은 단어를 추출해버림.

from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Okt
import pandas as pd

# 1. 명사 추출 함수 (Okt)
okt = Okt()
def extract_nouns(text):
    try:
        return ' '.join(okt.nouns(str(text)))
    except:
        return ''

# 2. 전체 대화 대상: train 데이터만 사용
train_texts = train_df['dialogue'].apply(extract_nouns)

# 3. TF-IDF 벡터라이저 (명사 기반)
vectorizer = TfidfVectorizer(max_features=1000, ngram_range=(1,1))
tfidf_matrix = vectorizer.fit_transform(train_texts)

# 4. 상위 30개 키워드 추출
tfidf_scores = pd.DataFrame({
    'term': vectorizer.get_feature_names_out(),
    'score': tfidf_matrix.sum(axis=0).A1
})
top_30_keywords = tfidf_scores.sort_values(by='score', ascending=False).head(30).reset_index(drop=True)

# display()로 상위 30개 키워드 출력
print("📌 TF-IDF 기반 상위 30개 키워드:")
display(top_30_keywords) # 또는 print(top_30_keywords.head(30))

✅ 2. LDA (Latent Dirichlet Allocation)

📌 무엇인가요?

  • 문서 집합 안에 숨겨진 "주제들"을 자동으로 찾는 알고리즘입니다.
  • 주어진 텍스트들로부터 각 문서가 어떤 주제들로 구성되어 있는지 추정합니다.

💡 직관적 이해

  • "뉴스 기사 100개를 넣으면, 정치/스포츠/연예 주제를 자동으로 분류해주는 것
  • 각 문서는 여러 주제를 섞어서 구성돼 있을 수 있음

📘 예시

문서주제1(스포츠)주제2(경제)주제3(헬스)
문서A80%15%5%
문서B10%85%5%

→ 주제별 단어 분포도 함께 추출됩니다.

✅ 쓰는 목적

  • 문서 분류, 토픽 시각화, 주제별 클러스터링
  • 뉴스, 블로그, 대화 등에서 주제 흐름 파악

🔍 차이 요약

항목TF-IDFLDA
단위단어 중심주제(topic) 중심
결과문서마다 중요 단어문서마다 주제 분포
사용 용도키워드 추출, 요약주제 모델링, 클러스터링
학습 방식통계 기반 (비지도)확률 모델 기반 (비지도)
직관성높음낮지만 강력

✅ 선택지 1: TF-IDF + KMeans 클러스터링

📌 핵심 아이디어

  • topic 문자열을 TF-IDF 벡터로 바꾼 뒤
  • KMeans로 주제들을 n개 클러스터로 나눔

💡 장점

  • 빠르고 간단
  • clustering 후 대표 키워드로 각 그룹 해석 가능

✅ 선택지 2: Sentence-BERT + KMeans (or UMAP + HDBSCAN)

📌 핵심 아이디어

  • topic을 문장 임베딩 (의미 기반)으로 바꿔서
  • 거리 기반으로 비슷한 주제를 그룹화

💡 장점

  • 의미 기반 클러스터링 가능
  • "건강검진""백신 접종"처럼 의미는 유사하지만 단어가 다를 경우도 묶임

topic으로만? summary or dialogue 같이 사용?

기준topic + dialoguetopic + summary
내용 양길고 풍부함짧고 간결함
중심성주변 맥락 포함 (노이즈 포함 가능)핵심 정보만 담김 (요약된 내용) ✅
정보량redundancy 있음정보 압축됨
임베딩 효과다양성은 높지만 주제 흐림 가능주제 중심으로 클러스터링 유리 ✅
실행 속도느림 (문장 길이 길음)빠름
profile
As I Imagine | 이론 정리 사이트 Tistory 링크 참조 ↓ 홈 아이콘 클릭)

0개의 댓글