Downloads · 30 days
7
12% of all-time downloads
Krasovskiy/anchor-words
anchor-words is a text classification model from Krasovskiy. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as apache-2.0.
Определяет, чем является слово в поисковом запросе: заведение, игра, способ оплаты, регион, предложение или обычное слово. Нужна затем, что страницу задаёт названная в запросе сущность, а не близость текстов: «betway…
Downloads · 30 days
7
12% of all-time downloads
All-time downloads
58
Public
Parameters
278M
1.1 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors1.1 GB · 98%
From the Hugging Face model README
Определяет, чем является слово в поисковом запросе: заведение, игра, способ оплаты, регион, предложение или обычное слово. Нужна затем, что страницу задаёт названная в запросе сущность, а не близость текстов: «betway bonus» и «casumo bonus» похожи почти дословно, но это две разные страницы.
Полное дообучение xlm-roberta-base, 278 млн параметров, шесть классов. На
RTX 4090 размечает 7825 слов в секунду — сорок тысяч слов ядра считаются за
секунды.
Слово в отрыве ничего не значит: «quatro» читается как числительное, «delta» как буква. Поэтому рядом идут запросы, в которых слово встречается, самые частотные первыми. Формат обязан совпадать до символа:
слово: betway
запрос: betway casino | betway login | betway canada | betway app | betway bonus
from transformers import AutoModelForSequenceClassification, AutoTokenizer
tok = AutoTokenizer.from_pretrained("Krasovskiy/anchor-words")
model = AutoModelForSequenceClassification.from_pretrained("Krasovskiy/anchor-words")
текст = "слово: betway\nзапрос: betway casino | betway login | betway canada"
метка = model.config.id2label[
model(**tok(текст, return_tensors="pt", truncation=True, max_length=64))
.logits.argmax(-1).item()]
Отложенная четверть, деление хешем от слова.
| класс | что это | F1 |
|---|---|---|
| WORD | обычное слово ниши | 0,906 |
| BRAND | заведение | 0,872 |
| GEO | страна, регион, город | 0,826 |
| PAY | способ оплаты | 0,824 |
| OFFER | вид предложения | 0,755 |
| PRODUCT | игра или вид игры | 0,538 |
Верных 85,8%, macro F1 0,787.
PRODUCT слабее всех, и это не случайность. Игра почти всегда называется
формой из нескольких слов — «book of ra», «sweet bonanza», «alaxe in
zombieland», — а модель отвечает про слово. Одиночное book или sweet
обычное, и разметка их таковыми и считает; страницу игры задаёт форма
целиком. Пользуйтесь каталогом игр там, где он есть.
Производителя игр от заведения по запросу отличить нельзя. У habanero,
stakelogic, spinomenal запросы вида «X casino» — ровно как у казино. Класс
PROVIDER в модель намеренно не включён: его закрывает справочник точным
совпадением, и это надёжнее любой догадки.
Модель не знает рынка, она знает текст. Мнение о слове «fun» или «bono» ненадёжно. В работающем инструменте её ответ — третий по старшинству источник после справочников и подсказок Google, а не первый.
Обучающая выборка размечена не человеком. Метки собраны из свидетельств: подтверждение подсказками, кураторские справочники, поведение слова в ядре. При проверке в выборке нашлись отравленные метки — родовые слова ниши стояли брендами из-за того, что составные имена справочника разбирались на слова. Ошибка исправлена, но происхождение меток стоит держать в уме.
Accuracy при таком дисбалансе врёт: обычных слов в ядре около четырёх пятых, и модель, метящая всё словом, получит 80%. Смотрите на полноту по классам — прежде всего, сколько имён модель не узнала.
anchor-pairs отвечает на
второй вопрос кластеризации: два запроса — одна страница или разные.
Числа выше сняты на отложенной выборке: слова, которых не было в обучении ни из одного источника. Это обычная проверка «умеет ли модель обобщать».
Есть второй замер, на нарочно трудном тесте: все 112 спорных случаев, которые разбирались вручную, плюс пятая часть остальной ручной разметки. Спорные — те, где два размечавших не сошлись, то есть ровно граница задачи. Там:
| baseline (эмбеддинги + логрегрессия) | anchor-words | |
|---|---|---|
| macro F1 | 0,4442 | 0,4632 |
Прибавка +0,019 при заявленном пороге в пять пунктов — то есть на границе задачи модель почти не помогает. Чтение 120 худших ошибок объяснило почему: часть «ошибок» — ошибки самой разметки, а провайдера игр от заведения по одному запросу отличить нельзя в принципе. «netent casino» — это раздел сайта, а не бренд, и понять это можно только из справочника.
Оба числа верны, просто отвечают на разные вопросы. Берите первое, если нужна разметка обычного ядра; второе — чтобы не ждать чуда на трудных случаях.
запрос: модель гадает: «quatro»
читается как числительное, «delta» как буква.Модель делает то, что заявлено. Но на канадском ядре казино (35 581 запрос) её метки оказались почти не нужны, и это надо знать заранее.
Разметку сущностей можно получить бесплатно, прямо из самих запросов:
| источник | что даёт | забрал запросов |
|---|---|---|
| соседство с родовым словом | spinz casino -> spinz | 12 205 |
| позиция в запросе | имя стоит первым словом, порог 80% | 8 686 |
| поведение | про оператора спрашивают login, bonus, app, withdrawal | 1 971 |
| форма есть и сама, и с родовым | all jackpots + all jackpots casino | 708 форм |
Разница между 7295 метками модели и 2548 метками из справочников составила 7 ключей из 35 581. Конвейер, собранный на правилах выше, дал 11 755 страниц против 14 684 у сборки с моделью, при этом 11 679 групп держатся на 100% плотности. Считается четыре секунды на процессоре.
Отдельно проверен холодный старт — новая ниша, где нет ни справочника брендов, ни кэша подсказок Google. Без них конвейер даёт 11 599 страниц против 11 755: правила подхватывают всё сами.
Значит модель осмысленна там, где правил построить нельзя: ядро без устойчивых родовых слов, ниша без повторяющихся имён, разметка отдельного слова вне контекста ядра. В типовой задаче «собрать контент-план по выгрузке» она проигрывает скрипту по всем измерениям, кроме одного — ей не нужен корпус, она размечает слово сразу.