Когда твоя работа — создавать что-то красивое, о ней можно особенно не рассказывать, потому что результат у всех перед глазами. А вот если ты стираешь надписи с заборов, твою работу никто не замечает, пока заборы выглядят прилично или пока ты не сотрёшь что-нибудь не то.

Любой сервис, где можно оставить комментарий, отзыв, отправить сообщение или загрузить картинки, рано или поздно сталкивается с проблемой спама, мошенничества и нецензурщины. Этого не избежать, но с этим нужно бороться.

Меня зовут Михаил, я работаю в команде Антиспама, которая защищает пользователей сервисов Яндекса от подобных проблем. Наша работа редко бывает заметна (и хорошо!), поэтому сегодня я расскажу о ней подробнее. Вы узнаете, в каких случаях бесполезна модерация и почему точность — не единственный показатель её эффективности. А ещё мы поговорим о мате на примере кошек и собак и о том, почему иногда полезно «мыслить как матерщинник».

В Яндексе появляется всё больше сервисов, где пользователи публикуют свой контент. Можно задать вопрос или написать ответ в Яндекс.Кью, обсудить новости двора в Яндекс.Районе, поделиться дорожной обстановкой в разговорчиках на Яндекс.Картах. Но когда аудитория сервиса растёт, он становится привлекательным для мошенников и спамеров. Они приходят и заполняют комментарии: предлагают лёгкий заработок, рекламируют чудодейственные средства и обещают социальные выплаты. Из-за спамеров одни пользователи теряют деньги, а другие — желание проводить время на неухоженном, заросшем спамом сервисе.

И это не единственная проблема. Мы стремимся не только оградить пользователей от мошенников, но и создать комфортную атмосферу для общения. Если люди в комментариях сталкиваются с матом и оскорблениями, они с большой вероятностью уйдут и больше не вернутся. Значит, с этим тоже нужно уметь бороться.

Чистый Веб


Как это у нас часто бывает, первые наработки родились в Поиске, в той части, которая борется со спамом в выдаче. Ещё лет десять назад там появилась задача фильтрации взрослого контента для семейного поиска и для запросов, не предполагающих ответы из категории 18+. Так появились первые, вручную набранные словари порно и мата, их пополняли аналитики. Основной задачей была классификация запросов на те, где допустимо показывать взрослый контент и где нет. Под эту задачу собирали разметку, строили эвристики, обучали модели. Так появились первые наработки для фильтрации нежелательного контента.

Со временем в Яндексе стал появляться UGC (user generated content) — сообщения, которые пишут сами пользователи, а Яндекс только публикует. По описанным выше причинам многие сообщения нельзя было публиковать не глядя — требовалась модерация. Тогда решили сделать сервис, который бы предоставлял защиту от спама и злоумышленников для всех UGC-продуктов Яндекса и использовал наработки для фильтрации нежелательного контента в Поиске. Сервис назвали «Чистый Веб».

Новые задачи и помощь толокеров


Сначала у нас работала только простая автоматика: сервисы присылали нам тексты, а мы прогоняли на них словари мата, словари порно и регулярки — аналитики составляли всё вручную. Но сервис со временем применялся во всё большем числе продуктов Яндекса, и нам пришлось учиться работать с новыми проблемами.

Часто вместо отзыва пользователи публикуют бессмысленный набор букв, пытаясь накрутить себе ачивку, иногда рекламируют свою компанию в отзывах о компании конкурента, а иногда просто путают организации и в отзыве о зоомагазине пишут: «Прекрасно приготовленная рыба!». Возможно, когда-нибудь искусственный интеллект научится идеально улавливать смысл любого текста, но сейчас автоматика порой справляется хуже человека.

Стало ясно, что без ручной разметки тут не обойтись, и мы пристроили к нашему контуру вторую ступень — отправку на ручную проверку человеком. Туда попадали те опубликованные тексты, в отношении которых классификатор не увидел проблем. Масштабы такой задачи вы можете себе легко представить, поэтому мы не только положились на асессоров, но и воспользовались «мудростью толпы», то есть обратились за помощью к толокерам. Именно они помогают нам выявлять то, что упустила машина, и тем самым обучают её.

Умное кэширование и LSH-хэширование


Ещё одна проблема, с которой мы столкнулись при работе с комментариями, — спам, а точнее, его объёмы и скорость распространения. Когда аудитория Яндекс.Района стала быстро расти, туда пришли спамеры. Они научились обходить регулярки, слегка меняя текст. Спам, конечно же, всё равно находили и удаляли, но в масштабах Яндекса размещённое даже на 5 минут неприемлемое сообщение могли увидеть сотни человек.



Нас, конечно же, это не устраивало, и мы сделали умное кэширование текстов на основе LSH (locality-sensitive hashing). Работает это так: мы нормализовывали текст, выкидывали из него ссылки и резали его на n-граммы (последовательности из n букв). Дальше считали хэши от n-грамм, а по ним уже строили LSH-вектор документа. Смысл в том, что похожие тексты, даже если их немного изменили, превращались в похожие векторы.

Это решение позволило переиспользовать вердикты классификаторов и толокеров для похожих текстов. При спам-атаке, как только первое сообщение проходило проверку и попадало в кэш с вердиктом «спам», все новые подобные сообщения, даже видоизменённые, получали тот же вердикт и удалялись автоматически. Позднее мы научились обучать и автоматически переобучать классификаторы спама, но этот «умный кэш» остался с нами и до сих пор нас часто выручает.

