도구스개발

TF-IDF 가중치 계산기

문서 여러 개를 넣으면 낱말마다 tf와 idf를 내고 그 문서를 특징짓는 낱말을 뽑습니다. tf와 idf 모두 널리 쓰이는 정의가 여럿이라 라이브러리마다 값이 다른데, 정의를 골라 가며 얼마나 달라지는지 직접 확인할 수 있습니다.

빈 줄로 문서를 나눕니다. 12개까지 다룹니다

tf = 1 + log f

idf = log(N / df)

문서 3개 · 어휘 18개

고양이가

1번 문서를 가장 잘 특징짓는 낱말입니다 · 한 문서에만 나온 낱말 15개 · 모든 문서에 나온 낱말 0개

낱말횟수tfdfidf가중치
고양이가21.693111.09861.86011
매트1111.09861.09861
자리다1111.09861.09861
좋아하는1111.09861.09861
앉았다1120.40550.40547
위에1120.40550.40547
낱말횟수tfdfidf가중치
강아지도1111.09861.09861
1111.09861.09861
자리를1111.09861.09861
좋아한다1111.09861.09861
통나무1111.09861.09861
강아지가1120.40550.40547
낱말횟수tfdfidf가중치
고양이와1111.09861.09861
놀았다1111.09861.09861
둘은1111.09861.09861
사이가1111.09861.09861
좋다1111.09861.09861
함께1111.09861.09861
문서 수 N3
전체 어휘 수18
한 문서에만 나온 낱말15
모든 문서에 나온 낱말없음
그 낱말들의 idf0
계산 근거가중치 = tf × idf · tf = 1 + log f · idf = log(N / df)N = 3 · L2 정규화 꺼짐 · 로그는 자연로그글자·숫자가 아닌 것을 경계로 잘라 소문자로 맞췄습니다. 한국어는 어절 단위로 잘리므로 «학교»와 «학교에»가 다른 낱말이 됩니다.
tf도 idf도 정의가 하나가 아닙니다 — 값이 안 맞는 1순위 이유입니다. tf는 원시 빈도·로그·상대 빈도·최대 정규화·이진이 모두 쓰이고, idf는 log(N/df)와 ln((1+N)/(1+df))+1이 둘 다 «표준»으로 불립니다. 특히 사이킷런의 기본값에는 +1이 붙어 있어 idf가 절대 0이 되지 않습니다. 어느 정의를 썼는지 밝히지 않은 TF-IDF 값은 다른 값과 견줄 수 없으니, 위의 두 선택 상자를 바꿔 가며 같은 문서에서 값이 얼마나 달라지는지 확인해 보십시오.
L2 정규화는 «긴 문서가 무조건 크다»를 막습니다. 문서마다 벡터의 길이를 1로 맞추므로 낱말 수가 다른 문서끼리도 견줄 수 있고, 두 문서의 코사인 유사도를 내적만으로 구할 수 있게 됩니다. 사이킷런은 기본으로 켜 두는데, 이것 하나만 달라도 값이 통째로 바뀝니다. 낱말 사이의 순위는 바뀌지 않습니다.
한국어에서는 형태소 분석 없이는 반쪽입니다. 이 계산기는 공백과 문장부호로만 자르므로 «학교»와 «학교에»와 «학교를»이 서로 다른 낱말이 됩니다. 실제 검색 시스템은 형태소 분석기로 조사를 떼어 내거나 글자 n-그램으로 자르는데, 둘 다 브라우저 안에서 돌리기에는 무겁습니다. 개념을 보이기 위한 계산기이지 실전 색인기가 아닙니다.
요즘 검색 엔진은 TF-IDF 대신 BM25를 씁니다. TF-IDF는 낱말이 두 배 나오면 가중치도 대략 두 배가 되는데, 실제로는 «한 번 나온 것과 열 번 나온 것»의 차이가 «열 번과 백 번»의 차이보다 훨씬 큽니다. BM25는 tf에 상한을 두어 이 문제를 고치고 문서 길이도 함께 보정합니다. 그래도 idf라는 발상 자체는 그대로 이어집니다.

