Что такое векторизация TF-IDF?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое векторизация 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
Преимущества
- Простота и скорость — быстро вычислять, легко понять
- Устранение стоп-слов — редкие слова получают выше вес
- Относительная нормализация — учитывает частоту в корпусе
- Хорошо работает для поиска документов — similarity search, retrieval
- Универсальность — применяется во многих задачах NLP
Недостатки
- Теряет семантику — "король" и "королева" полностью разные векторы
- Порядок слов игнорируется — "собака укусила человека" = "человек укусил собаку"
- Разреженность — матрица содержит много нулей
- Не учитывает синонимы — "машина" и "автомобиль" разные слова
- Требует предварительной обработки — нужны стоп-слова, лемматизация
Сравнение с другими методами векторизации
# 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 и т.д.).