← Назад к вопросам

Что такое векторизация TF-IDF?

1.0 Junior🔥 221 комментариев
#NLP и обработка текста#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое векторизация TF-IDF?

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

Основные компоненты

1. TF (Term Frequency) — частота терма

TF измеряет, насколько часто слово встречается в документе:

TF(t, d) = (количество раз, когда термин t встречается в документе d) / 
           (общее количество слов в документе d)

Пример:

Документ: "кот кот собака птица"

TF(кот) = 2/4 = 0.5
TF(собака) = 1/4 = 0.25
TF(птица) = 1/4 = 0.25

Интуиция: слова, которые чаще встречаются в документе, более важны для его описания.

2. IDF (Inverse Document Frequency) — обратная частота документа

IDF измеряет, насколько редкое слово встречается во всем корпусе документов:

IDF(t) = log(общее количество документов / количество документов, содержащих термин t)

Пример:

Корпус из 1000 документов:

IDF(кот) = log(1000 / 500) = log(2) ≈ 0.301   (встречается в 500 документах)
IDF(собака) = log(1000 / 200) = log(5) ≈ 0.699 (встречается в 200 документах)
IDF(и) = log(1000 / 1000) = log(1) = 0        (встречается во всех документах)

Интуиция: редкие слова более информативны. Частые слова (стоп-слова) получают низкий вес.

3. TF-IDF (комбинация)

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

Высокий вес TF-IDF получают слова, которые:

  • Часто встречаются в конкретном документе (высокий TF)
  • Редко встречаются в других документах (высокий IDF)

Практический пример на Python

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import numpy as np

# Корпус документов
documents = [
    "кот кот кот собака",
    "собака собака птица",
    "кот птица рыба",
    "рыба рыба рыба кот"
]

# Создание TF-IDF векторизатора
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# Получение названий признаков (слов)
feature_names = vectorizer.get_feature_names_out()

# Преобразование в плотную матрицу для удобства
tfidf_array = tfidf_matrix.toarray()

# Вывод результатов
print("Слова в словаре:", feature_names)
# ['кот' 'собака' 'птица' 'рыба']

print("\nTF-IDF матрица:")
print(pd.DataFrame(tfidf_array, columns=feature_names))
#        кот     собака    птица     рыба
# 0  0.816...  0.408...    0.0      0.0
# 1  0.0       0.816...  0.408...    0.0
# 2  0.408...  0.0       0.408...  0.408...
# 3  0.408...  0.0         0.0     0.816...

Вычисление вручную

import numpy as np
import math

# Документы
docs = ["кот кот собака", "собака птица", "кот птица рыба"]

# Шаг 1: Вычисляем TF для каждого документа
def compute_tf(document):
    words = document.split()
    tf = {}
    total_words = len(words)
    for word in words:
        tf[word] = tf.get(word, 0) + 1 / total_words
    return tf

# Шаг 2: Вычисляем IDF
def compute_idf(docs, word):
    doc_count = sum(1 for doc in docs if word in doc.split())
    return math.log(len(docs) / doc_count) if doc_count > 0 else 0

# Шаг 3: Получаем все уникальные слова
all_words = set()
for doc in docs:
    all_words.update(doc.split())

# Шаг 4: Вычисляем TF-IDF
tfidf_vectors = []
for doc in docs:
    tf = compute_tf(doc)
    tfidf_vector = {}
    for word in all_words:
        idf = compute_idf(docs, word)
        tfidf_vector[word] = tf.get(word, 0) * idf
    tfidf_vectors.append(tfidf_vector)

print("TF-IDF векторы:")
for i, vec in enumerate(tfidf_vectors):
    print(f"Doc {i}: {vec}")

Преимущества и недостатки TF-IDF

Преимущества

  1. Простота и скорость — быстро вычислять, легко понять
  2. Устранение стоп-слов — редкие слова получают выше вес
  3. Относительная нормализация — учитывает частоту в корпусе
  4. Хорошо работает для поиска документов — similarity search, retrieval
  5. Универсальность — применяется во многих задачах NLP

