Как работает TF-IDF?

TF-IDF (Term Frequency – Inverse Document Frequency) — это статистическая мера, используемая для оценки важности слова в документе относительно всего корпуса документов. Она широко применяется в задачах обработки естественного языка (NLP), таких как поиск информации, тематическое моделирование, классификация текстов, кластеризация и другие.

Метод основан на двух компонентах:

  1. TF (Term Frequency) — частота слова в конкретном документе.

  2. 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

  1. Простая, но эффективная методика извлечения признаков из текста.

  2. Подавляет значение неинформативных слов (например, "это", "в", "на"), даже без удаления стоп-слов.

  3. Подходит для большинства классических алгоритмов, таких как SVM, логистическая регрессия, наивный Байес.

  4. Работает на любых языках, не требует предварительных эмбеддингов.

  5. Лёгко интерпретировать важность слов по величине их TF-IDF.

7. Недостатки TF-IDF

  1. Игнорирует порядок слов и грамматику.
    Фразы "кошка ест мышь" и "мышь ест кошка" будут одинаковыми по TF-IDF.

  2. Не распознаёт синонимы.
    "автомобиль" и "машина" — два разных признака.

  3. Не работает с OOV словами (out-of-vocabulary) без обновления словаря.

  4. Разреженность векторов.
    Векторы имеют большое количество нулей при большом словаре.

  5. Не учитывает морфологию.
    Разные формы слова ("читал", "читать", "читает") считаются разными словами.

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 метод: он достаточно прост, быстр и в то же время показывает хорошие результаты в задачах классификации и поиска по тексту.