사용 방법

  1. 1문서를 빈 줄로 나눠 적습니다. 12개까지 다룹니다.
  2. 2tf와 idf 계산 방식을 고릅니다. 기본값은 로그 tf와 교과서 idf입니다.
  3. 3문서마다 가중치가 큰 낱말이 위로 올라옵니다.
  4. 4idf를 «사이킷런 기본»으로 바꿔 모든 문서에 나오는 낱말의 값이 0에서 1로 바뀌는 것을 봅니다.
  5. 5L2 정규화를 켜고 끄며 값이 통째로 달라지는 것을 확인합니다.

자주 묻는 질문

«이 문서에 자주 나오면서 다른 문서에는 잘 안 나오는 낱말»에 큰 값을 주는 가중치입니다. tf는 그 문서에 나온 횟수, idf는 그 낱말이 나온 문서 수의 역수에 로그를 씌운 값이며 둘을 곱합니다. 어느 문서에나 나오는 낱말은 idf가 작아져 저절로 눌리므로, 불용어 목록을 따로 두지 않아도 «그리고» 같은 말이 밀려납니다.

tf와 idf 모두 널리 쓰이는 정의가 여럿이기 때문입니다. tf는 원시 빈도·로그·상대 빈도·최대 정규화·이진이 모두 쓰이고, idf는 log(N/df)와 ln((1+N)/(1+df))+1이 둘 다 «표준»으로 불립니다. 여기에 L2 정규화를 켜고 끄는 차이까지 겹칩니다. 어느 정의를 썼는지 밝히지 않은 TF-IDF 값은 다른 값과 견줄 수 없습니다.

기본값 ln((1+N)/(1+df)) + 1에 +1이 붙어 있기 때문입니다. 교과서 정의 log(N/df)로는 모든 문서에 나오는 낱말의 idf가 정확히 0이 되어 완전히 사라지지만, 사이킷런에서는 1이 되어 살아남습니다. 같은 문서에서 어느 쪽은 «the»를 지우고 어느 쪽은 1위로 올리는 일이 이 차이 때문에 생깁니다.

긴 문서가 무조건 큰 값을 갖는 것을 막고, 두 문서의 코사인 유사도를 내적만으로 구할 수 있게 하려는 것입니다. 문서마다 벡터의 길이를 1로 맞추므로 낱말 수가 다른 문서끼리도 견줄 수 있습니다. 낱말 사이의 순위는 바뀌지 않고 값의 크기만 달라집니다.

문서 수가 100배 늘어도 가중치가 100배가 되지 않게 하려는 것입니다. 로그가 없으면 아주 드문 낱말 하나가 다른 모든 낱말을 압도해 버립니다. 로그를 씌우면 «드문 정도»가 자릿수 단위로 반영되어, 10배 드문 낱말이 일정한 양만큼 더 큰 값을 갖게 됩니다.

한계가 있습니다. 이 계산기는 공백과 문장부호로만 자르므로 «학교»와 «학교에»와 «학교를»이 서로 다른 낱말이 됩니다. 실제 검색 시스템은 형태소 분석기로 조사를 떼어 내거나 글자 n-그램으로 자르는데, 둘 다 브라우저 안에서 돌리기에는 무겁습니다. 개념을 보이기 위한 계산기로 쓰십시오.

BM25는 tf에 상한을 두고 문서 길이를 보정합니다. TF-IDF는 낱말이 두 배 나오면 가중치도 대략 두 배가 되지만, 실제로는 «한 번과 열 번»의 차이가 «열 번과 백 번»의 차이보다 훨씬 큽니다. BM25는 이것을 고쳐 요즘 검색 엔진의 기본이 되었으며, idf라는 발상 자체는 그대로 이어집니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지며 입력한 글은 이 기기에만 남습니다.

알아두면 좋은 점

  • 낱말은 글자·숫자가 아닌 것을 경계로 잘라 소문자로 맞춥니다. 형태소 분석이나 어간 추출은 하지 않습니다.
  • 로그는 모두 자연로그입니다. 밑을 10으로 쓰는 자료와는 모든 idf 값이 ln10 = 2.303배 차이가 납니다(순위는 같습니다).
  • 문서는 12개, 문서당 4000자까지 다룹니다.
  • 확률적 idf는 낱말이 절반 넘는 문서에 나오면 음수가 되고, 모든 문서에 나오면 발산해 0으로 잘라 냅니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.