Прежде чем говорить про антиспам, надо понять масштаб того, с чем мы имеем дело. В метаданных web_production числится 1923 фактора, но это не значит, что все они работают. Распределение по статусам выглядит так:
Код: Выделить всё
Статус Кол-во Доля
----------------------------------
Активен 437 ~23%
Устаревший 777
Не реализован 443
Не используется 143
Удалён 115
Не поддерживается 8
----------------------------------
Итого 1923
По каким группам распределены живые факторыРазмер списка факторов и размер действующей формулы - разные величины. Из 1923 имён работает примерно каждое четвёртое.
Если разложить действующие признаки по семействам, картина такая:
Код: Выделить всё
Группа Факторов
---------------------------
Annotation 133
Query 85
Xref 60
RapidClicks 33
TextBM25 26
RegDocStatic 23
RegHostStatic 17
LegacyTR 12
Domain 10
LinkBM25 9
Datetime 8
LegacyLR 7
BM25F 4
---------------------------
Где это всё считается: TG-теги формулы
Метаданные размечают, в каком блоке формулы фактор участвует. Ключевые теги:
Код: Выделить всё
Тег Кол-во Смысл
-----------------------------------------------------------
TG_L2 1346 основное ранжирование (L2)
TG_L3 30 финальный реранк (L3)
TG_NN_OVER_FEATURES_USE 1578 идёт в нейросеть над факторами
TG_TEXT_MACHINE 471 текстовая машина
TG_NEURAL 309 нейросетевой блок
TG_USERFEAT_90D 446 пользовательские фичи за 90 дней
TG_DEPRECATED 2117 помечено как устаревшее
TG_UNUSED 521 не используется
-----------------------------------------------------------
Практический смысл для SEO: нельзя выдернуть один признак, накачать его и ждать линейного прироста. Нейросеть над факторами видит сочетания. Документ с аномально высоким значением одного текстового признака на фоне слабых остальных - это для неё распознаваемый паттерн, и чаще паттерн переоптимизации.Линейных весов в привычном смысле уже почти нет. 1578 факторов идут в нейросеть-над-факторами - она нелинейно комбинирует признаки, и итоговый вклад любого отдельного фактора зависит от всех остальных.
AntiSeoUpperBound: потолок на повторе ключа
Теперь к сути. Самый показательный механизм антиспама в метаданных - это потолок переоптимизации. Идея простая: голый повтор точной формы запроса в документе упирается в потолок. Сколько раз ни вставь точное вхождение ключа, вклад текстовой релевантности перестаёт расти - функция выходит на плато.
Код: Выделить всё
// иллюстративная модель потолка (веса условны)
text_score = bm25f_contribution(doc, query)
exact_repeat = count_exact_form(doc, query)
// после порога повтор не даёт прироста
contribution = min(text_score, AntiSeoUpperBound)
// дальше - не просто плато, а штраф
if exact_repeat > threshold:
contribution -= overopt_penalty(exact_repeat)
Это полностью согласуется с архитектурой выше. Раз почти всё идёт в нейросеть над факторами, ей дёшево выучить форму нормального распределения вхождений ключа по релевантным документам и отлавливать хвост, где плотность аномальна. BM25F с его четырьмя живыми факторами даёт насыщающуюся по своей природе функцию - сверху на неё садится потолок, снизу подпирает поведение и анти-спам.
Накрутка поведения
Отдельно стоит группа RapidClicks (33 фактора) и пользовательские фичи TG_USERFEAT_90D (446). Поведение учитывается, но именно поэтому накрутка кликов так же наказуема, как и текстовый спам. Быстрые клики и пользовательские сигналы за 90 дней - это не только буст, но и материал для классификаторов фейковой активности. Аномальный профиль поведения распознаётся теми же нелинейными комбинациями.
Почему старые спам-классификаторы мертвы, а фильтрация жива
Самое интересное в утечке - что классические спам-факторы помечены как нерабочие:
Код: Выделить всё
Фактор Индекс Статус
-----------------------------------------
Spam2 [99] мёртв
SpamKarma [107] мёртв
NoSpam [52] мёртв
-----------------------------------------
IsFake [133] живёт
Разница принципиальная. Раньше спамность была числом, которое можно было реверс-инжинирить: вот фактор, вот его примерный вклад, оптимизируем вокруг порога. Сейчас значительная часть антиспама - это операционная фильтрация (отдельный слой, не один из 1923 ранжирующих признаков) плюс способность нейросети над факторами распознавать паттерны переоптимизации по сочетанию обычных сигналов. Reverse-engineering такого устройства почти невозможен: нет одного числа, которое можно подкрутить. IsFake [133] остаётся как явный признак фейковости, но это вершина айсберга, а не вся защита.Старые спам-факторы (Spam2 [99], SpamKarma [107], NoSpam [52]) мертвы как отдельные сигналы. Но фильтрация не исчезла - она стала операционной и частично растворилась в нейросети над факторами. IsFake [133] - живой пример того, что осталось на уровне признаков.
Что из этого следует
- Точное вхождение ключа имеет потолок (AntiSeoUpperBound). Наращивать плотность точной формы после насыщения бессмысленно, а после порога - вредно: включается штраф за переоптимизацию.
- Линейной накрутки одного фактора не существует - 1578 признаков идут в нейросеть над факторами, вклад нелинеен и контекстен. Аномалия по одному сигналу на фоне слабых остальных читается как спам-паттерн.
- Накрутка поведения (RapidClicks, USERFEAT_90D) наказуема симметрично текстовому спаму - это и буст, и материал для классификаторов фейка.
- Не ориентируйтесь на мёртвые факторы. Spam2 [99], SpamKarma [107], NoSpam [52] и три четверти списка - археология. Работают ~437 активных признаков.
- Антиспам нельзя обойти точечно: отдельных спам-скаляров почти не осталось, защита операционная и распределённая.
Дисклеймер: веса в псевдокоде иллюстративны, реальные коэффициенты обучаемы и проприетарны. Всё изложенное - реконструкция по метаданным факторов web_production (1923 имени), а не воспроизведение действующей формулы.