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

TF-IDF, 텍스트 데이터 분석의 핵심 알고리즘입니다. 본 글에서는 TF-IDF의 정의와 계산 원리, 알고리즘 구조, 그리고 파이썬으로 구현하는 키워드 추출 예제까지 자연어 처리 초보자도 쉽게 이해할 수 있도록 정리했습니다.
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)=log⁡N1+nt+1\mathrm{idf}(t,D) = \log\frac{N}{1 + n_t} + 1idf(t,D)=log1+nt​N​+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 가중치 계산 파이프라인

  1. 전처리: 소문자화, 구두점 제거, 불용어(stopwords) 제거, 형태소 분석/어간추출

  2. 토큰화 & n-gram: 단어/바이트페어/2-gram 등 선택

  3. TF·IDF 계산: 스무딩, 로그 스케일링, 길이 정규화

  4. 희소 벡터 생성: 문서 × 단어의 행렬(대개 수백만 차원 중 대부분이 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를 활용한 키워드 추출 실습 로직

  1. 문서 집합을 준비하고 전처리.

  2. TF-IDF 행렬을 만들고 문서별로 가중치 상위 k개 토큰을 뽑습니다.

  3. 필요하면 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 선필터 → 임베딩 정밀랭킹)로 조합하면 품질과 비용을 동시에 잡을 수 있어요.


마무리 요약

  1. TF는 “문서 내부 빈도”, IDF는 “코퍼스 희귀성”이며, 곱하면 특징적인 단어가 부각됩니다.

  2. 로그 스케일링·정규화로 문서 길이·반복 편향을 보정하고, 코사인 유사도로 유사도를 잽니다.

  3. 키워드 추출·검색·분류의 가볍고 강한 베이스라인으로 TF-IDF는 여전히 일선에서 활약합니다.

  4. 문맥 이해는 약하니 BM25·임베딩(Word2Vec·BERT)과 하이브리드 전략으로 보완하세요.

Share article

0.n년차 마케터 파타과니아