Как BM25 не даёт повтору ключа расти бесконечно

27.10.2026 · 6 мин чтения
Коралловые бруски на чёрном подиуме, ряд выходит на плато
Повтор слова из запроса сначала помогает понять, о чём страница. Потом тот же повтор почти перестаёт добавлять смысл: тема уже названа. BM25 я держу в голове именно так. Короткая страница, где слово стоит в теме, для этой оценки не равна длинной, где слово мелькнуло один раз. Место в выдаче я отсюда не обещаю и ключ набивать не учу. Ниже рассказываю, как читаю свой текст с этими двумя ограничениями.

Что я называю BM25

BM25 — способ оценить, насколько текст подходит запросу. Имя разбирается просто: Best Match 25, то есть лучшее совпадение. Рядом стоит Okapi: так называлась система, в которой эту оценку доводили. Для меня это способ читать свой текст, а не рычаг в админке.
Запрос один, а страниц много. Мало знать, что слово где-то встретилось. Нужно отличить страницу, которая про эту тему, от страницы, где тему только задели. Поиск решает это среди прочих сигналов. Я беру ту же развилку на своём черновике: есть ли ответ человеку или на странице просто прозвучало нужное слово.
Одно и то же слово на двух моих страницах может значить разное. Где-то страница собрана вокруг него. Где-то оно всплыло по пути, внутри другого разбора. Модель сравнивает документы относительно длины и того, как слово повторено. Выбор, какую страницу оставить, она за меня не делает. Если обе отвечают на один запрос, я оставляю ту, где ответ собран. На вторую ту же фразу пачкой не переношу.
Учебная формула открыта. То, как конкретная поисковая система соединяет текстовое совпадение с остальными сигналами, снаружи закрыто. По открытой формуле я живую выдачу не восстанавливаю. Совпадение с моделью и место среди чужих страниц для меня разные вещи. Место страницы я из этой формулы не вычисляю.

Повтор сначала помогает, потом выдыхается

Первые вхождения работают как имя темы. По ним видно, о чём речь. На длинной странице спокойное повторное упоминание удерживает тему там, где без имени абзац повиснет. Дальше вклад падает. Новое такое же слово говорит уже сказанное. Это и есть насыщение: повтор не растёт бесконечно, следующее вхождение добавляет меньше предыдущего.
Ход я держу такой. Сначала новое упоминание заметно поднимает уверенность, что страница про этот запрос. Потом подъём почти ложится. Страница уже узнана как текст про тему, и ещё одна копия того же слова уверенности почти не добавляет. Ключ, повторённый пачкой, не становится от этого бесконечно полезнее. Он упирается в потолок. Потолок я калькулятором не меряю и синонимами не обхожу.
Норму «сколько раз поставить ключ» я из этого не достаю. Фразу не дописываю в надежде, что оценка ещё растёт. По смыслу модели рост как раз сходит на нет. Абзац, где одна и та же строка стоит ради ещё одного вхождения, я снимаю. Человеку она уже была слышна. Модели она почти ничего не прибавляет.
Редкость слова тоже в этой оценке. Слово, которое стоит почти на каждой странице, хуже отделяет одну от другой, чем слово, которое встречается реже. Частоту и редкость смотрит и TF-IDF. Отдельную статью про него я здесь не открываю. Хватает одной фразы: TF-IDF смотрит частоту и редкость, а BM25 ещё смотрит длину и насыщение повтора.
Проверяю вычёркиванием. Убрал повтор, а мысль цела — повтор был лишним. Убрал имя темы, и стало непонятно, о чём кусок — имя возвращаю туда, где без него дыра. Место для имени — заголовок, первый ответ и тот абзац, который без названия темы разваливается. Соседние куски говорю обычными словами. Пачку близких замен лечением не считаю: если новой мысли нет, это тот же повтор другими словами.
Ряд коралловых фишек на чёрном фоне, дальние почти гаснут
Первые метки яркие, дальше такие же метки гаснут: новый повтор почти ничего не добавляет.

Короткая страница и длинная — не одно совпадение

