TF-IDF
Материал из MachineLearning.
| | Статья написана с использованием LLM GPT-5.5 Thinking и проверена участником Eva Vallistu 22:02, 13 июля 2026 (MSD) Промпт приводится полностью в Обсуждение:TF-IDF |
|
TF-IDF — числовая мера важности терма в документе относительно корпуса документов. Название происходит от английского term frequency — inverse document frequency, то есть «частота терма — обратная документная частота». Метод широко используется в обработке естественного языка, информационном поиске, векторном представлении текста, классификации и кластеризации текстовых документов.
Интуиция TF-IDF состоит в том, что слово считается важным для документа, если оно часто встречается в этом документе, но редко встречается во всей коллекции. Например, слово «алгоритм» может быть значимым в документе о машинном обучении, если оно встречается в нём часто и не является характерным для большинства документов корпуса. Напротив, слово «и» или «это» может иметь высокую частоту внутри отдельного документа, но не должно получать большой вес, поскольку встречается почти во всех документах. Таким образом, локальная частота терма корректируется его глобальной распространённостью.
TF-IDF является развитием модели мешка слов: документ представляется не последовательностью слов, а вектором признаков, где координаты соответствуют термам словаря. В отличие от простого подсчёта слов, TF-IDF понижает вес слишком распространённых термов и повышает вес терминов, более специфичных для отдельных документов.
Основные понятия и определения
Пусть задан корпус документов
,
где — число документов в корпусе. Каждый документ
рассматривается как набор или последовательность токенов, полученных после некоторой процедуры предобработки текста. Токен может соответствовать слову, нормализованной словоформе, символьной n-грамме или словесной n-грамме.
Терм — элемент словаря признаков, используемый для представления документов. Словарь корпуса обозначается
,
где — размер словаря. Обычно словарь состоит из всех термов, встретившихся в корпусе после фильтрации, нормализации и удаления слишком редких или слишком частых элементов.
Частота терма характеризует, насколько часто терм
встречается в документе
. В простейшем случае она равна числу вхождений терма:
где — количество появлений терма
в документе
.
Документная частота — число документов корпуса, в которых терм
встречается хотя бы один раз:
Документная частота не учитывает, сколько раз терм встретился внутри каждого документа. Она учитывает только факт присутствия терма в документе.
Обратная документная частота измеряет специфичность терма относительно корпуса. Один из базовых вариантов IDF задаётся формулой
Если терм встречается во многих документах, величина велика, а значение IDF мало. Если терм встречается только в небольшой части корпуса, значение IDF возрастает.
Основная формула TF-IDF имеет вид
Вычисление TF-IDF
Пусть — число вхождений терма
в документ
, а
— общее число токенов в документе. На практике используются разные варианты частоты терма.
Абсолютная частота:
Этот вариант прост, но чувствителен к длине документа: длинные документы получают большие значения частот только из-за большего числа слов.
Относительная частота:
Такой вариант делит число вхождений терма на длину документа и тем самым уменьшает влияние длины текста.
Логарифмическое масштабирование:
Логарифмическое масштабирование отражает предположение, что десятое повторение терма обычно не в десять раз важнее первого. Оно уменьшает влияние очень частых слов внутри одного документа.
Расширенная частота:
Этот вариант нормирует частоту терма на максимальную частоту в документе. Он полезен, когда требуется уменьшить различия между документами разной длины и разной плотности повторений.
Для IDF также существуют разные варианты. Базовая формула имеет вид
Если терм встречается во всех документах корпуса, то , и его IDF равен нулю. Такой терм не различает документы внутри данной коллекции.
Часто используется сглаженный вариант:
Сглаживание предотвращает деление на ноль для термов, отсутствующих в обучающем корпусе, и не даёт термам, встречающимся во всех документах, получить нулевой вес. Добавление единицы в конце сохраняет положительный вклад IDF.
В библиотеке scikit-learn при параметре smooth_idf=True используется формула
При smooth_idf=False используется вариант
Логарифм в формуле IDF нужен для сжатия диапазона значений. Без логарифма редкие термы могли бы получать чрезмерно большие веса, особенно в больших корпусах. Основание логарифма влияет только на общий масштаб IDF: переход от натурального логарифма к логарифму по основанию 10 умножает все значения IDF на постоянный коэффициент. Если затем применяется нормализация векторов, влияние выбора основания обычно уменьшается.
После вычисления TF-IDF каждый документ преобразуется в вектор
Поскольку каждый документ содержит только небольшую часть словаря, большинство координат такого вектора равны нулю. Поэтому TF-IDF-представление обычно хранится как разреженная матрица.
Для корпуса из документов получается матрица признаков
где строка соответствует документу
, а столбец
соответствует терму
.
После вычисления весов часто применяется нормализация строк матрицы.
Нормализация по норме :
При такой нормализации сумма абсолютных значений координат вектора равна единице. Её можно использовать, когда важны относительные вклады термов.
Нормализация по норме :
Нормализация часто используется совместно с косинусным сходством. Если векторы нормированы по
, то их скалярное произведение равно косинусному сходству:
Общий порядок построения TF-IDF-представления корпуса:
- собрать корпус документов
;
- выполнить токенизацию текстов;
- привести текст к выбранному регистру, обработать пунктуацию и специальные символы;
- при необходимости удалить стоп-слова;
- при необходимости применить стемминг или лемматизацию;
- построить словарь
;
- посчитать частоты термов в каждом документе;
- посчитать документные частоты
;
- вычислить значения
;
- вычислить произведения
;
- сформировать разреженную матрицу признаков;
- при необходимости применить
- или
-нормализацию.
Конкретные определения TF, IDF, сглаживания и нормализации могут различаться между реализациями, поэтому при сравнении результатов необходимо учитывать используемую формулу.
Пример вычисления
Рассмотрим корпус из трёх документов:
-
:
кот ест рыбу -
:
кот ест мясо -
:
собака ест мясо
После токенизации получаем словарь. Для удобства обозначим термы следующим образом:
-
—
кот; -
—
ест; -
—
рыбу; -
—
мясо; -
—
собака.
Тогда
Число документов равно . Используем абсолютную частоту терма и сглаженную формулу IDF:
Документные частоты:
- терм
встречается в документах
и
, поэтому
;
- терм
встречается в документах
,
и
, поэтому
;
- терм
встречается только в документе
, поэтому
;
- терм
встречается в документах
и
, поэтому
;
- терм
встречается только в документе
, поэтому
.
Значения IDF:
При использовании натурального логарифма:
Так как каждый терм в каждом документе встречается не более одного раза, значения TF для присутствующих термов равны единице. Тогда ненормированные TF-IDF-векторы в порядке словаря имеют вид:
Терм ест встречается во всех документах и получает минимальный IDF. Термы рыбу и собака встречаются только в одном документе и получают больший вес. Термы кот и мясо занимают промежуточное положение.
Если применить -нормализацию, каждый вектор делится на свою евклидову норму. Для первого документа:
Нормированный вектор первого документа:
Аналогично нормируются остальные строки матрицы. Нормализация делает сравнение документов менее зависимым от их длины и позволяет использовать скалярное произведение как косинусное сходство.
Предобработка текста
Результат TF-IDF существенно зависит от предобработки текста. Базовый метод не понимает смысл слов, не учитывает порядок слов и не различает синтаксические отношения. Поэтому все свойства представления определяются тем, какие термы попадают в словарь.
Токенизация задаёт способ разбиения текста на единицы. В простом случае токенами являются слова, отделённые пробелами и пунктуацией. В более сложных случаях используются правила для сокращений, чисел, дефисных написаний, дат, адресов электронной почты и программных идентификаторов.
Регистр влияет на объединение или разделение признаков. Если все слова приводятся к нижнему регистру, то «Модель» и «модель» считаются одним термом. Если регистр сохраняется, такие формы становятся разными признаками.
Пунктуация может удаляться, заменяться пробелами или сохраняться как часть токена. Выбор зависит от задачи. В новостных текстах пунктуация часто удаляется, а в анализе программного кода, логов или юридических документов отдельные символы могут иметь значение.
Стоп-слова — частые служебные слова, обычно несущие малую различительную информацию: предлоги, союзы, частицы и местоимения. Их удаление уменьшает размерность словаря и может улучшить качество поиска или классификации. Однако в некоторых задачах стоп-слова важны, например при атрибуции авторства или анализе стиля.
Стемминг приводит слова к грубой основе. Например, формы «машина», «машины», «машиной» могут быть сведены к общей основе. Стемминг уменьшает размерность признакового пространства, но может объединять слова слишком грубо.
Лемматизация приводит словоформы к словарной форме. Например, «обрабатывали», «обрабатывает» и «обработка» могут быть обработаны с учётом морфологии языка. Лемматизация обычно точнее стемминга, но требует морфологического анализатора.
n-граммы позволяют частично учитывать локальные сочетания токенов. Словесные биграммы и триграммы могут представлять выражения «машинное обучение», «метод опорных векторов», «обратная документная частота». Символьные n-граммы полезны для языков с богатой морфологией, исправления опечаток и обработки коротких текстов. Однако n-граммы увеличивают размерность и разреженность матрицы.
Предобработка не превращает базовый TF-IDF в семантическую модель. Она лишь меняет множество признаков и способ подсчёта их частот.
Применение
В информационном поиске TF-IDF используется для ранжирования документов по запросу. Запрос можно представить как короткий документ, построить для него TF-IDF-вектор и сравнить его с векторами документов. Чем выше сходство между запросом и документом, тем выше документ может быть расположен в выдаче.
В задачах классификации текстов TF-IDF-матрица используется как матрица признаков для алгоритмов машинного обучения. На таких признаках часто обучают линейные модели, наивный байесовский классификатор, метод опорных векторов и логистическую регрессию. TF-IDF хорошо подходит для тематической классификации, фильтрации спама, маршрутизации обращений и классификации новостей.
В кластеризации документов TF-IDF-векторы позволяют группировать тексты по лексическому сходству. Для этого могут использоваться k-средних, иерархическая кластеризация или методы на графах сходства. Поскольку TF-IDF-векторы обычно разрежены и высокоразмерны, часто применяется косинусная мера близости.
При поиске ключевых слов TF-IDF помогает выделять термы, характерные для конкретного документа или группы документов. Термы с высокими весами часто соответствуют тематически значимым словам. Однако такой подход не гарантирует выделения смысловых ключевых фраз: частотный признак может пропустить важные, но редко выраженные понятия.
Для измерения сходства текстов TF-IDF обычно сочетается с косинусным сходством. Если два документа содержат много общих специфичных термов, их косинусное сходство будет высоким. Если они используют разные словари, сходство будет низким, даже если тексты близки по смыслу. Это ограничение особенно заметно при синонимии и переформулировках.
TF-IDF тесно связан с моделью мешка слов. В простой модели мешка слов координата вектора равна числу появлений слова. В TF-IDF эта координата дополнительно умножается на IDF, то есть на коэффициент, зависящий от распределения терма по корпусу.
Свойства
Достоинства
К достоинствам TF-IDF относятся:
- простота математического определения и реализации;
- интерпретируемость признаков: каждая координата соответствует конкретному терму;
- эффективность на небольших и средних корпусах;
- хорошая совместимость с линейными моделями машинного обучения;
- естественная разреженность представления;
- отсутствие необходимости в размеченных данных для построения признаков;
- применимость к разным языкам при наличии подходящей токенизации;
- полезность как сильного базового метода для текстовой классификации и поиска.
TF-IDF часто используется как базовая линия качества. Если более сложная модель не превосходит TF-IDF на конкретной задаче, её применение может быть неоправданным.
Ограничения
Базовый TF-IDF имеет ряд принципиальных ограничений.
Во-первых, метод игнорирует порядок слов. Документы «модель улучшила качество» и «качество улучшило модель» могут иметь одинаковое представление в модели мешка слов, хотя их смысл различается.
Во-вторых, TF-IDF не учитывает семантику. Слова «автомобиль» и «машина» рассматриваются как разные признаки, если они не были объединены на этапе предобработки. Синонимия обрабатывается слабо.
В-третьих, TF-IDF плохо работает с многозначностью. Слово «лук» в текстах о растениях и слово «лук» в текстах об оружии будут иметь одну и ту же координату, если не используется дополнительная контекстная модель.
В-четвёртых, представление имеет высокую размерность. Словарь реального корпуса может содержать десятки тысяч, сотни тысяч или миллионы признаков. Это увеличивает требования к памяти и усложняет некоторые алгоритмы.
В-пятых, матрица TF-IDF сильно разрежена. Разреженность полезна для хранения и линейной алгебры, но может быть неудобна для моделей, ожидающих плотные числовые признаки.
В-шестых, веса зависят от корпуса. Один и тот же документ может получить разные TF-IDF-векторы при добавлении новых документов, изменении домена или пересчёте IDF на другой коллекции.
В-седьмых, TF-IDF чувствителен к токенизации, нормализации, удалению стоп-слов, выбору n-грамм и фильтрации словаря. Разные пайплайны предобработки могут давать существенно разные признаки.
Вычислительная сложность
Пусть — общее число токенов в корпусе после предобработки,
— число документов,
— размер словаря, а
— число ненулевых элементов в матрице «документ — терм».
Построение словаря и подсчёт частот требует прохода по корпусу и имеет сложность
Подсчёт документных частот также может быть выполнен за
при условии, что для каждого документа учитывается множество уникальных термов.
Вычисление IDF для всех термов словаря имеет сложность
Формирование разреженной TF-IDF-матрицы имеет сложность
Нормализация строк матрицы также выполняется за
Память для хранения разреженной матрицы пропорциональна числу ненулевых элементов:
В плотном виде матрица потребовала бы
памяти, что обычно непрактично для больших текстовых коллекций.
Сравнение с другими представлениями текста
Бинарное представление фиксирует только наличие или отсутствие терма в документе:
Оно устойчиво к повторениям слов, но теряет информацию о частоте. Такое представление может быть полезно для коротких текстов или задач, где сам факт появления терма важнее числа повторений.
Обычные счётчики слов используют абсолютные частоты термов. Они сохраняют информацию о повторениях, но не различают специфичные и общеупотребительные слова. Частые служебные слова могут доминировать в признаках, если не используются фильтрация и нормализация.
TF-IDF занимает промежуточное положение: он сохраняет информацию о частоте терма внутри документа и одновременно учитывает распространённость терма в корпусе. По сравнению с обычными счётчиками TF-IDF обычно лучше подходит для поиска и классификации по тематическим словам.
BM25 — ранжирующая функция, развивающая идеи TF-IDF в вероятностной модели информационного поиска. BM25 использует насыщение частоты терма и нормализацию по длине документа. В задачах полнотекстового поиска BM25 часто оказывается сильнее простого TF-IDF, особенно при ранжировании документов по коротким запросам.
Плотные векторные представления текста сопоставляют словам, предложениям или документам плотные векторы небольшой или средней размерности. В отличие от TF-IDF, такие представления могут учитывать статистическую семантическую близость, контекст и переформулировки, если обучены соответствующим образом. Однако они менее интерпретируемы, требуют больше вычислительных ресурсов и могут быть избыточны для простых задач.
TF-IDF остаётся предпочтительным, когда требуется интерпретируемая, быстрая и воспроизводимая базовая модель; когда корпус невелик; когда важны точные совпадения терминов; когда нужно построить простой поисковый индекс или классификатор без обучения сложных языковых моделей. Эмбеддинги целесообразно использовать, когда важны семантическая близость, синонимия, переформулировки, перенос между доменами, контекстные значения слов или поиск по смыслу, а не только по лексическим совпадениям.
Реализация
Ниже приведена простая самостоятельная реализация TF-IDF на Python. В ней используется токенизация по словам, приведение к нижнему регистру, абсолютная частота терма, сглаженная формула IDF и -нормализация.
import math import re from collections import Counter, defaultdict def tokenize(text): return re.findall(r"\b\w+\b", text.lower()) def build_tfidf(corpus): tokenized_documents = [tokenize(document) for document in corpus] n_documents = len(tokenized_documents) ``` vocabulary = sorted(set(token for document in tokenized_documents for token in document)) term_to_index = {term: index for index, term in enumerate(vocabulary)} document_frequency = defaultdict(int) for document in tokenized_documents: for term in set(document): document_frequency[term] += 1 idf = {} for term in vocabulary: idf[term] = math.log((n_documents + 1) / (document_frequency[term] + 1)) + 1 matrix = [] for document in tokenized_documents: term_counts = Counter(document) row = [0.0] * len(vocabulary) for term, count in term_counts.items(): index = term_to_index[term] row[index] = count * idf[term] norm = math.sqrt(sum(value * value for value in row)) if norm > 0: row = [value / norm for value in row] matrix.append(row) return vocabulary, idf, matrix ``` documents = [ "кот ест рыбу", "кот ест мясо", "собака ест мясо", ] vocabulary, idf_values, tfidf_matrix = build_tfidf(documents) print("Словарь признаков:") print(vocabulary) print("\nIDF:") for term in vocabulary: print(term, round(idf_values[term], 3)) print("\nМатрица TF-IDF:") for row in tfidf_matrix: print([round(value, 3) for value in row]) def cosine_similarity(vector_a, vector_b): return sum(a * b for a, b in zip(vector_a, vector_b)) print("\nКосинусное сходство:") for i in range(len(tfidf_matrix)): for j in range(i + 1, len(tfidf_matrix)): similarity = cosine_similarity(tfidf_matrix[i], tfidf_matrix[j]) print(f"d{i + 1}, d{j + 1}: {similarity:.3f}")
В этом примере косинусное сходство вычисляется как скалярное произведение, поскольку строки матрицы уже нормированы по норме .
Ниже приведён пример использования TfidfVectorizer из библиотеки scikit-learn. Код выводит словарь признаков, матрицу TF-IDF и косинусное сходство между документами.
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity documents = [ "кот ест рыбу", "кот ест мясо", "собака ест мясо", ] vectorizer = TfidfVectorizer( lowercase=True, token_pattern=r"(?u)\b\w+\b", use_idf=True, smooth_idf=True, norm="l2", ) tfidf_matrix = vectorizer.fit_transform(documents) print("Словарь признаков:") print(vectorizer.get_feature_names_out()) print("\nСловарь term -> index:") print(vectorizer.vocabulary_) print("\nIDF:") for term, value in zip(vectorizer.get_feature_names_out(), vectorizer.idf_): print(term, round(value, 3)) print("\nМатрица TF-IDF:") print(tfidf_matrix.toarray().round(3)) similarities = cosine_similarity(tfidf_matrix) print("\nКосинусное сходство между документами:") print(similarities.round(3))
В TfidfVectorizer результат зависит от параметров токенизации, приведения к регистру, сглаживания IDF, выбора нормы, фильтрации словаря и использования n-грамм. Поэтому при воспроизведении вычислений необходимо явно фиксировать параметры векторизатора.
См. также
- Машинное обучение
- Классификация
- Кластеризация
- Векторная модель
- Ранжирование
- Тематическое моделирование
Литература
Jones K. S. A statistical interpretation of term specificity and its application in retrieval. — 1972. — Т. 28. — № 1. — С. 11--21.
Salton G.; Wong A.; Yang C. S. A vector space model for automatic indexing. — 1975. — Т. 18. — № 11. — С. 613--620.
Robertson S. E.; Spärck Jones K. Relevance weighting of search terms. — 1976. — Т. 27. — № 3. — С. 129--146.
Salton G.; McGill M. J. Introduction to Modern Information Retrieval. — McGraw-Hill, 1983.
Baeza-Yates R.; Ribeiro-Neto B. Modern Information Retrieval. — Addison-Wesley, 1999.
Manning C. D.; Raghavan P.; Schütze H. Introduction to Information Retrieval. — Cambridge University Press, 2008.

