TF-IDF 완벽 정리|개념, 계산법, 알고리즘, 키워드 추출까지

1. TF-IDF란 무엇인가?
· Term Frequency와 Inverse Document Frequency의 뜻
TF(Term Frequency): 문서 d에서 단어 t가 얼마나 자주 등장하는가. 빈도 기반 가중치예요.
IDF(Inverse Document Frequency): 코퍼스 전체에서 단어 t가 얼마나 희귀한가. 모두가 쓰는 흔한 단어는 점수를 낮추고, 특정 문서에만 자주 나오는 단어는 점수를 높여요.
· TF-IDF의 등장 배경과 목적
정보 검색(IR)과 문서 검색에서 “그 문서만의 특징어”를 찾아 가중치를 주기 위해 탄생했습니다. 검색엔진이 쿼리와 문서의 관련성 점수를 계산하거나, 문서 요약·키워드 추출·유사문서 검색에 널리 쓰입니다.
2. TF-IDF 계산 원리
· 공식 및 계산 과정
가장 보편적인 정의는 다음과 같습니다.
tf(t,d)=\mathrm{tf}(t,d) =tf(t,d)= 문서 d에서 단어 t의 등장 횟수(또는 정규화된 빈도)
idf(t,D)=logN1+nt+1\mathrm{idf}(t,D) = \log\frac{N}{1 + n_t} + 1idf(t,D)=log1+ntN+1
NNN: 전체 문서 수, ntn_tnt: t가 등장한 문서 수
분모에 1을 더해 제로디비전을 피하고, +1은 음수 방지를 위한 스무딩
tfidf(t,d,D)=tf(t,d)×idf(t,D)\mathrm{tfidf}(t,d,D) = \mathrm{tf}(t,d) \times \mathrm{idf}(t,D)tfidf(t,d,D)=tf(t,d)×idf(t,D)
현업에서는 서브리니어 TF( 1+log(tf)1+\log(\mathrm{tf})1+log(tf) )나 L2 정규화로 문서 길이 차이를 보정합니다.
· 수학적 의미 해석
TF는 “문서 내부의 중요도”, IDF는 “코퍼스 전체에서의 차별성”을 뜻합니다. 두 요소의 곱은 자주 나오면서도 드문 단어를 강조해, 문서의 핵심 주제를 잘 드러내요.
· 간단한 예제 계산
코퍼스 1,000문서 중 ‘온보딩’이 20문서에서 등장 ⇒ idf=log(1000/21)+1≈4.86\mathrm{idf}=\log(1000/21)+1 \approx 4.86idf=log(1000/21)+1≈4.86
특정 문서에서 ‘온보딩’이 3회 등장 ⇒ tf=3\mathrm{tf}=3tf=3
결과: TF-IDF ≈ 14.6. 같은 문서의 ‘그리고’(n=980)는 idf≈1.02\mathrm{idf}\approx 1.02idf≈1.02로 매우 낮아 총점이 작습니다.
3. TF-IDF 알고리즘 구조 이해
· TF, IDF 가중치 계산 파이프라인
전처리: 소문자화, 구두점 제거, 불용어(stopwords) 제거, 형태소 분석/어간추출
토큰화 & n-gram: 단어/바이트페어/2-gram 등 선택
TF·IDF 계산: 스무딩, 로그 스케일링, 길이 정규화
희소 벡터 생성: 문서 × 단어의 행렬(대개 수백만 차원 중 대부분이 0)
· 로그 스케일링(Log scaling) 처리 방식
문서 내 아주 많이 반복된 단어가 점수를 과도하게 끌어올리는 걸 막기 위해
tf’=1+log(tf)\mathrm{tf}’=1+\log(\mathrm{tf})tf’=1+log(tf)를 쓰면, 빈도 증가의 체감효과를 반영할 수 있습니다.
· 코사인 유사도와의 관계
TF-IDF로 문서를 벡터화한 뒤, 두 문서 벡터의 코사인 유사도
cosθ=a⃗⋅b⃗∥a⃗∥∥b⃗∥\cos\theta = \frac{\vec{a}\cdot\vec{b}}{\|\vec{a}\|\|\vec{b}\|}cosθ=∥a∥∥b∥a⋅b
를 계산하면 내용 유사도를 수치화할 수 있어요. 길이가 다른 문서도 방향(패턴)만 비교하므로 공정합니다.
4. TF-IDF 벡터화와 키워드 추출
· 벡터 공간 모델(Vector Space Model) 개념
모든 단어를 축으로 하는 고차원 공간에 각 문서를 점(벡터)으로 놓는 모델입니다. 축 값이 바로 TF-IDF 가중치이고, 문서 간 거리를 유사도로 바꿔 검색·클러스터링·분류에 활용합니다.
· TF-IDF를 활용한 키워드 추출 실습 로직
문서 집합을 준비하고 전처리.
TF-IDF 행렬을 만들고 문서별로 가중치 상위 k개 토큰을 뽑습니다.
필요하면 n-gram, 품사 필터(명사/형용사)를 걸어 노이즈를 축소합니다.
· Python 코드 예시(Scikit-learn)
from sklearn.feature_extraction.text import TfidfVectorizer
docs = [
"온보딩 문서 자동화로 작업 시간을 40% 줄였다",
"리텐션을 높이는 온보딩 메일 템플릿 가이드",
"검색엔진은 TF-IDF로 핵심 키워드를 가중한다"
]
# 불용어/형태소는 한국어 처리기와 함께 쓰면 더 좋아요.
vec = TfidfVectorizer(ngram_range=(1,2), min_df=1, max_df=0.9, sublinear_tf=True)
X = vec.fit_transform(docs) # (문서 수 × 토큰 수) 희소행렬
feature_names = vec.get_feature_names_out()
doc_idx = 0
row = X[doc_idx].toarray().ravel()
top = row.argsort()[-5:][::-1]
keywords = [(feature_names[i], round(row[i], 3)) for i in top]
print(keywords) # 문서0의 상위 키워드 5개
이렇게 뽑은 상위 토큰이 해당 문서의 대표 키워드가 됩니다. 실제 서비스에서는 사용자 검색어와 문서 벡터 간 코사인 유사도를 계산해 랭킹 점수에 반영합니다.
5. TF-IDF의 한계와 대안
· 문맥 정보 반영의 한계
TF-IDF는 Bag-of-Words 가정(단어 순서·문맥을 무시)을 씁니다. ‘은행(금융) vs 은행(나무)’처럼 동형이의어 구분이 어렵고, ‘자동차/차량’ 같은 동의어도 별개로 취급합니다. 드문 단어를 과대평가하거나, 긴 문서에서 주제가 여러 개일 때 희석되기도 해요.
· Word2Vec, BERT 등과의 비교
Word2Vec/fastText: 단어를 의미 공간의 밀집벡터로 표현해 유사어를 잘 포착합니다.
BERT류 임베딩: 문맥을 고려한 문장·문서 임베딩으로 의미 유사도에 강함.
BM25: TF-IDF의 실전형 변종으로, 문서 길이 보정과 포화 함수를 활용해 검색 성능이 더 안정적입니다.
· TF-IDF의 활용 분야(문서 분류, 검색엔진 등)
여전히 TF-IDF는
빠른 피처링(특징 추출),
해석 가능한 키워드 기반 설명력,
대규모 코퍼스에서의 메모리/속도 효율
때문에 추천·중복문서 제거·스팸 필터·주제 분류의 베이스라인으로 매우 유용합니다. 최신 임베딩과 하이브리드(TF-IDF 선필터 → 임베딩 정밀랭킹)로 조합하면 품질과 비용을 동시에 잡을 수 있어요.
마무리 요약
TF는 “문서 내부 빈도”, IDF는 “코퍼스 희귀성”이며, 곱하면 특징적인 단어가 부각됩니다.
로그 스케일링·정규화로 문서 길이·반복 편향을 보정하고, 코사인 유사도로 유사도를 잽니다.
키워드 추출·검색·분류의 가볍고 강한 베이스라인으로 TF-IDF는 여전히 일선에서 활약합니다.
문맥 이해는 약하니 BM25·임베딩(Word2Vec·BERT)과 하이브리드 전략으로 보완하세요.