Когда говорят про ранжирование в Маркете, обычно сразу лезут в цену, рейтинг магазина, поведенческие. А ведь до всего этого товар должен просто оказаться в правильной ветке каталога. Если кофемашина уехала в "товары для дома / прочее", её не спасёт ни цена, ни отзывы - она физически не попадёт в нужную выдачу и фильтры. Поэтому я отдельно разобрал группу сигналов категоризации по исходникам товарной вертикали (дерево ya/extsearch/goods).
Сразу оговорюсь по матчасти. Само присвоение категории - это upstream: магазин отдаёт фид, в оффере есть categoryId и название, дальше идёт приём фида и матчинг в карточку модели (это происходит до того дерева кода, что я смотрю - в market/, не в goods/). А вот в реестре факторов goods/base/factors/factors_meta_gen.in лежит большая группа CATEGORY_CLSSFY_* - это уже признаки того, насколько уверенно товар сел в категорию и насколько его тексты этой категории соответствуют. Их report и подаёт в формулу.
Что нашлось в кодеДисклеймер. Это разбор по исходному коду вертикали goods, а не официальная формула Маркета. Ранжирует CatBoost/MatrixNet - дерево решений, у факторов нет фиксированных весов в процентах. Где пишу "сильный/слабый" - это качественная реконструкция по смыслу фактора, а не замер.
Костяк группы - семейство CATEGORY_CLSSFY_*. Это выходы текстового классификатора категорий: он смотрит на тексты товара (заголовок, описание, полный текст оффера, название категории) и оценивает, насколько они тянут на присвоенную категорию. Все они идут с тегами [TG_BASE, TG_DOCUMENT_CATEGORY, TG_TEXT_PLACE] - то есть это базовые признаки уровня документа, работающие в текстовой выдаче.
Код: Выделить всё
ФАКТОР СМЫСЛ (расшифровка)
-----------------------------------------------------------------------------
CATEGORY_CLSSFY_AM_PROB вероятность категории по модели (argmax-ветка)
CATEGORY_CLSSFY_AM_NORM_PROB та же вероятность, нормированная
CATEGORY_CLSSFY_AM_FOCUS "сфокусированность" - насколько уверенно
CATEGORY_CLSSFY_AM_NORM_FOCUS один класс выделяется над остальными
CATEGORY_CLSSFY_AM_COUNT сколько категорий-кандидатов всплыло
CATEGORY_CLSSFY_BAD_CATEGORY_PR_M оценка "плохой категории" (по имени категории)
CATEGORY_CLSSFY_BAD_TITLE_PR_M оценка "плохого" по заголовку
CATEGORY_CLSSFY_BAD_FULL_PR_M оценка "плохого" по полному тексту
-----------------------------------------------------------------------------
все: Tags [TG_BASE, TG_DOCUMENT_CATEGORY, TG_TEXT_PLACE]
Дальше идёт большой пласт текстовой близости товара к категории. Тут имена строятся комбинаторно по полям и метрикам:
Код: Выделить всё
ПОЛЕ ПРИМЕРЫ ФАКТОРОВ ЧТО МЕРЯЕТ
-----------------------------------------------------------------------------
TITLE CATEGORY_CLSSFY_B_TITLE_TF_IDF_M совпадение заголовка
CATEGORY_CLSSFY_BM_TITLE_CBPM с языком категории
DESCR CATEGORY_CLSSFY_B_DESCR_CBPMN то же по описанию
CATEGORY_CLSSFY_B_DESCR_TBPMN
FULL CATEGORY_CLSSFY_B_FULL_TF_IDF_MN по полному тексту оффера
CATEGORY_CLSSFY_B_FULL_OBPMN
CATEGORY CATEGORY_CLSSFY_B_CATEGORY_L1CBPM по тексту самой категории,
CATEGORY_CLSSFY_B_CATEGORY_L2CBPM с разбивкой по уровням L1/L2
MARKET CATEGORY_CLSSFY_B_MARKET_CBPMN маркетное представление
SUFFIX CATEGORY_CLSSFY_B_SUFFIX_CBPMN хвост названия (модель/вариант)
-----------------------------------------------------------------------------
TF_IDF / CBP / OBP / TBP - разные метрики близости текста к категории
L1 / L2 - уровни дерева каталога (верхний и более глубокий)
Отдельно стоит блок YA_MARKET_CATEGORY_NAME_* - это уже текстовая релевантность названия категории запросу пользователя (как товар-документ матчится на запрос через имя своей категории):
Код: Выделить всё
YA_MARKET_CATEGORY_NAME_FULL_MATCH_VALUE точное совпадение имени категории
YA_MARKET_CATEGORY_NAME_ALL_WCM_WEIGHTED_VALUE взвешенное покрытие слов
YA_MARKET_CATEGORY_NAME_BM15_MAX_ANNOTATION_K001 BM15-близость к запросу
-----------------------------------------------------------------------------
Tags: [TG_BASE, TG_TEXT_PLACE, TG_DOCUMENT_TEXT_MACHINE, TG_DELETE_CANDIDATE]
И ещё два, которые часто путают с классификатором, но это другое - это уже про выдачу, а не про присвоение категории товару:Важно: вся группа YA_MARKET_CATEGORY_NAME_* помечена тегом TG_DELETE_CANDIDATE. Это значит, что факторы стоят в очереди на выпил, их собираются убрать. Подавать их как надёжно рабочий рычаг нельзя - на них опираться рискованно, в любом поколении индекса они могут отвалиться. В реестре есть и активная альтернатива (QFUF_*_YA_MARKET_CATEGORY_NAME_* - те же сигналы, упакованные в общую QFUF-инфраструктуру текстовых факторов).
Код: Выделить всё
RANK_CATEGORY_BY_RELEVANCE_IN_TOP Tags [TG_CATEGORY]
-> "ранк категории в выдаче: сколько более релевантных категорий
встретилось в топе документов с базового" (есть в Description)
TRIGRAM_RATIO_CATEGORY Tags [TG_CATEGORY]
-> триграммная близость на уровне категории
Где сигнал сильный, где слабый
- Сильный и живой - ядро CATEGORY_CLSSFY_AM_PROB / AM_FOCUS и текстовые близости по TITLE и FULL. Это активные TG_BASE-факторы без меток смерти, и они напрямую отвечают на вопрос "товар реально из этой категории или его туда затолкали". Заголовок тут весит заметно: TITLE-срезов в группе больше всего.
- Средний - DESCR и MARKET-срезы. Описание помогает классификатору, когда заголовок куцый, но это вспомогательный текст.
- Под вопросом - вся ветка YA_MARKET_CATEGORY_NAME_* (TG_DELETE_CANDIDATE). Качественно сигнал понятен, но как рычаг ненадёжен.
- Не путать с классификацией - RANK_CATEGORY_BY_RELEVANCE_IN_TOP и BLUE_*_CATEGORY_ORDERS_*: первый про сортировку категорий в выдаче, вторые про спрос. Они не определяют, в какую ветку сел товар.
Хорошая новость: группа CATEGORY_CLSSFY работает по вашим же текстам. То есть это управляемо, без всякой магии.
- categoryId в фиде - выбирайте лист каталога максимально точно. Это обязательный атрибут оффера, и именно от него пляшет матчинг. Чем глубже и точнее лист, тем выше будут PROB/FOCUS.
- Заголовок (name) - кладите в него ключевой тип товара словами категории. Классификатор сильнее всего опирается на TITLE. "Эспрессо-кофемашина рожковая X" классифицируется чище, чем просто "X 1500W".
- Не мусорьте в названии посторонними категориями ("чехол + стекло + кабель" в одном name) - это размывает FOCUS и поднимает BAD_TITLE_PR.
- Описание (description) - дополняйте профильной лексикой категории, особенно когда заголовок короткий. Это докручивает DESCR-срезы.
- Передавайте больше параметров/характеристик. По практике 2025-2026 именно полнота карточки помогает офферу сесть на правильную модель и пройти фильтры категории.
- Следите за переразбивкой каталога. Маркет регулярно дробит категории (анонсировано разделение ряда категорий с 1 апреля 2026, та же история со "Средствами для стирки" -> порошки/капсулы). После такой переразбивки стоит перепроверить, что ваш categoryId не уехал в общий "прочее".
- При ошибке модерации категорию правят руками в карточке товара и шлют на повторную проверку - это нормальный рабочий процесс, не ждите, что само устаканится.
Что доказано кодом: группа факторов CATEGORY_CLSSFY_* существует, активна (TG_BASE, TG_DOCUMENT_CATEGORY, TG_TEXT_PLACE) и оценивает соответствие текстов товара присвоенной категории по полям TITLE/DESCR/FULL/CATEGORY/MARKET/SUFFIX. Факторы YA_MARKET_CATEGORY_NAME_* помечены TG_DELETE_CANDIDATE - на выпил. RANK_CATEGORY_BY_RELEVANCE_IN_TOP и TRIGRAM_RATIO_CATEGORY несут тег TG_CATEGORY и описанием подтверждены как сигналы уровня выдачи категорий, а не присвоения. BLUE_MODEL_ORDERS_IN_CATEGORY_ORDERS - это доля заказов модели в категории (подтверждено Description).
Итог простой. Категоризация - это не отдельная тёмная магия, а текстовая задача, которую вы кормите своими же name/description/categoryId. Точный лист каталога плюс честный заголовок со словами категории - и блок CATEGORY_CLSSFY работает на вас, а не против.Что реконструкция: расшифровка приставок (AM=argmax, B/BM, CBP/OBP/TBP, M/S/N, L1/L2) выведена из структуры имён - текстовых комментариев в реестре у этих факторов нет. Само присвоение categoryId и матчинг офферов в модели происходят upstream (market/), а не в дереве goods, которое я смотрел, - так что точную логику классификатора я не вижу, только его факторы-выходы. Силу сигналов оцениваю качественно: формула - это CatBoost, статических процентных весов у факторов нет, и любой "вес" был бы выдумкой.