📌 TF-IDF (Term Frequency – Inverse Document Frequency)란?
TF-IDF는 문서 내 단어의 중요도를 평가하는 대표적인 방법입니다. 특정 단어가 문서에서 얼마나 중요한지를 수치화하여, 문서 간 유사도를 측정하거나 검색 엔진에서 검색 결과를 랭킹하는 데 사용됩니다.
1️⃣ 개념 정리
(1) TF (Term Frequency, 단어 빈도)
문서 내에서 특정 단어가 등장하는 빈도를 나타냅니다.TF(t,d)=f(t,d)NTF(t, d) = \frac{f(t, d)}{N}TF(t,d)=Nf(t,d)
- f(t,d)f(t, d)f(t,d) : 특정 문서 ddd에서 단어 ttt의 등장 횟수
- NNN : 문서 ddd에 등장하는 모든 단어의 총 개수
✅ TF의 의미: 자주 등장하는 단어일수록 해당 문서에서 중요하게 사용될 가능성이 높음.
(2) IDF (Inverse Document Frequency, 역문서 빈도)
해당 단어가 여러 문서에서 등장하는 정도를 조정하는 계수입니다. 너무 많은 문서에서 등장하는 단어(예: “the”, “is”, “and” 같은 불용어)는 정보 가치가 낮기 때문에 이를 반영하여 가중치를 낮춥니다.IDF(t)=log(D1+df(t))IDF(t) = \log \left(\frac{D}{1 + df(t)}\right)IDF(t)=log(1+df(t)D)
- DDD : 전체 문서 개수
- df(t)df(t)df(t) : 단어 ttt가 등장한 문서 개수
✅ IDF의 의미: 특정 문서에서만 등장하는 단어일수록(희귀할수록) 더 높은 가중치를 부여.
(3) TF-IDF 공식
TF와 IDF를 곱한 값이 해당 단어의 최종 중요도 점수가 됩니다.TF−IDF(t,d)=TF(t,d)×IDF(t)TF-IDF(t, d) = TF(t, d) \times IDF(t)TF−IDF(t,d)=TF(t,d)×IDF(t)
✅ TF-IDF의 의미:
- 특정 문서에서 자주 등장하지만, 전체 문서에서는 드물게 등장하는 단어의 점수가 높음.
- 문서 전체에서 흔한 단어(“the”, “is”, “and”)는 자동으로 가중치가 낮아짐.
2️⃣ Python을 활용한 TF-IDF 계산(1) Scikit-learn을 활용한 TF-IDF 벡터화
from sklearn.feature_extraction.text import TfidfVectorizer
# 샘플 문서
documents = [
"I love machine learning. Machine learning is amazing.",
"Natural language processing is a part of AI.",
"Deep learning advances AI and machine learning."
]
# TF-IDF 변환기 생성
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
# 단어 목록 출력
print("TF-IDF 단어 목록:", vectorizer.get_feature_names_out())
# 각 문서의 TF-IDF 값 출력
print("TF-IDF 행렬:\n", tfidf_matrix.toarray())
✅ 설명:
TfidfVectorizer()를 사용해 문서를 벡터로 변환.fit_transform()을 통해 TF-IDF 값을 계산.toarray()를 이용해 변환된 행렬을 출력.
(2) 특정 단어의 TF-IDF 값 확인
import pandas as pd
# TF-IDF 결과를 데이터프레임으로 변환
df = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names_out())
print(df)
📌 출력 예시
| ai | advances | amazing | deep | is | learning | love | machine | natural | part | processing | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 문서 1 | 0 | 0 | 0.52 | 0 | 0 | 0.37 | 0.52 | 0.37 | 0 | 0 | 0 |
| 문서 2 | 0.42 | 0 | 0 | 0 | 0.42 | 0 | 0 | 0 | 0.42 | 0.42 | 0.42 |
| 문서 3 | 0.33 | 0.46 | 0 | 0.46 | 0 | 0.33 | 0 | 0.33 | 0 | 0 | 0 |
✅ 설명:
- 특정 단어(예: “machine”)가 특정 문서에서 얼마나 중요한지를 수치로 확인 가능.
- 문서마다 단어의 가중치가 다르게 부여됨.
(3) 코사인 유사도를 이용한 문서 비교
TF-IDF 벡터를 사용하면 문서 간 유사도를 측정할 수도 있습니다.
from sklearn.metrics.pairwise import cosine_similarity
# 문서 간 코사인 유사도 계산
cos_sim = cosine_similarity(tfidf_matrix)
print("문서 간 코사인 유사도:\n", cos_sim)
✅ 출력 예시
문서 간 코사인 유사도:
[[1. 0.118 0.529]
[0.118 1. 0.206]
[0.529 0.206 1. ]]
✅ 설명:
cosine_similarity()를 이용해 문서 간 유사도를 측정.- 1에 가까울수록 유사한 문서, 0에 가까울수록 연관성이 낮음.
3️⃣ TF-IDF의 장점과 단점
✅ 장점
- 불필요한 단어 가중치 감소: “the”, “is”, “and” 같은 불용어의 영향력을 자동으로 낮춤.
- 문서 내 중요한 단어 강조: 특정 문서에서만 자주 등장하는 단어의 가중치를 높게 부여.
- 간단하고 효율적: 계산이 빠르고 문서 검색, 문서 비교 등의 다양한 NLP 작업에 사용 가능.
❌ 단점
- 문맥 정보 부족: TF-IDF는 단어의 순서나 의미를 고려하지 않음. (예: “apple”과 “fruit”의 관계를 인식 못함)
- 희귀 단어 가중치 문제: 너무 드문 단어는 필요 이상으로 높은 가중치를 받을 수 있음.
- 데이터 크기에 민감: 문서 개수가 증가하면 IDF 계산이 변화하여 가중치가 변할 수 있음.
📌 TF-IDF vs 다른 NLP 기법 비교
| 기법 | 설명 | 장점 | 단점 |
|---|---|---|---|
| TF-IDF | 단어 빈도 기반 가중치 부여 | 빠르고 간단함 | 문맥 고려 X |
| Word2Vec | 단어의 의미를 벡터로 변환 | 의미적 관계 반영 가능 | 문장 전체 분석 어려움 |
| BERT | 문장 단위의 의미 학습 | 문맥을 고려한 의미 분석 가능 | 모델이 크고 느림 |
✅ TF-IDF는 빠르고 효율적이지만, 단어 간 의미를 반영하지 못하므로 Word2Vec, BERT 같은 방법과 함께 사용하면 더욱 정교한 NLP 분석이 가능!
🚀 TF-IDF 활용 예시
✔ 검색 엔진: 검색어와 문서 간 유사도를 계산하여 결과 정렬
✔ 문서 분류: 뉴스, 이메일, 리뷰 등의 자동 분류
✔ 스팸 필터링: 스팸 메일과 정상 메일의 TF-IDF 패턴을 비교하여 분류
✔ 감정 분석: 텍스트에서 긍정/부정 키워드의 중요도 분석
✅ 결론
- TF-IDF는 단어 중요도 측정 및 문서 비교를 위한 기본적인 방법.
- 빠르고 간단하며, 검색 엔진, 추천 시스템, 문서 분류 등 다양한 곳에서 사용됨.
- 문맥을 고려하지 못하므로, Word2Vec, BERT 같은 기법과 함께 활용하면 더욱 정교한 분석 가능.