Классификатор хороших текстов


Не успев передохнуть от борьбы со спамом, мы осознали, что 95% контента у нас модерируется вручную: классификаторы реагируют только на нарушения, а большинство текстов хорошие. Мы нагружаем толокеров, которые в 95 случаях из 100 ставят оценку «Всё ОК». Пришлось заняться непривычной работой — делать классификаторы хорошего контента, благо разметки за это время накопилось достаточно.

Первый классификатор выглядел так: лемматизируем текст (приводим слова к начальной форме), выкидываем все служебные части речи и применяем заранее заготовленный «словарь хороших лемм». Если в тексте все слова «хорошие», значит, и текст целиком не содержит нарушений. На разных сервисах такой подход сразу дал от 25 до 35% автоматизации ручной разметки. Конечно, такой подход не идеален: несложно скомбинировать несколько невинных слов и получить очень обидное высказывание, но он позволил нам быстро выйти на хороший уровень автоматизации и дал время обучить более сложные модели.

Следующие версии классификаторов хороших текстов уже включали в себя и линейные модели, и решающие деревья, и их комбинации. Для разметки грубостей и оскорблений мы, например, пробуем нейросеть BERT. Тут важно уловить значение слова в контексте и связь слов из разных предложений, и BERT неплохо справляется с этим. (Кстати, недавно коллеги из Новостей рассказывали, как применяют технологию для нестандартной задачи — поиска ошибок в заголовках.) В итоге удалось автоматизировать до 90% потока в зависимости от сервиса.

Точность, полнота и скорость


Чтобы развиваться, нужно понимать, какую пользу приносят те или иные автоматические классификаторы, изменения в них, а также не деградирует ли качество ручных проверок. Для этого мы применяем показатели точности и полноты.

Точность — это доля корректных вердиктов среди всех вердиктов о плохом контенте. Чем выше точность, тем меньше ложных срабатываний. Если не следить за точностью, то в теории можно удалить весь спам и мат, а вместе с ними — половину хороших сообщений. С другой стороны, если опираться только на точность, то лучшей окажется та технология, которая вообще никого не ловит. Поэтому есть ещё показатель полноты: доля выявленного плохого контента среди всего объёма плохого контента. Эти две метрики уравновешивают друг друга.

Для измерения мы сэмплируем весь входящий поток по каждому сервису и отдаём выборки контента асессорам для экспертной оценки и сравнения с решениями машины.

Но есть ещё один важный показатель.

Выше я писал, что неприемлемое сообщение даже за 5 минут могут увидеть сотни человек. Поэтому мы считаем, сколько раз мы успели показать людям плохой контент до того, как скрыли его. Это важно, потому что недостаточно работать качественно — нужно работать ещё и быстро. И когда мы строили защиту от мата, то ощутили это в полной мере.

Антимат на примере кошечек и собачек


Небольшое лирическое отступление. Кто-то может сказать, что нецензурщина и оскорбления не так опасны, как вредоносные ссылки, и не так раздражают, как спам. Но мы стремимся поддерживать комфортные условия для общения миллионов пользователей, а люди не любят возвращаться туда, где их оскорбляют. Не зря запрет мата и оскорблений прописан в правилах многих сообществ, в том числе и на Хабре. Но мы отвлеклись.

Словари мата не справляются со всем богатством русского языка. Несмотря на то что есть всего четыре основных матерных корня, из них можно составить несметное число слов, которое не поймаешь никакими регулярками. К тому же можно писать транслитом часть слова, заменять буквы похожими сочетаниями, переставлять буквы, добавлять звёздочки и т. д. Иногда без контекста в принципе нельзя определить, что пользователь имел в виду матерное слово. Мы уважаем правила Хабра, поэтому продемонстрируем это не на живых примерах, а на котиках и собачках.



«Ляу», — сказал котик. Но мы понимаем, что котик сказал другое слово…

Мы стали думать об алгоритмах «нечёткого матчинга» нашего словаря и о более умном препроцессинге: приводили транслит, склеивали пробелы и пунктуацию, искали паттерны и писали на них отдельные регулярки. Такой подход приносил результаты, но часто снижал точность, не давая желаемой полноты.

Тогда мы решили «мыслить как матерщинники». Мы начали сами вносить шум в данные: переставляли буквы, генерировали опечатки, заменяли буквы похожими по написанию и так далее. Начальную разметку для этого брали, применяя словари мата к большим корпусам текстов. Если взять одно предложение и исковеркать его несколькими способами, получится уже много предложений. Так можно увеличить обучающую выборку в десятки раз. Оставалось лишь обучить на полученном пуле какую-нибудь более-менее умную модель, учитывающую контекст.



О финальном решении пока говорить рано. Мы всё ещё экспериментируем с подходами к этой проблеме, но уже видим, что простая символьная свёрточная сеть из нескольких слоёв ощутимо превосходит словари и регулярки: получается увеличить и точность, и полноту.

Конечно, мы понимаем, что всегда найдутся способы обойти даже самую продвинутую автоматику, особенно когда дело столь азартно: написать так, чтобы глупая машина не поняла. Здесь, как и при борьбе со спамом, у нас нет цели искоренить саму возможность написать что-нибудь нецензурное, наша задача — сделать так, чтобы игра не стоила свеч.

Открыть возможность делиться своим мнением, общаться и комментировать — нетрудно. Куда сложнее добиться безопасных, комфортных условий и уважительного отношения к людям. А без этого не будет развития любого сообщества.