anchor-pairs
Отвечает на один вопрос: закрываются ли два поисковых запроса одной страницей или им нужны разные.
Это не мера похожести. «casino ohne lizenz» и «casino ohne einzahlung» похожи почти дословно, но это разные страницы. «one dollar deposit» и «1 dollar deposit» не похожи по написанию, а страница у них одна.
Модель заточена под гемблинг-нишу. Там она обучалась, там и мерялась; цифры ниже относятся к ней.
Зачем
При сборке семантического ядра ключевые слова надо разложить по будущим страницам сайта. Отраслевой способ — смотреть пересечение выдачи: если у двух запросов 7+ общих адресов в топ-10, это одна страница. Способ рабочий, но платный: на каждый запрос нужен вызов к выдаче, а запросов десятки тысяч.
Здесь модель обучена на решениях, которые выдача уже приняла, и дальше работает без неё.
Чем меряли
Порог выбран по PR-AUC, а не по доле верных ответов: классы неравные, и «доля верных» на них лжёт.
Три модели на одной оценочной выборке (20 000 пар, 42% положительных, сплит по группам-страницам, пересечение ноль), порог у всех подобран на обучающей половине:
| модель | PR-AUC | точность при полноте 0.8 |
|---|---|---|
bge-m3, косинус эмбеддингов | 0,9129 | 0,8670 |
bge-reranker-v2-m3, готовый реранкер | 0,9234 | 0,8749 |
| anchor-pairs | 0,9636 | 0,9637 |
Сравнение именно с обученным реранкером, а не только с эмбеддером: побить эмбеддер кросс-энкодером — слабое достижение, они разного класса.
Разброс между тремя сидами 0,0084 при прибавке 0,04 — прибавка в пять раз больше шума. Обучение занимает две минуты на одной 4090.
MCC не приводим, и вот почему. У модели он выходит 0,5136 против 0,7183 у готового реранкера — хуже, хотя PR-AUC заметно выше. Причина не в качестве разделения, а в пороге: он подбирается на обучающей половине, которую модель видела при обучении, и оценки там завышены. У необученных моделей такого расхождения нет. Честный порог требует третьей части, отложенной и от обучения, и от теста; у нас её нет.
Прежняя редакция карточки приводила MCC 0,8065. Это число снято: оно было получено подбором порога на самой оценочной выборке, то есть подглядыванием в ответ. PR-AUC и точность при полноте от порога не зависят и остаются в силе.
На чём училась
1,2 млн пар, собранных из поведения конкурентов: какие запросы реально стоят на одной странице у тех, кто уже ранжируется. Не чьё-то мнение и не разметка по образцу.
- Сплит по группам-страницам, а не по парам. Иначе один и тот же запрос попадает и в обучение, и в проверку, и метрика показывает память, а не умение. Пересечение между частями — ноль.
- Тяжёлые негативы: пары из соседних страниц, а не случайные. На случайных задача вырождается — их отличает и мешок слов.
- Серая зона выдачи (2-6 общих адресов) выброшена: там нет ответа «да» или «нет», там ответ «соседние темы».
Где не работает
На чужих нишах она хуже базовой: PR-AUC 0,8723 против 0,9004 у bge-m3
на золоте из шести ниш (медицина, фриланс, B2B, веб-студия, медиа). Это не
изъян, а следствие задачи: её растили под гемблинг. Для другой ниши берите
базовую или переучите на своих данных.
Отдельно: провайдера игр от заведения по одному запросу отличить нельзя в принципе — «netent casino» это раздел, а не бренд. Эту границу закрывают справочники, а не модель.
Как пользоваться
from sentence_transformers import CrossEncoder
model = CrossEncoder("Krasovskiy/anchor-pairs")
pairs = [
["1 dollar deposit casino", "one dollar deposit casino canada"],
["best online casino ontario", "netent slots free play"],
]
print(model.predict(pairs))
Выше 0,5 — одна страница. Порог можно поднять, если важнее не склеить лишнего.
Родня
Krasovskiy/anchor-words— разметка слов запроса по типам (имя, гео, оплата, игра, оффер, провайдер);Krasovskiy/kwcluster-variables— код кластеризатора и справочники.
Где её место в конвейере: честный замер 26 августа 2026
PR-AUC 0,9641 не отменяется — на своей задаче модель работает. Но на
канадском ядре казино вопрос «одна страница или разные» удалось закрыть
дешевле и точнее точным вхождением формы: если запрос содержит другой
запрос ядра целиком (mgm casino ontario содержит mgm casino), это одна
страница, и вызывать модель незачем.
Конвейер на таких правилах дал 11 755 страниц, из них 11 679 с плотностью 100% — каждый запрос группы содержит её главное слово. Считается четыре секунды на процессоре, без видеокарты.
Модель остаётся полезной там, где точного вхождения нет: разные написания без общих слов, синонимы, разные языки в одном ядре. В нише с устойчивыми именами заведений её работу делает порядок слоёв.