Недостатки

  1. Теряет семантику — "король" и "королева" полностью разные векторы
  2. Порядок слов игнорируется — "собака укусила человека" = "человек укусил собаку"
  3. Разреженность — матрица содержит много нулей
  4. Не учитывает синонимы — "машина" и "автомобиль" разные слова
  5. Требует предварительной обработки — нужны стоп-слова, лемматизация

Сравнение с другими методами векторизации

# TF-IDF
# Преимущества: быстро, просто, статистический подход
# Недостатки: теряет смысл, порядок слов

# Word2Vec, GloVe, FastText
# Преимущества: сохраняют семантику, синонимы близко
# Недостатки: медленнее, нужно предварительное обучение

# BERT, GPT embeddings
# Преимущества: контекстные, лучшее качество
# Недостатки: очень медленно, дорого, сложно

# Вывод: выбирайте в зависимости от задачи

Практические примеры использования

1. Поиск похожих документов

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

documents = [
    "Python программирование",
    "Java программирование",
    "Кулинарный рецепт",
]

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# Косинусное сходство между документами
similarity_matrix = cosine_similarity(tfidf_matrix)
print(similarity_matrix)
# [[1.0       0.707...  0.0      ]
#  [0.707...  1.0       0.0      ]
#  [0.0       0.0       1.0      ]]

# Первые два документа похожи, третий отличается

2. Классификация текстов

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

# Pipeline: TF-IDF + классификатор
clf = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('classifier', MultinomialNB())
])

# Обучение
train_docs = ["это спам", "продайте уже", "привет друг"]
train_labels = [1, 1, 0]  # 1 = спам, 0 = не спам

clf.fit(train_docs, train_labels)

# Предсказание
test_doc = "купи сейчас!!!"
prediction = clf.predict([test_doc])
print(f"Это спам? {prediction[0]}")

3. Информационный поиск

# Поиск релевантных документов по запросу
from sklearn.feature_extraction.text import TfidfVectorizer

documents = [
    "Python язык программирования для машинного обучения",
    "Java используется в корпоративной разработке",
    "Кулинария и рецепты для дома"
]

query = "Python машинное обучение"

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents + [query])

# Последний вектор — это запрос
query_vector = tfidf_matrix[-1]
doc_vectors = tfidf_matrix[:-1]

# Вычисляем сходство
similarities = cosine_similarity(query_vector, doc_vectors)[0]

# Ранжируем по релевантности
ranked = sorted(enumerate(similarities), key=lambda x: x[1], reverse=True)
print("Ранжированные результаты:")
for idx, score in ranked:
    print(f"Doc {idx}: {score:.3f}")

Параметры TfidfVectorizer

vectorizer = TfidfVectorizer(
    max_features=1000,        # максимум признаков
    min_df=2,                 # мин. количество документов для слова
    max_df=0.8,               # макс. доля документов со словом
    lowercase=True,           # приводить к нижнему регистру
    stop_words='english',     # удалять стоп-слова
    ngram_range=(1, 2),       # использовать унаграммы и биграммы
    sublinear_tf=True         # применить сублинейное масштабирование TF
)

Когда использовать TF-IDF

Хорошо подходит для:

  • Информационный поиск
  • Классификация документов
  • Определение похожести текстов
  • Быстрые прототипы

Не подходит для:

  • Задачи, требующие семантики (вопросно-ответные системы)
  • Анализ синтаксиса и морфологии
  • Модели, требующие плотных векторов (нейронные сети лучше с embeddings)

Заключение

TF-IDF — это мощный и простой метод для преобразования текста в численное представление. Несмотря на своё возрастание (метод известен с 1970-х), он остаётся актуальным благодаря:

  • Простоте реализации и понимания
  • Хорошей производительности на многих задачах
  • Интерпретируемости результатов

Однако для задач, требующих глубокого понимания смысла текста, лучше использовать современные методы на основе нейронных сетей (BERT, GPT и т.д.).