Instructions to use Krasovskiy/anchor-pairs with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use Krasovskiy/anchor-pairs with sentence-transformers:
from sentence_transformers import CrossEncoder model = CrossEncoder("Krasovskiy/anchor-pairs") query = "Which planet is known as the Red Planet?" passages = [ "Venus is often called Earth's twin because of its similar size and proximity.", "Mars, known for its reddish appearance, is often referred to as the Red Planet.", "Jupiter, the largest planet in our solar system, has a prominent red spot.", "Saturn, famous for its rings, is sometimes mistaken for the Red Planet." ] scores = model.predict([(query, passage) for passage in passages]) print(scores) - Notebooks
- Google Colab
- Kaggle
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% — каждый запрос группы содержит её главное слово. Считается четыре секунды на процессоре, без видеокарты.
Модель остаётся полезной там, где точного вхождения нет: разные написания без общих слов, синонимы, разные языки в одном ядре. В нише с устойчивыми именами заведений её работу делает порядок слоёв.
- Downloads last month
- 19
Model tree for Krasovskiy/anchor-pairs
Base model
FacebookAI/xlm-roberta-base