Одно и то же число упоминаний на короткой и на длинной странице — не одна ситуация. На короткой слово держит большую долю разговора. Если страница правда про эту тему, упоминание уместно и сразу видно. На длинной одно касание легко оказывается попутным: слово мелькнуло внутри чужого разбора. Считать только факт «слово встретилось» — смешать эти страницы. BM25 их различает, потому что длина входит в оценку.
Короткая страница сама по себе наградой не становится. Если в ней нет ответа, малый объём тему не создаёт. Длинная страница, где тема разобрана по шагам и слово стоит там, где без него теряется нить, не слабеет только из-за числа строк. Длина нужна, чтобы одно мелькание в большом тексте не выглядело плотной темой и чтобы пачка повторов в большом тексте не выглядела весомее, чем она есть. Насыщение срезает добавку от лишних повторов. Длина напоминает, что в длинном тексте такие повторы ожидаемее, чем на короткой карточке.
Длину я беру из задачи. Короткий вопрос закрываю коротким ответом. Нужен ход мысли — пишу ход мысли. Воду вокруг ключа не нагоняю: она удлиняет страницу и не добавляет смысла. Пояснение, без которого человек не поймёт шаг, не вырезаю ради густоты слова. И в воде, и в обрезке я перестаю говорить о теме и начинаю говорить о форме страницы.
Короткая тёмная плита с коралловым ядром и длинная планка с одной точкой
Компактная плита с ядром и длинная лента с одной меткой — не одно и то же совпадение.

Части страницы я не сваливаю в одну кучу

Есть продолжение той же идеи, его называют BM25F. Страницу смотрят не одним мешком слов, а частями: заголовок, подзаголовки, основной текст. Слово в заголовке и слово в дальнем абзаце не обязаны весить одинаково. Я эту разницу вижу и без калькулятора. Заголовок называет тему страницы. Подзаголовок называет шаг. Тело шаг объясняет. Ключ по всем частям я не разношу. Если заголовок обещает шире, чем страница делает, я сужаю заголовок и новыми повторами его не подпираю.

Как я читаю черновик

ВопросЧто вижуЧто делаю
Тема названа там, где без имени непонятноСлово стоит у ответа и в заголовкеОставляю
Та же фраза открывает абзац за абзацемПовтор уже не добавляет мысльСнимаю лишние вхождения
Слово мелькнуло в длинном чужом разбореКасание одно, объём большойНе принимаю страницу за ответ на этот запрос
Текст раздут вокруг одного ключаОбъём не держит новую мысльУбираю воду и ключ не дописываю
Короткий текст по делуСлово в теме, пояснение на местеСтраницу ради длины не растягиваю
Буквы k1 и b из учебной формулы я на сайте не выставляю. Ими описывают, насколько резко повтор насыщается и насколько сильно в оценку входит длина. Это устройство модели, не поля проекта. Значения под страницу я не подбираю. Живая выдача считает своим закрытым способом, а абзац от подбора букв понятнее не становится.
  1. Записываю задачу запроса одним предложением и ищу на странице ответ
  2. Оставляю имя темы там, где без него непонятно, о чём речь
  3. Вычёркиваю повтор, который не добавляет мысль
  4. Смотрю длину: одно касание в длинном тексте не выдаю за тему страницы
  5. Сверяю заголовок с телом, чтобы обещание совпало со страницей

Чего я от BM25 не жду

Место в выдаче эта оценка не назначает. Текст может честно совпадать с запросом, а рядом будут другие страницы и другие сигналы, которых модель не видит. Я называю это совпадением с запросом и на этом останавливаюсь. Позицию из него не рисую и в заголовке не обещаю.
Подсветка частых слов чтение не заменяет. Сервис покажет, где фраза повторилась. Он не скажет, насытилась ли мысль и не мелькнуло ли слово в чужом длинном разборе. Догонять подсветку новыми вхождениями — идти против насыщения. Перед публикацией я читаю задачу, ответ и лишний повтор. Балл на полях не ставлю.
Тёмные плитки с коралловыми уголками на чёрном фоне
Перед публикацией сверяю тему, насыщение повтора и длину. Балл и место в эту сверку не входят.
SEO

Посмотрю повтор и длину страницы

Проверю, названа ли тема, не насыщен ли повтор одного слова и не выдаёт ли длинная страница одно касание за ответ. Место в выдаче не обещаю.
Интернет-маркетолог и автор материала
Читайте также