TF-IDF란? AI에서 단어 빈도와 희소성으로 문서의 특징을 나타내는 방법
TL;DR
TF-IDF는 한 문서에서 단어가 나온 횟수와 여러 문서에 얼마나 널리 등장하는지를 함께 반영한 가중치입니다. 모든 문서에 흔한 단어보다 특정 문서를 구분하는 단어를 상대적으로 강조합니다. 문서 검색·분류·군집화의 숫자 입력으로 쓰며, 높은 가중치가 사실의 중요도나 정답 확률을 뜻하지는 않습니다.
핵심 3줄 요약
- 핵심 1
문서 안과 문서 모음을 함께 봅니다. TF는 해당 문서의 출현 빈도, IDF는 기준 문서 모음에서의 희소성을 반영합니다. - 핵심 2
숫자 표현을 만드는 단계입니다. 문서를 벡터로 바꾼 뒤 검색·분류 같은 작업은 별도 비교 규칙이나 모델이 맡습니다. - 핵심 3
계산 설정과 어휘표를 고정합니다. 토큰화·평활화·정규화가 달라지면 같은 문서도 다른 벡터가 됩니다.
이 글에서 다룰 내용
- TF-IDF의 한 문장 정의와 TF·DF·IDF의 뜻
- 고객 문의 세 건으로 보는 쉬운 계산 예시
- 문서-단어 행렬을 만드는 순서
- 평활화·로그 빈도·정규화 설정의 차이
- 특징 해싱·임베딩·코사인 유사도와의 구분
- 텍스트 분류와 검색에 쓰는 방법
- 한국어 토큰화·데이터 누수·희귀어의 주의점
TF-IDF를 한 문장으로 정의하면 무엇인가요?
TF-IDF는 문서별 단어 빈도에 역문서 빈도를 곱해 각 단어의 가중치를 정하는 텍스트 특징 표현 방식입니다.
영문 이름은 Term Frequency–Inverse Document Frequency입니다. 단어 빈도–역문서 빈도라고 옮깁니다. 여기서 문서는 뉴스 한 편, 고객 문의 한 건, 보고서의 한 절처럼 분석에서 정한 단위이고, 말뭉치는 이 문서들을 모은 집합입니다.
TF는 한 문서 안에서 단어가 등장한 정도를 나타냅니다. DF는 그 단어를 한 번 이상 포함한 문서의 수입니다. IDF는 DF가 작을수록 커지도록 계산한 값입니다. 한 문의에서 배송이 여러 번 나와도 DF를 셀 때 그 문의는 문서 하나로만 셉니다.
한 줄 정리: TF-IDF는 문서 안의 반복과 문서 모음 안의 흔함을 구분해서 단어에 숫자를 붙입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 세 건의 문의를 비교한다고 가정해 보겠습니다. 계산을 쉽게 보려고 문장은 미리 나눈 단어만 남깁니다. 아래 자료는 원리 설명용 예시이며 실제 고객 자료나 성능 측정값이 아닙니다.
- 첫 문서: 문의 배송 배송
- 둘째 문서: 문의 배송
- 셋째 문서: 문의 환불
문의는 세 문서 모두에 나오고, 배송은 두 문서, 환불은 한 문서에 나옵니다. 그래서 환불의 IDF가 가장 크고 문의의 IDF가 가장 작습니다. 첫 문서에서 배송의 TF는 2지만 DF는 전체 말뭉치 기준으로 2입니다. 두 값이 우연히 같아도 세는 대상은 다릅니다.
scikit-learn의 기본 평활화 공식을 적용하면 IDF는 문의 1.000, 배송 약 1.288, 환불 약 1.693입니다. 첫 문서의 정규화 전 가중치는 문의 1.000, 배송 약 2.575, 환불 0입니다. 환불이 드문 단어여도 첫 문서에 없으므로 그 문서의 가중치는 0입니다.
기본 L2 정규화까지 적용하면 첫 문서의 벡터는 문의 약 0.362, 배송 약 0.932, 환불 0이 됩니다. 앞의 숫자와 뒤의 숫자는 계산 단계가 다릅니다. 문서에서 읽은 IDF 값과 최종 벡터 값을 직접 비교하며 틀렸다고 판단하지 않습니다.
쉬운 예시: 모든 문의에 붙은 공통 표제보다 특정 문의에 집중해서 나온 단어가 구분에 더 도움이 되는지를 숫자로 보는 방식입니다.
왜 AI에서 TF-IDF가 중요한가요?
원문을 모델이 다룰 숫자 행렬로 바꿉니다
선형 분류기나 군집화 알고리즘은 보통 일정한 열 의미를 가진 숫자 입력을 받습니다. TF-IDF는 행을 문서, 열을 단어로 두고 각 칸에 가중치를 채웁니다. 문서마다 길이가 달라도 같은 어휘표를 쓰면 모든 행의 열 의미가 맞습니다.
흔한 단어의 상대적 영향을 조정합니다
단순 출현 횟수만 쓰면 어느 문서에나 반복되는 단어가 크게 보일 수 있습니다. IDF를 곱하면 여러 문서에 널리 퍼진 단어보다 드문 단어에 상대적으로 큰 배수를 줍니다. 다만 원래 빈도와 정규화까지 함께 작용하므로 흔한 단어가 언제나 가장 작은 최종값을 갖지는 않습니다.
비교하기 쉬운 기준 표현이 됩니다
scikit-learn의 공식 문서 분류 예시는 TF-IDF 희소 행렬을 여러 분류기에 넣어 비교합니다. 거대한 언어 모델을 쓰지 않고도 텍스트 분류의 출발점을 마련할 때 유용합니다. 새 방식이 좋아졌는지 판단하려면 같은 평가 자료에서 정확도와 처리 비용을 함께 봅니다.
TF-IDF는 어떤 순서로 작동하나요?
1. 문서 경계와 토큰을 정합니다
어디까지를 한 문서로 볼지 정한 뒤 문장을 단어 또는 토큰으로 나눕니다. 하나의 보고서를 여러 절로 쪼개면 문서 수와 DF가 모두 바뀔 수 있습니다. 공백·문장부호·대소문자·불용어를 처리하는 규칙도 이 단계의 일부입니다.
2. 어휘표와 출현 횟수를 만듭니다
기준 문서 모음에서 사용할 단어를 골라 열 번호를 부여하고 문서별 횟수를 셉니다. 각 문서에는 전체 어휘 중 일부만 등장하므로 대부분의 칸은 0입니다. 이때 값이 있는 위치 위주로 저장하는 희소 행렬을 쓰면 불필요한 0을 모두 저장하지 않아도 됩니다.
3. 문서 빈도로 가중치를 계산합니다
단어마다 몇 개 문서에 등장했는지 세어 IDF를 구한 다음 문서별 TF에 곱합니다. IDF 계산에 필요한 것은 문서 모음의 통계이며 분류 정답 라벨은 필요하지 않습니다. 그렇다고 데이터와 무관한 변환은 아닙니다. 기준 말뭉치가 달라지면 같은 단어의 IDF도 달라집니다.
4. 정규화한 벡터를 다음 단계에 전달합니다
필요하면 문서별 벡터 길이를 조정하고 분류기·군집화·유사도 계산에 넘깁니다. 새 문서를 처리할 때는 저장한 어휘표와 IDF를 재사용합니다. 새 요청마다 다시 학습하면 열과 가중치의 뜻이 달라져 기존 모델이 기대하는 입력과 어긋날 수 있습니다.
핵심 인사이트: TF-IDF는 정답을 예측하는 완성 모델이 아닙니다. 문서의 단어들을 어떤 숫자 좌표로 표현할지 정하는 단계입니다.
평활화와 주요 설정은 무엇을 뜻하나요?
평활화와 마지막 1을 구분합니다
scikit-learn의 기본 IDF는
log((1 + n) / (1 + df)) + 1
입니다. 여기서 n은 문서 수이고 log는 자연로그입니다.
smooth_idf=False
로 바꾸면
log(n / df) + 1
을 씁니다. 평활화를 꺼도 마지막에 더하는 1은 남습니다.
따라서 이 구현에서는 모든 문서에 등장한 단어의 IDF도 1입니다. 흔한 단어가 자동으로 삭제되지는 않습니다. 교재나 다른 도구가 제시한 식을 사용할 때는 로그의 밑, 상수와 평활화가 같은지 확인하세요. 같은 TF-IDF라는 이름 아래 여러 계산 관례가 있습니다.
빈도를 로그로 바꾸는 옵션이 있습니다
sublinear_tf=True
는 양수인 출현 횟수를
1 + log(tf)
로 바꿔 반복 횟수의 영향을 완만하게 합니다.
binary=True
는 횟수를 등장 여부로 바꾸지만 IDF와 정규화가 이어지면 최종 출력은 여전히 소수일 수 있습니다. 이름만 보고 결과가 무조건 0과 1이라고 가정하지 않습니다.
정규화와 어휘 제거는 별도입니다
기본
norm="l2"
는 0이 아닌 문서 벡터의 길이를 맞춥니다.
norm=None
은 이 정규화를 하지 않습니다.
min_df
와
max_df
는 문서 빈도에 따라 어휘를 제외하는 설정이므로 가중치를 줄이는 IDF와 역할이 다릅니다.
이 두 설정은 정수이면 문서 개수, 실수이면 문서 비율로 읽습니다. 고정 어휘표를 직접 제공하면 해당 어휘 선택 설정이 무시된다는 API 조건도 확인합니다. 범위를 잘못 정해 모든 단어를 제거하면 빈 어휘 오류가 생길 수 있습니다.
TF-IDF와 헷갈리는 용어는 무엇이 다른가요?
단어 횟수와 특징 해싱의 차이
단어 횟수는 문서 안의 반복만 셉니다. TF-IDF는 여기에 문서 모음의 통계로 계산한 배수를 적용합니다. 특징 해싱은 단어를 고정된 열에 배치하는 방법이며 그 자체로 IDF를 학습하지 않습니다. 열 위치를 정하는 규칙과 열의 가중치를 정하는 규칙을 나눠 봅니다.
의미 임베딩과 코사인 유사도의 차이
일반적인 단어 기반 TF-IDF는 단어가 다르면 별도 열로 처리하며 동의어의 의미 관계를 스스로 학습하지 않습니다. 의미 임베딩은 학습된 표현으로 다른 단어 사이의 관련성을 나타내려는 접근입니다. 두 방법 모두 벡터를 만들 수 있지만 벡터의 각 축이 뜻하는 바와 학습 방식은 다릅니다.
코사인 유사도는 이미 만든 두 벡터의 방향을 비교하는 계산입니다. TF-IDF로 문서를 표현한 뒤 코사인 유사도로 비교할 수 있습니다. 표현 방법과 비교 지표를 같은 개념으로 부르면 어떤 단계를 바꿔 성능이 달라졌는지 구분하기 어렵습니다.
분류기와 키워드 추출의 차이
분류기는 특징을 받아 정답 범주를 예측합니다. TF-IDF는 그 입력을 만들며 단독으로 배송·환불의 정답을 학습하지 않습니다. 가중치가 큰 단어를 키워드 후보로 보여 줄 수는 있지만 사람이 읽을 요약문을 생성하거나 사실의 중요도를 판정하는 기능까지 포함하지 않습니다.
실전에서는 어디에 쓰이나요?
문서 분류와 비슷한 문서 찾기
고객 문의를 유형별로 나누거나 문서의 주제를 분류할 때 TF-IDF 벡터를 분류기에 넣습니다. 검색에서는 질의와 문서를 같은 어휘 공간으로 바꾼 뒤 유사도를 비교하는 구성을 만들 수 있습니다. 같은 뜻이라도 단어가 다르면 놓칠 수 있어 실제 질의와 정답 문서로 평가합니다.
군집화와 주제 탐색의 입력
비슷한 표현이 많은 문서를 묶거나 NMF 같은 방법으로 주제 구조를 살필 때 입력 행렬로 씁니다. 군집 이름은 사람이 대표 문서와 상위 단어를 보고 붙입니다. 특정 단어의 가중치가 크다는 이유만으로 그 단어가 모든 군집 구성원의 공통 의견이라고 해석하지 않습니다.
실전 팁: 원시 횟수, 이진 등장 여부, TF-IDF를 같은 자료 분할에서 비교하세요. 짧은 글이나 특정 업무에서는 더 단순한 표현이 나을 수도 있습니다.
TF-IDF를 적용할 때 어떤 순서로 확인하나요?
1. 데이터 분할과 문서 단위를 고정합니다
학습·검증·시험 자료를 먼저 나누고 어휘표와 IDF는 학습 자료에서만 구합니다. 교차 검증에서는 각 학습 폴드 안에서 변환기를 다시 맞춥니다. 라벨을 쓰지 않는 전처리여도 전체 자료를 먼저 읽으면 평가 자료의 분포가 학습에 섞일 수 있습니다.
2. 실제 토큰과 상위 가중치를 확인합니다
한국어 샘플을 분석기에 넣어 배송, 배송이, 배송은이 어떤 토큰으로 남는지 확인합니다. 기본 토큰화가 한국어 형태소를 자동 분석한다고 가정하지 마세요. 단어 묶음이나 문자 n-그램을 후보로 비교하되 전처리 변경 때마다 어휘 수와 메모리도 함께 확인합니다.
3. 변환기와 모델을 함께 보관합니다
TfidfVectorizer
는 원문에서 어휘표와 TF-IDF를 함께 만들고
TfidfTransformer
는 이미 만든 횟수 행렬을 입력받습니다. 학습 뒤에는 어휘표·IDF·토큰화 규칙·라이브러리 버전을 모델과 함께 저장합니다. 운영에서는
transform
으로 새 입력을 바꾸고 정답이 있는 자료로 후속 성능을 점검합니다.
사용할 때 무엇을 주의해야 하나요?
드문 단어가 유용한 단어인 것은 아닙니다. 오타, 주문 번호, 이메일 주소도 드물다는 이유로 큰 IDF를 받을 수 있습니다. 상위 특징을 검토하고 개인정보와 불필요한 식별자는 목적에 맞게 제거합니다. 벡터로 바뀌었다고 원문의 민감성이 사라지지는 않습니다.
한 글자 단어와 미등록 단어를 확인합니다. scikit-learn의 기본 단어 분석은 두 글자 이상인 토큰을 고릅니다. 중요한 한 글자 표기가 빠질 수 있고 학습 어휘표에 없는 단어는 변환 때 무시됩니다. 모든 단어가 빠진 입력은 0벡터가 될 수 있으므로 빈 결과를 정상적인 의미 표현으로 취급하지 않습니다.
단어 순서와 부정 표현을 놓칠 수 있습니다. 단어별 횟수만 쓰면 문장 구조와 단어 순서 대부분을 잃습니다. n-그램으로 일부 인접 관계를 남겨도 문장 전체의 의미를 이해하는 것은 아닙니다. 표현이 비슷하지만 의미가 반대인 문장을 평가에 넣어 확인합니다.
지름길 단서가 평가를 부풀릴 수 있습니다. scikit-learn의 문서 분류 예시는 머리말·서명·인용문 같은 메타데이터가 분류를 지나치게 쉽게 만들 수 있다고 설명합니다. 실제 운영에도 남는 정보인지 확인하고 본문만으로 평가한 결과와 비교합니다. 높은 점수가 언제나 내용 이해를 뜻하지는 않습니다.
주의: TF-IDF의 숫자는 선택한 말뭉치와 계산법 안에서의 가중치입니다. 정답 확률, 신뢰도, 사실의 중요도나 사람의 의도로 읽지 않습니다.
자주 묻는 질문
Q1. TF-IDF는 딥러닝 모델인가요?
아닙니다. 문서의 출현 통계로 단어 가중치를 계산하는 방식입니다. 정답 라벨 없이 IDF를 구하며 뒤에 연결한 분류기나 다른 모델이 별도로 예측을 맡습니다.
Q2. 모든 문서에 나오는 단어는 0이 되나요?
공식에 따라 다릅니다. scikit-learn은 기본 평활화 설정과 평활화를 끈 설정 모두 IDF 식 마지막에 1을 더하므로 모든 문서에 등장한 단어의 IDF가 1입니다. 자동 불용어 제거와 혼동하지 마세요.
Q3. 가중치가 가장 큰 단어가 글의 정답 키워드인가요?
키워드 후보로 참고할 수는 있습니다. 하지만 희귀한 오타와 식별자도 큰 값을 받을 수 있고 문맥이나 부정 표현은 반영하지 못할 수 있습니다. 원문과 함께 검토해야 합니다.
Q4. 새 문서를 넣을 때마다 다시 fit해야 하나요?
기존 모델을 사용할 때는 저장한 어휘표와 IDF로 transform합니다. 말뭉치가 달라져 재학습할 필요가 생기면 변환기와 후속 모델을 함께 검증하고 버전으로 관리합니다.
Q5. TF-IDF 값은 서로 다른 실험끼리 비교해도 되나요?
그대로 비교하지 않습니다. 말뭉치, 문서 경계, 토큰화, TF 계산, IDF 공식과 정규화가 같은지 먼저 확인합니다. 공통 기준이 없다면 값의 크기만으로 단어가 더 중요해졌다고 결론 내리기 어렵습니다.
출처
마무리
TF-IDF는 한 문서의 단어 빈도와 문서 모음에서의 희소성을 결합한 가중치입니다. 원문을 숫자 벡터로 바꿔 분류·검색·군집화에 연결하는 데 쓰며 단어의 뜻이나 사실성을 스스로 판정하지 않습니다.
처음에는 TF와 DF가 무엇을 세는지 구분하고, 사용한 IDF 식과 정규화를 확인하세요. 그다음 실제 토큰과 상위 단어를 살펴봅니다. 어휘표와 계산 설정을 고정하면 모델의 오류와 텍스트 변환 단계의 오류를 나눠 확인하기가 쉬워집니다.
