kwtopic-pairs — одна страница или разные
Кросс-энкодер, который отвечает на один вопрос: эти два поисковых запроса должны попасть на одну страницу сайта или на разные?
A cross-encoder that answers a single question: should these two search queries land on the same page of a website, or on different ones? Trained on 25 797 human-labelled query pairs from six niches, mostly Russian and Ukrainian. It is a layer inside a keyword-clustering pipeline, not a general-purpose reranker — see the limitations, they are specific and they matter.
Зачем она нужна
Семантику обычно кластеризуют эмбеддингами: похожие по вектору запросы падают в одну группу. Но «похожи» и «одна страница» — разные вещи. Модель учили именно на этой границе, по группировкам, которые человек сделал руками.
Сильная сторона — не слить похожее, а выгнать со страницы то, что туда не относится: в рабочем инструменте разделение групп моделью дало больший прирост, чем слияние.
Что показала на тесте
Тест — 2475 пар из тех же ниш; запросы с обучающими не пересекаются, утечка между частями проверяется отдельно.
| точность | полнота | F1 | верных | |
|---|---|---|---|---|
| эмбеддинги базовой модели + подобранный порог | 75,7% | 79,1% | 77,4% | 77,1% |
| этот кросс-энкодер | 82,9% | 84,0% | 83,4% | 83,4% |
Обучение — 87 секунд на RTX 4090.
Вклад в готовый контент-план, попарная сверка с ручной группировкой человека:
- разделение групп моделью: F1 плана на медицинской нише 59% → 83,7%;
- слияние групп моделью: полнота 37,5% → 57,4%.
Как пользоваться
from sentence_transformers import CrossEncoder
model = CrossEncoder("Krasovskiy/kwtopic-pairs", max_length=64)
print(model.predict([
("мрт головного мозга", "мрт головного мозга цена"),
("мрт головного мозга", "мрт коленного сустава"),
("замовити лендінг", "лендінг під ключ"),
("seo продвижение сайта", "seo продвижение интернет магазина"),
]))
# [0.97 0.03 0.95 0.06]
Ответ — вероятность от 0 до 1: единица означает «одна страница».
Что она видит и где ошибается
Настоящие ответы модели, не придуманные:
| пара | ответ | верно? |
|---|---|---|
мрт головного мозга · мрт головного мозга цена | 0.97 | да, одна страница |
мрт головного мозга · мрт коленного сустава | 0.03 | да, разные |
логотип на заказ · визитка на заказ | 0.03 | да, разные |
seo продвижение сайта · seo продвижение интернет магазина | 0.06 | да, разные — тонкий случай |
замовити лендінг · лендінг під ключ | 0.95 | да, одна |
доставка пиццы киев · доставка пиццы харьков | 0.98 | нет, это разные гео-страницы |
купить iphone 15 · купить iphone 16 | 0.94 | нет, разные товары |
5 dollar deposit casino · 50 dollar deposit casino | 0.96 | нет, разные суммы |
bonus code · promo code | 0.09 | нет, это одна страница |
Закономерность видна: пары, различающиеся только числом, гео или брендом внутри одинакового шаблона, модель сливает. Она смотрит на форму запроса, а разницу здесь несёт значение переменной, а не форма.
Отсюда правило применения: переменные вынимаются из запроса до модели. Сумма, город, модель товара, имя компании — это отдельный слой, факт из текста запроса, и он сильнее любой догадки. Модель зовут после него, на то, что осталось.
Обратный случай (bonus code · promo code — синонимы в незнакомой нише)
закрывается фактом с другой стороны: если конкурент держит оба запроса на
одном адресе, решение уже принято поисковиком.
Пороги
| задача | порог | почему такой |
|---|---|---|
| максимум верных ответов на паре | 0.29 | подобран на отложенной части |
| слить две группы | 0.9 | склейка ошибается дорого: две темы на одной странице заметнее, чем одна тема на двух |
| выгнать запрос из группы | 0.7 | ниже — запрос уходит на свою страницу |
Пороги для склейки и разделения подбирались на пяти нишах по готовому плану, а не по парам: выигрыш на парах регулярно не означает выигрыша на плане.
Как применять к ядру
Всех пар в ядре из 30 тысяч запросов больше четырёхсот миллионов — гонять модель по ним нельзя. Только по кандидатам:
- внутри собранной группы — каждый запрос против главного запроса группы;
- на границах соседних групп — их главные запросы между собой.
Порядка сотни тысяч пар, считается за минуты.
Как обучалась
База: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2,
12 слоёв, 384 измерения. Вход обрезан до 64 токенов — запросы короткие.
Две эпохи, батч 64, BinaryCrossEntropyLoss.
Данные: kwtopic-pairs-dataset — 25 797 пар из шести ниш — веб-студия, биржа фриланса, новостной портал, две медицинские тематики, B2B-сервис. Кириллицей написаны 18 360 пар, латиницей 7437. Деление: 20 563 обучение, 2759 проверка, 2475 тест.
Положительные пары — запросы, которые человек своей рукой положил в одну
группу. Отрицательные — из разных групп, причём 65% трудные: у пары есть
общее слово (цена, заказать, online, мрт, jobs), и по пересечению
слов их не различить.
Датасет проходит десять проверок, и обучение не стартует, пока все десять не зелёные:
- нет утечки запросов между частями — сплит назначается запросу, а не группе (на этом уже обжигались: утекало 81% теста);
- классы сбалансированы в каждой части;
- нет пар запроса с самим собой, противоречиво размеченных и повторов;
- больше половины отрицательных — трудные;
- ни одна ниша не занимает больше половины выборки;
- все ниши есть в обучающей части.
Ограничения
- Числа, гео и бренды внутри одинакового шаблона сливаются — см. таблицу выше. Выносите их отдельным слоем.
- Не знает вашей ниши. Обучающие ниши — услуги, медицина, B2B, медиа. На товарных каталогах с артикулами и размерами проверьте на своём эталоне прежде, чем ставить в работу.
- Не заменяет факты. Есть выдача — какая страница конкурента ранжируется по запросу — она весомее модели: там решение принял поисковик. Модель нужна там, где фактов нет.
- Вложенные имена (
northstarиnorthstar bets) различает плохо. - Работает по паре, а не по группе: не скажет, на сколько частей резать группу, только относится ли запрос к её ядру.
- Языки за пределами обучающих (арабский, греческий, романская группа) наследуются от базовой модели и на этой задаче не мерились.
Лицензия и происхождение
Apache 2.0, как у базовой модели. Обучающие пары выложены отдельно: Krasovskiy/kwtopic-pairs-dataset — 25 797 пар, шесть ниш, десять проверок качества, CC BY 4.0. Названия проектов там обобщены до типа ниши.
Модель — слой инструмента kwtopic, который собирает контент-план из выгрузок
ключевых слов и у каждой группы записывает основание: по факту она собрана или
по догадке.