Как работает TF-IDF?
TF-IDF (Term Frequency – Inverse Document Frequency) — это статистическая мера, используемая для оценки важности слова в документе относительно всего корпуса документов. Она широко применяется в задачах обработки естественного языка (NLP), таких как поиск информации, тематическое моделирование, классификация текстов, кластеризация и другие.
Метод основан на двух компонентах:
-
TF (Term Frequency) — частота слова в конкретном документе.
-
IDF (Inverse Document Frequency) — обратная частота документов, содержащих это слово.
1. Компонент TF (Term Frequency)
TF измеряет, насколько часто термин (слово) встречается в конкретном документе.
Формула:
TF(t,d)=ft,d∑kfk,dTF(t, d) = \frac{f_{t,d}}{\sum_k f_{k,d}}
где:
-
tt — слово (термин),
-
dd — документ,
-
ft,df_{t,d} — количество вхождений слова tt в документ dd,
-
знаменатель — общее количество всех слов в документе dd.
Пример:
Если слово "машина" встречается 4 раза в документе из 100 слов, то:
TF("машина")=4100=0.04TF("машина") = \frac{4}{100} = 0.04
Иногда вместо относительной частоты используют просто количество вхождений или логарифм частоты:
TF(t,d)=log(1+ft,d)TF(t, d) = \log(1 + f_{t,d})
2. Компонент IDF (Inverse Document Frequency)
IDF измеряет, насколько уникально или информативно слово для всей коллекции документов. Идея в том, что если слово встречается во многих документах, оно менее значимо.
Формула:
IDF(t,D)=log(N1+nt)IDF(t, D) = \log\left(\frac{N}{1 + n_t}\right)
где:
-
NN — общее количество документов в корпусе,
-
ntn_t — количество документов, в которых встречается слово tt,
-
добавление 1 в знаменатель предотвращает деление на ноль (если слово не встречается ни в одном документе).
Пример:
Если "машина" встречается в 100 из 1000 документов:
IDF("машина")=log(10001+100)≈log(9.09)≈0.96IDF("машина") = \log\left(\frac{1000}{1 + 100}\right) \approx \log(9.09) \approx 0.96
Если слово "и" встречается в 990 документах:
IDF("и")=log(10001+990)=log(1.01)≈0.004IDF("и") = \log\left(\frac{1000}{1 + 990}\right) = \log(1.01) \approx 0.004
→ Очень маленький вес: слово "и" не несёт уникальной информации.
3. Расчёт TF-IDF
Объединяя оба компонента:
TF-IDF(t,d,D)=TF(t,d)⋅IDF(t,D)TF\text{-}IDF(t, d, D) = TF(t, d) \cdot IDF(t, D)
TF отвечает за локальную значимость слова в документе, а IDF — за глобальную важность в корпусе.
Пример:
Если TF("машина") = 0.04, IDF("машина") = 0.96:
TF-IDF("машина")=0.04⋅0.96=0.0384TF\text{-}IDF("машина") = 0.04 \cdot 0.96 = 0.0384 4. Особенности
-
Часто встречающиеся в корпусе слова (например, предлоги, союзы) имеют низкий IDF → низкий вес.
-
Редкие, но частотные в конкретном документе слова получают высокий TF-IDF → важные признаки для классификации или поиска.
-
Слова, не встречающиеся в документе, получают нулевой TF → нулевой вес в TF-IDF.
5. Поведение на практике
Представим корпус из трёх документов:
D1: "собака лает"
D2: "кошка мяукает"
D3: "собака и кошка дерутся"
Словарь: ["собака", "лает", "кошка", "мяукает", "дерутся", "и"]
Подсчёт TF:
Слово | D1 | D2 | D3 |
---|---|---|---|
собака | 1 | 0 | 1 |
--- | --- | --- | --- |
лает | 1 | 0 | 0 |
--- | --- | --- | --- |
кошка | 0 | 1 | 1 |
--- | --- | --- | --- |
мяукает | 0 | 1 | 0 |
--- | --- | --- | --- |
дерутся | 0 | 0 | 1 |
--- | --- | --- | --- |
и | 0 | 0 | 1 |
--- | --- | --- | --- |
Подсчёт IDF:
-
N = 3 (всего документов)
-
собака → 2 → log(3 / (1+2)) ≈ 0.176
-
лает → 1 → log(3 / (1+1)) ≈ 0.477
-
и → 1 → log(3 / (1+1)) ≈ 0.477
TF-IDF ("собака", D1) ≈ (1/2) × 0.176 = 0.088
Таким образом, "лает" в D1 будет иметь больший вес, чем "собака", даже несмотря на то, что они встречаются одинаково часто — потому что "собака" более общеупотребительное слово в этом корпусе.
6. Преимущества TF-IDF
-
Простая, но эффективная методика извлечения признаков из текста.
-
Подавляет значение неинформативных слов (например, "это", "в", "на"), даже без удаления стоп-слов.
-
Подходит для большинства классических алгоритмов, таких как SVM, логистическая регрессия, наивный Байес.
-
Работает на любых языках, не требует предварительных эмбеддингов.
-
Лёгко интерпретировать важность слов по величине их TF-IDF.
7. Недостатки TF-IDF
-
Игнорирует порядок слов и грамматику.
Фразы "кошка ест мышь" и "мышь ест кошка" будут одинаковыми по TF-IDF. -
Не распознаёт синонимы.
"автомобиль" и "машина" — два разных признака. -
Не работает с OOV словами (out-of-vocabulary) без обновления словаря.
-
Разреженность векторов.
Векторы имеют большое количество нулей при большом словаре. -
Не учитывает морфологию.
Разные формы слова ("читал", "читать", "читает") считаются разными словами.
8. Реализация в scikit-learn
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = \[
"собака лает",
"кошка мяукает",
"собака и кошка дерутся"
\]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
\# Список признаков
print(vectorizer.get_feature_names_out())
\# Признаковые векторы
print(X.toarray())
9. Параметры TfidfVectorizer
-
ngram_range=(1, 2) — включает униграммы и биграммы
-
min_df=2 — исключает редкие слова
-
max_df=0.8 — исключает слишком частые
-
stop_words='russian' — удаляет стоп-слова
-
sublinear_tf=True — применяет логарифм к TF
10. Альтернативы и развитие
TF-IDF может быть дополнен или заменён современными методами:
-
Word2Vec / FastText — плотные векторы, учитывают семантику.
-
BERT, GPT — контекстные эмбеддинги.
-
BM25 — модификация TF-IDF, часто используется в поисковых системах.
-
Doc2Vec — эмбеддинг для всего документа.
TF-IDF часто используется как baseline метод: он достаточно прост, быстр и в то же время показывает хорошие результаты в задачах классификации и поиска по тексту.