✅ 1. TF-IDF (Term Frequency-Inverse Document Frequency)
📌 무엇인가요?
- 단어의 중요도를 수치화하는 방식이에요.
- 전체 문서 중 특정 단어가 자주 나오지만 흔하지 않으면 중요하다고 판단합니다.
💡 직관적 이해
TF: 문서 내 얼마나 자주 나왔는가
IDF: 다른 문서에도 흔하게 나왔는가? → 흔하면 중요하지 않음
📘 예시
| 단어 | TF | IDF | TF-IDF |
|---|
| "안녕" | 5회 | 전체 문서에 다 있음 → 낮음 | 낮음 |
| "헬스장예약" | 2회 | 특정 문서에서만 → 높음 | 높음 ✅ |
✅ 쓰는 목적
- 키워드 추출, 검색엔진, 문서 유사도 계산, 요약
- TF-IDF 점수가 높은 단어는 그 문서의 대표 키워드로 간주
✅ 기본 전처리 + TF-IDF 기반 주제 키워드 추출
해당 코드 사용 x : 주제를 뽑아내는 것보다 정말, 우리, 여기 등 빈도가 높은 단어를 추출해버림.
from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Okt
import pandas as pd
okt = Okt()
def extract_nouns(text):
try:
return ' '.join(okt.nouns(str(text)))
except:
return ''
train_texts = train_df['dialogue'].apply(extract_nouns)
vectorizer = TfidfVectorizer(max_features=1000, ngram_range=(1,1))
tfidf_matrix = vectorizer.fit_transform(train_texts)
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)
print("📌 TF-IDF 기반 상위 30개 키워드:")
display(top_30_keywords)
✅ 2. LDA (Latent Dirichlet Allocation)
📌 무엇인가요?
- 문서 집합 안에 숨겨진 "주제들"을 자동으로 찾는 알고리즘입니다.
- 주어진 텍스트들로부터 각 문서가 어떤 주제들로 구성되어 있는지 추정합니다.
💡 직관적 이해
- "뉴스 기사 100개를 넣으면, 정치/스포츠/연예 주제를 자동으로 분류해주는 것
- 각 문서는 여러 주제를 섞어서 구성돼 있을 수 있음
📘 예시
| 문서 | 주제1(스포츠) | 주제2(경제) | 주제3(헬스) |
|---|
| 문서A | 80% | 15% | 5% |
| 문서B | 10% | 85% | 5% |
→ 주제별 단어 분포도 함께 추출됩니다.
✅ 쓰는 목적
🔍 차이 요약
| 항목 | TF-IDF | LDA |
|---|
| 단위 | 단어 중심 | 주제(topic) 중심 |
| 결과 | 문서마다 중요 단어 | 문서마다 주제 분포 |
| 사용 용도 | 키워드 추출, 요약 | 주제 모델링, 클러스터링 |
| 학습 방식 | 통계 기반 (비지도) | 확률 모델 기반 (비지도) |
| 직관성 | 높음 | 낮지만 강력 |
✅ 선택지 1: TF-IDF + KMeans 클러스터링
📌 핵심 아이디어
- topic 문자열을 TF-IDF 벡터로 바꾼 뒤
- KMeans로 주제들을 n개 클러스터로 나눔
💡 장점
- 빠르고 간단
- clustering 후 대표 키워드로 각 그룹 해석 가능
✅ 선택지 2: Sentence-BERT + KMeans (or UMAP + HDBSCAN)
📌 핵심 아이디어
topic을 문장 임베딩 (의미 기반)으로 바꿔서
- 거리 기반으로 비슷한 주제를 그룹화
💡 장점
- 의미 기반 클러스터링 가능
"건강검진"과 "백신 접종"처럼 의미는 유사하지만 단어가 다를 경우도 묶임
topic으로만? summary or dialogue 같이 사용?
| 기준 | topic + dialogue | topic + summary |
|---|
| 내용 양 | 길고 풍부함 | 짧고 간결함 |
| 중심성 | 주변 맥락 포함 (노이즈 포함 가능) | 핵심 정보만 담김 (요약된 내용) ✅ |
| 정보량 | redundancy 있음 | 정보 압축됨 |
| 임베딩 효과 | 다양성은 높지만 주제 흐림 가능 | 주제 중심으로 클러스터링 유리 ✅ |
| 실행 속도 | 느림 (문장 길이 길음) | 빠름 |