TF-IDF: 단어 하나의 중요도를 수치로 바꾸는 검색·분류의 기초 공식

TF-IDF의 단어 빈도·역문서 빈도 계산법, 검색엔진·문서분류·추천시스템 적용 사례와 BM25·LSI·LDA 확장 기법, 실무 적용 시 고려사항을 정리한다.

2026-08-13 · 최초 발행 2025-05-23

텍스트 마이닝과 정보 검색 분야에서 가장 기본적이면서도 강력한 기법인 TF-IDF는 문서 집합 내에서 특정 단어의 중요도를 수치화하는 방법론이다. 단순한 계산이지만 문서의 특징을 벡터 공간에 효과적으로 표현할 수 있어, 검색엔진의 문서 랭킹부터 문서 분류, 클러스터링에 이르기까지 다양한 응용 분야에서 활용된다.

자주 나오지만 흔하지는 않은 단어를 찾는 공식

TF-IDF는 두 가지 핵심 개념의 결합으로 이루어진다.

  1. 단어 빈도(Term Frequency, TF): 특정 문서 내에서 단어가 등장하는 빈도
  2. 역문서 빈도(Inverse Document Frequency, IDF): 전체 문서 집합에서 해당 단어가 등장하는 문서의 수에 반비례하는 값

이 두 값의 곱으로 계산되는 TF-IDF는 문서 내에서 자주 등장하는 단어일수록 높은 TF 값을, 전체 문서 집합에서 희소하게 나타나는 단어일수록 높은 IDF 값을 가진다. 결과적으로 특정 문서에서는 자주 등장하지만 전체 문서 집합에서는 드물게 나타나는 단어가 높은 TF-IDF 값을 갖게 된다.

TF와 IDF, 그리고 최종 점수를 계산하는 법

TF는 문서 내 특정 단어의 출현 빈도를 나타낸다. 가장 기본적인 방식은 다음과 같다.

TF(t,d) = (문서 d 내 단어 t의 출현 횟수) / (문서 d의 총 단어 수)

정규화 없이 단순히 출현 횟수만 사용하기도 한다.

TF(t,d) = 문서 d 내 단어 t의 출현 횟수

로그 스케일을 적용한 변형도 자주 쓰인다.

TF(t,d) = 1 + log(문서 d 내 단어 t의 출현 횟수)

IDF는 특정 단어가 전체 문서 집합에서 얼마나 희소한지를 측정한다.

IDF(t) = log(전체 문서 수 / 단어 t가 등장하는 문서 수)

0으로 나누는 오류를 방지하기 위해 분모에 1을 더하는 방식도 흔히 쓰인다.

IDF(t) = log(전체 문서 수 / (단어 t가 등장하는 문서 수 + 1)) + 1

최종 TF-IDF 값은 두 값의 곱으로 계산된다.

TF-IDF(t,d) = TF(t,d) × IDF(t)

검색·분류·추천이 이 점수를 쓰는 방식

검색엔진에서 TF-IDF는 쿼리와 문서 간의 관련성을 평가하는 기본 알고리즘으로 활용된다. 사용자가 검색어를 입력하면 각 문서에 대해 검색어 단어들의 TF-IDF 값을 계산하고, 그 값을 기준으로 문서 순위를 결정해 높은 순위의 문서부터 제시한다. 구글의 초기 PageRank 알고리즘도 TF-IDF를 기반으로 한 랭킹 시스템을 활용했다.

문서 분류·감성 분석에서는 TF-IDF가 기계학습 모델의 입력 특성으로 쓰인다. 학습 데이터의 각 문서를 TF-IDF 벡터로 변환하고, 이를 기반으로 SVM·나이브 베이즈·랜덤 포레스트 등의 분류 모델을 학습시킨 뒤, 새로운 문서도 같은 방식으로 벡터화해 분류한다. 이메일 스팸 필터링에서 'viagra', 'lottery', 'winner' 같은 단어는 스팸 메일에서 높은 TF-IDF 값을 가질 가능성이 크다는 게 대표적인 예다.

콘텐츠 추천 시스템에서는 사용자 프로필과 콘텐츠 사이의 유사도를 계산하는 데도 TF-IDF가 쓰인다. 콘텐츠와 사용자의 관심사·이전 소비 콘텐츠를 모두 TF-IDF 벡터로 표현한 뒤 코사인 유사도 등으로 유사도를 계산하고, 높은 유사도를 가진 콘텐츠를 우선 추천한다. 넷플릭스나 아마존 같은 서비스의 초기 추천 시스템에서 이런 접근 방식이 쓰였다.

