Информационный поиск
TF-IDF и BM25
Elasticsearch хранит индекс в 50 миллиардов документов и отвечает за 200 миллисекунд. BM25 - алгоритм 1994 года - до сих пор внутри. Не потому что не было времени заменить. Потому что ничто не сравнялось с ним по скорости на таком масштабе. BERT обрабатывает один документ за 10 мс. BM25 - за микросекунды. Понять почему эта 30-летняя формула всё ещё работает - значит понять архитектуру каждого современного поискового движка.
- **Elasticsearch** и **Apache Solr** используют BM25 как дефолтный алгоритм ранжирования для миллионов приложений
- **Amazon Product Search** комбинирует BM25 по title, description и reviews для ранжирования товаров
- **GitHub Code Search** использует field weighting: совпадение в имени файла весит больше, чем в содержимом
Предварительные знания
Robertson и рождение BM25
1994 год. Stephen Robertson и коллеги из City University London публикуют Okapi BM25 в рамках системы Okapi для конкурса TREC. BM расшифровывается как «Best Match» - вероятностная модель ранжирования. «25» - номер итерации формулы. До BM25 были BM1, BM11, BM15 - каждая версия исправляла проблемы предыдущей. TF насыщение (параметр k1) и нормализация по длине (параметр b) - ключевые улучшения над TF-IDF Карен Спарк Джонс 1972 года. Тридцать лет спустя BM25 остаётся default в Elasticsearch, Solr и практически каждой поисковой системе мира.
TF-IDF
Не все слова одинаково полезны для поиска. Слово «the» встречается в каждом английском документе - оно ничего не говорит о теме. А вот «квантовый» встречается редко и сразу сужает область. **TF-IDF** количественно выражает эту интуицию: вес слова растёт с частотой в документе (TF) и редкостью в коллекции (IDF).
На практике используют **сглаженный IDF**: `log(1 + N/df)` - чтобы избежать деления на ноль и слишком экстремальных весов. Также TF часто берут как `1 + log(TF)` - логарифмическое масштабирование, потому что 10 вхождений слова не в 10 раз полезнее одного.
Происхождение TF-IDF
Концепция IDF была предложена Карен Спарк Джонс (Karen Sparck Jones) в 1972 году в статье «A statistical interpretation of term specificity and its application in retrieval». Она считала, что термины с высокой специфичностью (редкие в коллекции) наиболее полезны для различения документов. TF-IDF в современной форме появился в работах Джерарда Солтона (SMART system, Cornell, 1960-80е). Каждый поисковый движок в мире - от Elasticsearch до Google на первом шаге - использует эту идею.
TF-IDF - это не один алгоритм, а целое **семейство** вариантов. SMART notation описывает комбинации: `lnc.ltc` означает log TF + no IDF + cosine norm для документа, log TF + IDF + cosine norm для запроса. Всего десятки вариантов!
Слово встречается в 10 из 10000 документов. Слово встречается 5 раз в одном из этих документов. Что верно?
BM25
TF-IDF имеет проблемы: TF растёт линейно (документ со словом 100 раз получает в 100 раз больший вес, чем с 1 разом - это неправильно). **Okapi BM25** - вероятностная модель ранжирования, которая решает эти проблемы и остаётся золотым стандартом поиска уже 30 лет.
Параметр **k1** контролирует насыщение TF. При k1 = 0 вес не зависит от частоты (binary model). При k1 → ∞ BM25 приближается к линейному TF-IDF. Значение k1 = 1.2 означает: первые вхождения слова важны, но 100-е вхождение добавляет ничтожно мало.
Параметр **b** контролирует нормализацию по длине документа. При b = 0 длина не учитывается. При b = 1 длинные документы сильно штрафуются. Значение b = 0.75 - компромисс: длинный документ может быть релевантен, но длина не должна давать незаслуженное преимущество из-за большего числа слов.
| TF в документе | TF-IDF вес | BM25 вес (k1=1.2) |
|---|---|---|
| 1 | 1.0 × IDF | 1.1 × IDF |
| 5 | 5.0 × IDF | 1.9 × IDF |
| 20 | 20.0 × IDF | 2.1 × IDF |
| 100 | 100.0 × IDF | 2.2 × IDF |
| 1000 | 1000.0 × IDF | 2.2 × IDF |
Параметр k1 в BM25 равен 1.2. Что произойдёт, если увеличить его до 10?
Field Weighting
Реальные документы имеют структуру: заголовок, тело, URL, мета-описание. Слово в **заголовке** гораздо сильнее сигнализирует о теме документа, чем то же слово в тексте. **Field weighting** - присвоение разных весов разным полям документа.
**BM25F** (BM25 with Field weighting) - расширение BM25, которое вычисляет взвешенную сумму TF по полям. В Elasticsearch это реализуется через **multi_match** запрос с boost-параметрами:
**Anchor text** - текст гиперссылок, ведущих на страницу - особенно ценный сигнал. Если 1000 страниц ссылаются на сайт текстом «лучший курс Python», значит сайт вероятно об этом. Google активно использует anchor text для ранжирования.
| Поле | Типичный boost | Почему |
|---|---|---|
| title | ×5 | Заголовок прямо описывает тему документа |
| anchor text | ×4 | Мнение других сайтов о содержании |
| h1-h3 | ×3 | Структурные заголовки указывают на ключевые темы |
| URL | ×3 | URL часто содержит ключевые слова |
| meta description | ×2 | Краткое описание для поисковых систем |
| body | ×1 | Основной текст - базовый вес |
Выбор boost-коэффициентов - эмпирическая задача. На практике их подбирают через **A/B-тесты** и **learning to rank**: обучают модель на размеченных данных (пары запрос-документ с оценкой релевантности), и модель находит оптимальные веса полей.
Почему слово в заголовке (title) получает больший вес, чем в теле документа?
Document Length Normalization
Длинный документ содержит больше слов - и статистически больше шансов, что любое слово запроса в нём встретится. Без нормализации длинные документы будут несправедливо доминировать в результатах. **Document length normalization** - механизм компенсации этого эффекта.
В BM25 параметр **b** управляет степенью нормализации. При b = 1 длинные документы штрафуются максимально. При b = 0 длина игнорируется. Оптимальное b зависит от коллекции: для однородных документов (научные абстракты) b можно уменьшить, для разнородных (веб) - увеличить.
| Параметр b | Эффект | Когда использовать |
|---|---|---|
| b = 0 | Длина не влияет | Все документы ~одной длины |
| b = 0.3 | Слабая нормализация | Научные статьи (длина варьируется мало) |
| b = 0.75 | Стандартная (default) | Общий случай, веб-документы |
| b = 1.0 | Максимальная нормализация | Очень разнородная коллекция |
Существует альтернатива: **cosine normalization** (делим TF-IDF вектор на его длину). Используется в TF-IDF, но не в BM25. Ещё один подход - **pivoted document length normalization**: задаём «точку разворота» (pivot), документы короче неё получают бонус, длиннее - штраф.
Нормализация по длине - это лишь один аспект. Современные системы также учитывают **query length** (длинные запросы нужно обрабатывать иначе), **coordination factor** (бонус за совпадение большего количества слов запроса) и **proximity** (слова запроса близко друг к другу в документе - хороший знак).
TF-IDF устарел с приходом BERT и нейросетей, его больше не используют
BM25 до сих пор является первой стадией поиска (retrieval) практически во всех поисковых системах, включая Google
Нейросетевые модели (BERT, ColBERT) используются на этапе re-ranking - переранжирования топ-100 результатов. Но начальная выборка из миллиардов документов всё ещё делается BM25: он работает за миллисекунды на огромных индексах, тогда как BERT обработка одного документа занимает ~10 мс. Это архитектура retrieve-then-rerank
Документ A (200 слов) и документ B (2000 слов) содержат слово запроса по 4 раза каждый. При b = 0.75, avgdl = 500, кто получит больший BM25 скор?
Ключевые идеи
- **TF-IDF** = частота в документе × редкость в коллекции: редкие слова важнее частых
- **BM25** решает проблемы TF-IDF: насыщение TF (параметр k1) и нормализация по длине (параметр b)
- **Field weighting** (BM25F): слово в заголовке ×5 важнее, чем в тексте ×1
- Архитектура **retrieve-then-rerank**: BM25 быстро выбирает топ-1000, нейросети переранжируют
Связанные темы
TF-IDF и BM25 связывают информационный поиск с машинным обучением и NLP:
- Инвертированный индекс — BM25 скоры вычисляются на основе TF и DF, хранимых в posting lists
- Введение в информационный поиск — BM25 - конкретная реализация концепции ранжирования из первого урока
Вопросы для размышления
- Почему в BM25 используется гармоническое ограничение TF вместо линейного? В каких случаях линейный TF мог бы быть лучше?
- Как подобрать параметры k1 и b для поисковой системы интернет-магазина (товары с коротким описанием vs отзывы)?
- Если BERT так хорош в понимании смысла, почему нельзя просто заменить BM25 на BERT для всех 100B документов?
Связанные уроки
- ir-02 — Инвертированный индекс хранит TF и DF для BM25 расчётов
- ir-01 — Базовые концепции IR: релевантность и ранжирование
- ir-04 — Vector space model и cosine similarity следуют из TF-IDF
- aie-13-advanced-rag — Hybrid search в RAG комбинирует BM25 с dense retrieval
- nlp-03 — NLP preprocessing: stemming, stopwords влияют на TF-IDF качество
- rec-03 — TF-IDF и matrix factorization оба ищут сигнал в разреженных данных
- stat-03-mle