코드로 보는 구현

파이썬과 scikit-learn 라이브러리를 활용한 TF-IDF 구현 예시다.

from sklearn.feature_extraction.text import TfidfVectorizer

# 예시 문서 집합
corpus = [
    "TF-IDF는 정보 검색과 텍스트 마이닝에서 사용되는 가중치입니다.",
    "이 가중치는 문서 내 단어의 중요도를 평가합니다.",
    "단어 빈도와 역문서 빈도의 곱으로 계산됩니다.",
    "TF-IDF는 검색 엔진과 추천 시스템에서 널리 활용됩니다."
]

# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

# 단어 사전 확인
print("Feature names:", vectorizer.get_feature_names_out())

# TF-IDF 행렬 출력
print("TF-IDF Matrix:")
print(X.toarray())

문서-단어 행렬에서 TF-IDF 변환 과정을 정리하면 다음과 같은 흐름이다.

문서 집합토큰화 정제단어 빈도 계산TF역문서 빈도 계산IDFTF-IDF 행렬 생성문서 벡터 표현검색 엔진문서 분류클러스터링정보 추출

이 공식이 놓치는 것들

TF-IDF는 강력한 기법이지만 몇 가지 한계가 있다.

  1. 단어 순서 무시: Bag-of-Words 모델에 기반하므로 단어의 순서나 문맥을 고려하지 못함
  2. 의미론적 유사성 미반영: '자동차'와 '차량'처럼 의미적으로 유사한 단어를 연결하지 못함
  3. 희소 행렬 문제: 대규모 문서 집합에서는 매우 희소한(sparse) 행렬이 생성되어 계산 효율성 문제 발생
  4. 새로운 단어 처리 어려움: 학습 시 보지 못한 단어(OOV, Out-of-Vocabulary)를 처리하기 어려움

이런 한계를 극복하기 위해 Word2Vec, GloVe, BERT 같은 단어 임베딩 기법들이 등장했지만, TF-IDF는 여전히 간결함과 효율성 때문에 많은 응용 분야에서 쓰이고 있다.

BM25·LSI·LDA로 이어지는 확장

BM25(Best Matching 25)는 TF-IDF의 개선된 형태로, 문서 길이와 단어 빈도의 포화 효과를 고려한 랭킹 함수다.

BM25(d,q) = Σ(IDF(t) × (TF(t,d) × (k1 + 1)) / (TF(t,d) + k1 × (1 - b + b × |d|/avgdl)))

여기서 k1과 b는 조정 가능한 파라미터이고, |d|는 문서 d의 길이, avgdl은 평균 문서 길이다.

LSI(Latent Semantic Indexing)는 TF-IDF 행렬에 SVD(Singular Value Decomposition)를 적용해 차원을 축소하고 숨겨진 의미론적 구조를 발견하는 기법이다.

TF-IDF 행렬SVD 적용저차원 의미 공간의미적 유사성 계산

LDA(Latent Dirichlet Allocation)는 문서의 토픽 분포와 토픽의 단어 분포를 학습하는 확률적 모델이다. TF-IDF와 함께 사용해 문서의 토픽을 모델링할 수 있다.

실무에 적용할 때 챙겨야 할 것들

전처리 과정에서는 불용어(stopwords) 제거, 어간 추출(stemming) 또는 표제어 추출(lemmatization), n-gram 적용 여부를 결정해야 한다. TF-IDF 변형을 고를 때는 로그 스케일 TF, 스무딩된 IDF, BM25 등의 고급 변형 중 무엇을 쓸지 판단이 필요하다. 특징 선택(feature selection)이나 LSI·PCA 적용으로 차원 축소가 필요한지도 검토 대상이다. 도메인별로 중요 용어에 가중치를 부여하거나 전문 용어 사전을 활용하는 도메인 특화 조정도 고려해야 한다.

여전히 쓰이는 이유

TF-IDF는 텍스트 데이터 처리의 기본이지만 강력한 도구로, 복잡한 딥러닝 모델이 등장한 지금도 여전히 많은 시스템에서 쓰이고 있다. 단순함과 해석 가능성, 계산 효율성이 실무에서 큰 장점이 되기 때문이다. 최신 텍스트 처리 기술과 결합하면 더 강력한 성능을 발휘할 수 있고, 정보 검색과 텍스트 마이닝의 기본 개념을 이해하는 데 필수적인 알고리즘이다.

TF-IDF텍스트마이닝정보검색문서벡터화자연어처리