![](https://habrastorage.org/webt/gv/wm/fc/gvwmfcfhoghu07zpqtdm_7onhwk.gif)
Каждый сервис, чьи пользователи могут создавать собственный контент (UGC — User-generated content), вынужден не только решать бизнес-задачи, но и наводить порядок в UGC. Плохая или некачественная модерация контента в итоге может уменьшить привлекательность сервиса для пользователей, вплоть до прекращения его работы.
Сегодня мы вам расскажем про синергию между Юлой и Одноклассниками, которая помогает нам эффективно модерировать объявления в Юле.
Синергия вообще штука очень полезная, а в современном мире, когда технологии и тренды меняются очень быстро, она может превратиться в палочку-выручалочку. Зачем тратить дефицитные ресурсы и время на изобретение того, что до тебя уже изобрели и довели до ума?
Так же подумали и мы, когда перед нами во весь рост встала задача модерации пользовательского контента — картинок, текста и ссылок. Наши пользователи каждый день загружают в Юлу миллионы единиц контента, и без автоматической обработки промодерировать все эти данные вручную вообще не реально.
Поэтому мы воспользовались уже готовой платформой модерации, которую к тому времени наши коллеги из Одноклассников допилили до состояния «почти совершенство».
Почему Одноклассники?
Ежедневно в социальную сеть приходят десятки миллионов пользователей, которые публикуют миллиарды единиц контента: от фотографий до видео и текстов. Платформа модерации Одноклассников помогает проверять очень большие объёмы данных и противодействовать спамерам и ботам.
Команда модерации ОК накопила очень большой опыт, поскольку совершенствует свой инструмент уже 12 лет. Важно, что они не только могли поделиться своими готовыми решениями, но и настроить архитектуру своей платформы под наши специфические задачи.
![](https://habrastorage.org/getpro/habr/post_images/e97/5f7/6dd/e975f76dd5707903ec24311f12ea9460.png)
Дальше для краткости будем называть платформу модерации ОК просто «платформа».
Как всё устроено
Между Юлой и Одноклассниками обмен данными налажен через Apache Kafka.
Почему мы выбрали этот инструмент:
- В Юле все объявления проходят постмодерацию, поэтому изначально синхронный ответ не требовался.
- Если случится лютый абзац, и Юла или Одноклассники будут недоступны, в том числе из-за каких-нибудь пиковых нагрузок, то данные из Kafka никуда не пропадут и позже их можно будет дочитать.
- Платформа уже была интегрирована с Kafka, поэтому большинство вопросов безопасности оказались решены.
![](https://habrastorage.org/getpro/habr/post_images/16e/23c/373/16e23c373dcb19e65610e89fc9625f92.png)
На каждое созданное или измененное пользователем объявление в Юле формируется JSON с данными, который кладется в Kafka для последующей модерации. Из Kafka объявления загружаются в платформу, где по ним выносятся решения автоматически или вручную. Плохие объявления блокируются с указанием причины, а те, в которых платформа не нашла нарушений, помечаются как «хорошие». Затем все решения отправляются обратно в Юлу и применяются в сервисе.
В итоге, для Юлы всё сводится к простым действиям: отправить объявление в платформу Одноклассников и обратно получить резолюцию «ок», или почему не «ок».
Автоматическая обработка
Что происходит с объявлением после того, как оно попадает в платформу? Каждое объявление разбивается на несколько сущностей:
- название,
- описание,
- фотографии,
- выбранная пользователем категория и подкатегория объявления,
- цена.
![](https://habrastorage.org/getpro/habr/post_images/25d/e18/88a/25de1888a0e4eb2c38590538c7dfa171.png)
Затем по каждой сущности платформа проводит кластеризацию, чтобы найти дубликаты. Причём текст и фотографии кластеризуются по разным схемам.
Тексты перед кластеризацией нормализуются, чтобы выкинуть спецсимволы, измененные буквы и прочий мусор. Полученные данные разбиваются на N-граммы, каждая из которых хэшируется. В итоге получается множество уникальных хэшей. Схожесть между текстами считается по мере Жаккара между двумя получившимися множествами. Если схожесть больше пороговой, то тексты склеиваются в один кластер. Для ускорения поиска похожих кластеров используется MinHash и Locality-sensitive hashing.
Для фотографий придуманы различные варианты склейки изображений, от сравнения pHash картинок до поиска дубликатов с помощью нейронной сети.
Последний способ самый «суровый». Для обучения модели подбирались такие тройки изображений (N, A, P), в которых N не похож на А, а P — похож на А (является полудубликатом). Затем нейросеть училась делать так, чтобы A и P были максимально близки, а A и N — максимально далеки. Так получается меньше ложных срабатываний по сравнению с тем, чтобы просто взять эмбеддинги от предобученной сети.
Когда нейросеть получает на вход картинки, она для каждой из них генерирует N(128)-мерный вектор и делается запрос на оценку близости изображения. Далее рассчитывается порог, при котором близкие изображения считаются дубликатами.
Модель умеет мастерски находить спамеров, которые специально фотографируют один и тот же товар с разных ракурсов, чтобы обойти сравнение по pHash.
![](https://habrastorage.org/getpro/habr/post_images/a58/fcc/816/a58fcc81654f63226c8a112b0adcf384.gif)
![](https://habrastorage.org/getpro/habr/post_images/417/81f/b0c/41781fb0ca7e7769a69c3b9f9acd3c2e.gif)
Пример спамерских фото, склеенных нейронной сетью как дубликаты.
На конечном этапе дубликаты объявлений ищутся одновременно и по тексту, и по изображению.
Если в кластере склеиваются два и более объявления, система запускает автоматическую блокировку, которая по определённым алгоритмам выбирает, какие дубликаты удалить, а какие оставить. Например, если у двух пользователей в объявлении одинаковые фотографии, то система заблокирует более свежее объявление.
После создания все кластеры проходят через ряд автоматических фильтров. Каждый фильтр выставляет кластеру количество очков (score): с какой вероятностью тот содержит угрозу, которую выявляет этот фильтр.
Например, система анализирует описание в объявлении и выбирает для него потенциальные категории. Затем берёт ту, у которой максимальная вероятность, и сравнивает с категорией, которую указал автор объявления. Если они не совпадают, объявление блокируется за неверную категорию. А поскольку мы добрые и честные, то прямо говорим пользователю, какую категорию ему нужно выбрать, чтобы объявление прошло модерацию.
![](https://habrastorage.org/getpro/habr/post_images/edc/401/0b7/edc4010b71a2ad510cdeaa73541fa34b.jpg)
Уведомление о блокировке за неправильную категорию.
В нашей платформе машинное обучение чувствует себя как дома. К примеру, с его помощью мы ищем в названиях и описаниях запрещенные в РФ товары. А модели нейронных сетей придирчиво «разглядывают» изображения, нет ли на них URL-адресов, спамерских текстов, телефонов и всё той же «запрещёнки».
Для случаев, когда запрещенный товар пытаются продать, замаскировав под что-то легальное, и при этом нет никакого текста ни в названии, ни в описании, мы используем тегирование изображений. Для каждого изображения могут быть проставлены до 11 тысяч различных тегов, описывающих, что находится на изображении.
![](https://habrastorage.org/getpro/habr/post_images/a8f/40e/352/a8f40e352f12236e3ed6b0f0d853c3de.png)
Кальян пытаются продать, замаскировав его под самовар.
Параллельно со сложными фильтрами работают и простые, решающие очевидные задачи, связанные с текстом:
- антимат;
- детектор URL-адресов и телефонных номеров;
- упоминание мессенджеров и других контактов;
- заниженная цена;
- объявления, в которых ничего не продаётся, и т.д.
Сегодня каждое объявление проходит через мелкое сито из более чем 50 автоматических фильтров, которые пытаются найти в объявлении что-то плохое.
Если ни один из детекторов не сработал, то в Юлу отправляется ответ, что с объявлением, «скорее всего», полный порядок. Мы этот ответ применяем у себя, и пользователям, которые подписались на продавца, приходит уведомление о появлении нового товара.
![](https://habrastorage.org/getpro/habr/post_images/6cb/1bd/df7/6cb1bddf7922b4341a6b506c138967a4.jpg)
Уведомление о том, что у продавца появился новый товар.
В итоге, каждое объявление «обрастает» метаданными, часть из которых генерируется при создании объявления (IP-адрес автора, user-agent, платформа, геолокация и т.д.), а остальное — это score, выданные каждым фильтром.
Очереди объявлений
Когда объявление попадает в платформу, система кладёт его в одну из очередей. Каждая очередь формируется с помощью математической формулы, которая комбинирует метаданные объявления таким образом, чтобы обнаружить какой-нибудь плохой паттерн.
Например, можно создать очередь объявлений в категории «Сотовые телефоны» от пользователей Юлы якобы из Санкт-Петербурга, но при этом их IP-адреса из Москвы или других городов.
![](https://habrastorage.org/getpro/habr/post_images/a0a/371/bb7/a0a371bb7190da1f05091aafb46c9a49.png)
Пример объявлений, размещенных одним пользователем в разных городах.
Или можно формировать очереди на основе баллов, которые нейросеть присваивает объявлениям, расставляя их по убыванию.
Каждая очередь, согласно своей формуле, присваивает итоговый score объявлению. Дальше можно действовать по-разному:
- указать пороговое значение, при котором объявление будет получать определенный тип блокировки;
- все объявления в очереди отправить модераторам на ручную проверку;
- или скомбинировать предыдущие варианты: указать порог автоматической блокировки и отправить модераторам те объявления, которые не достигли этого порога.
![](https://habrastorage.org/getpro/habr/post_images/820/3ff/208/8203ff208730d6a1545c0aa566993072.png)
Зачем нужны эти очереди? Допустим, пользователь загрузил фотографию огнестрельного оружия. Нейросеть присваивает ей score от 95 до 100 и с 99-процентной точностью определяет, что на картинке оружие. Но если значение score ниже 95 %, точность модели начинает снижаться (такова особенность моделей нейросетей).
В результате формируется очередь на основе score модели, и те из объявлений, которые получили от 95 до 100, автоматически блокируются как «Запрещенный товар». Объявления с количеством баллов ниже 95 отправляются на ручную обработку модераторам.
![](https://habrastorage.org/getpro/habr/post_images/96d/afe/daa/96dafedaa71985dec8936d165adba45e.jpg)
Шоколадная Beretta с патронами. Только для ручной модерации! :)
Ручная модерация
На начало 2019 года около 94 % всех объявлений в Юле модерируются автоматически.
![](https://habrastorage.org/getpro/habr/post_images/72d/e8a/3b7/72de8a3b797ff792e14bb3f29eeb299f.png)
Если платформа не может определиться с какими-то объявлениями, то отправляет их на ручную модерацию. Одноклассники разработали собственный инструмент: в заданиях для модераторов сразу отображается вся необходимая информация для принятия быстрого решения — объявление годное или стоит его заблокировать с указанием причины.
А чтобы при ручной модерации не страдало качество сервиса, работа людей постоянно контролируется. Например, в потоке заданий модератору показываются «ловушки» — объявления, по которым уже есть готовые решения. Если решение модератора не совпадает с готовым, модератору засчитывают ошибку.
На проверку одного объявления модератор в среднем тратит 10 секунд. При этом количество ошибок составляет не более 0,5 % от всех проверенных объявлений.
Народная модерация
Коллеги из Одноклассников пошли ещё дальше, воспользовались «помощью зала»: написали для соцсети приложение-игру, в котором можно быстро размечать большое количество данных, выделяя какой-то плохой признак, — Модератор Одноклассников (https://ok.ru/app/moderator). Хороший способ воспользоваться помощью пользователей ОК, которые стараются сделать контент приятнее.
![](https://habrastorage.org/getpro/habr/post_images/307/195/e4b/307195e4b7a02f9b9d5dbe64fb0e0e3e.png)
Игра, в которой пользователи отмечают фотографии, на которых есть номер телефона.
Любую очередь объявлений в платформе можно перенаправить в игру Модератор Одноклассников. Всё, что размечают пользователи игры, затем поступает внутренним модераторам на проверку. Такая схема позволяет блокировать объявления, по которым еще не созданы фильтры, и попутно создавать обучающие выборки.
Хранение результатов модерации
Мы сохраняем все принятые при модерации решения, чтобы потом не обрабатывать повторно те объявления, по которым уже выносили какое-то решение.
Ежедневно по объявлениям создаются миллионы кластеров. Со временем каждый кластер получает отметку «хороший» или «плохой». Каждое новое объявление или его редакция, попадая в кластер с отметкой, автоматически получает резолюцию самого кластера. Таких автоматических резолюций в сутки набегает около 20 тысяч.
![](https://habrastorage.org/getpro/habr/post_images/0ed/b01/f8a/0edb01f8aab0e821ff66ec80430c0534.png)
Если в кластер не поступают новые объявления, он удаляется из памяти, а его хэш и решение записываются в Apache Cassandra.
Когда платформа получает новое объявление, то сначала пытается найти похожий кластер среди уже созданных и взять решение из него. Если такого кластера нет, платформа идёт в Cassandra и ищет там. Нашла? Отлично, применяет решение к кластеру и отправляет в Юлу. Таких «повторных» решений ежедневно набирается в среднем 70 тысяч — 8 % от общего количества.
Подводя итог
Мы пользуемся платформой модерации Одноклассников два с половиной года. Результаты нам нравятся:
- Автоматически модерируем 94 % всех объявлений за сутки.
- Стоимость модерации одного объявления снизили с 2 рублей до 7 копеек.
- Благодаря готовому инструменту забыли о проблемах управления модераторами.
- В 2,5 раза увеличили количество обработанных вручную объявлений при том же количестве модераторов и бюджете. Ещё и качество ручной модерации возросло за счет автоматизированного контроля, и колеблется в районе 0,5 % ошибок.
- Оперативно покрываем фильтрами новые типы спама.
- Быстро подключаем к модерации новые подразделения «Юла Вертикали». С 2017 года в Юле появились вертикали Недвижимости, Вакансии и Авто.
Комментарии (21)
mapatka
07.06.2019 16:45Есть возможность ручками одобрить объявление? и чтобы его не заблокировало потом автоматом?
evetrov
07.06.2019 20:52Я не силен в возможностях Юлы, но вот один из примеров в статье: продажа пластинок — дублирование объявления в разных городах — может это не способ спама, а способ обойти недостаток фичи — разместить объявление в разных регионах?
Автомобиль например можно продать не только у себя в регионе/области, а в соседних.
Да и многие товары можно доставить доставкой.Solann
08.06.2019 20:39Я пару раз встречался с такими людьми, у которых в профиле было десяток объявлений на разные города. И каждый раз продавец утверждал что живёт на 2-3 города, что именно сейчас он за тыщу км от меня, в мой город ещё месяц не приедет, поэтому давайте оформим доставочку по предоплате. Кинул на обоих жалобу и авито за пару дней выпилил их
Jem-Kasha
08.06.2019 10:27«Как мы модерируем объявления»
Главное чтобы не началось как на Авито — вымогательство денег за не проданное объявление, баны объявлений за надпись на фотках, баны объявлений за повтор товара в другом лоте в большом списке и прочая якобы формализация работы. Это всё нужно только разработчику, а пользователю от этого только вред.
Я всегда ругаюсь поддержке Авито, привожу пример еБэй, Амазона и Озона. — они не берут (как Авито с мая 2017 года начал вымогать) деньги просто за размещение товара), нееет — они их берут только за проданный товар, когда у продавца появились деньги. еБэй отменил плату за размещение уже давно.
На авито нет рейтинга продавца (а они об этом и не думают, уже 5 лет я им об этом пишу), а это при продаже главное условие. Блииин, я деньги посылаю в другой город или другую страну, Авито!!! о чём вы думаете? )))
Юла!, вот не надо быть как Авито. Всегда есть альтернативные платформы — мы просто уйдём туда.
И ещё — во время кризиса (хотя вообще то всегда))) надо бизнесы расширять. Т.е. расширять облагаемую базу, которую можно стричь. Не банить объявы, и требовать деньги за непроделанную работу, а помогать продавцу охватить как можно большую аудиторию. Что делает Авито? ))
Банит, требует деньги, закрывает объявления. Выставка товара должна быть большой и открытой, но Авито превращает её в тюрьму за деньги. ))
Юла, не будьте такими. А как вы там «внутре» у себя устроите ваш процесс, нам — ПО БАРАБАНУ. до лампочки!3aBulon
09.06.2019 15:44Какие есть альтернативные платформы, не подскажете?
Торговал на молотке, платил только с проданных товаров. Молоток заколотили.
Потом ушел на Авито, сделали лимит объявлений в категориях — ушел на Юлу. Сделали и туть. Куда идти? Ибэй не мой вариант, мне нужно рядом, без доставок.
И не к вам вопрос, а к OkAlexey — вы как-то поощряете в игре одноклассников? Простите, не состою там, не в курсе.OkAlexey Автор
10.06.2019 12:06В нашей игре за разметку пользователи получают бесплатно платные услуги соцсети.
lostpassword
09.06.2019 12:03+1Можете объяснить, почему на фотографиях нельзя размещать контактные данные?
Фотографии не должны содержать какую-либо контактную информацию: номер телефона, адрес, название сайта, никнеймы, а также прочие контактные данные, названия мессенджеров или способы связи вне интерфейса Юлы.
Как я понимаю, такая же схема используется на сайте ЦИАН, к примеру. В итоге имеем кучу «агентов», которые просто воруют фотографии и либо выставляют другую квартиру с этими фотографиями, либо размещают объявления от себя, указав завышенную сумму.
Делали бы хотя бы вотермарку со ссылкой на объявление на самой Юле.OkAlexey Автор
10.06.2019 19:36Есть несколько пунктов, почему мы запрещаем контактные данные на фото:
— Для контактных данных есть специальные атрибуты в Юле. Например, поле для указания номера телефона. Указав номер, покупатель может позвонить или написать продавцу через Юлу. Мы заинтересованы в том, чтобы связь между продавцом и покупателем проходила через наш сервис.
— В последнее время много мошенников стараются увести пользователей из сервиса в мессенджеры, где не работают наши системы антиспама.
— Объявления с телефонными номерами на фото выглядят некрасиво и портят визуально ленту, поисковую выдачу и рекомендации.
Cubist
10.06.2019 11:58OkAlexey, А какой порядок времени автоматической проверки учитывая все эти конвейеры?
Есть ли для пользователя разница в появлении объявления, если оно попало на автоматическую проверку или на ручную? Человек же очевидно дольше проверяет объявление.OkAlexey Автор
10.06.2019 14:39В Юле происходит пост модерация объявлений. Т.е. объявление после публикации сразу становится доступно для поиска и просмотра в карточке продавца. Разница между автоматами и ручной модерацией будет заключаться только в том, как долго объявление, нарушающее правила сервиса, будет доступно пользователям.
yarkov
Неплохо бы еще научить алгоритм находить несоответствие между фото и описанием, а то описание «продается радиоуправляемый самолет» с «вертолетом на фото» немного удивляет.
OkAlexey Автор
Спасибо за комментарий. Мы работаем над таким сравнением, но задачка не простая. Товаров в мире миллиарды. А для сравнения текста и фото, для каждого товара нужно понимать, что изображено на фото. Поэтому мы начнем сначала с самых популярных.
yarkov
Кстати, а как вы боретесь с тем, что вместо объявления пишут откровенную чушь?
Например я лично пару раз отправлял жалобу. Вместо описания товара там ужасный (с ошибками) текст, например очерняющий кого-то из продавцов или покупателей.
Ну знаете эти истеричные мамки? Типа я купила коляску, в прихожей было темно, а приехав домой я увидела, что она грязная, а продавец морозится теперь и прочая чепуха.
Кроме жалоб от пользователей есть какие-то механизмы?
OkAlexey Автор
1. Все объявления с жалобами проходят ручную модерацию. У нее есть какой-то лаг, поэтому объявление не заблокируется мгновенно.
2. Насчет объявлений с текстом без смысла, у нас есть детектор абракадабры для русского языка. Но у вас скорее пример о том, что это объявление без продажи. Таких вариантов непродаж много. Если объявлений с каким-то вариантом непродаж единичны — их вычищает ручная модерация, например, по жалобам.
Если поток становится большим — то мы собираем контрольную выборку, обучаем текстовый классификатор и блокировка начинает происходить автоматически. На жалующихся мамочек посмотрим еще раз :)
read2only
Что-то очень большой лаг. Достали комментарии к товарам от спаммеров с предложением работы, ссылками и пр. рекламной ерундой. Подавал жалобы, эффект нулевой, модераторы ничего не делают, спаммер регулярно посещает торговую площадку, и продолжает присылать сообщения не относящиеся к товару, стоит только выложить новое объявление. Пришлось просто топорно блокировать его в своём профиле, но на ресурсе то он остался и будет отнимать время у других людей.
OkAlexey Автор
Может быть вы говорите про сообщения в чатах? В Юле не возможности комментировать товары.
read2only
Да, сообщения в чате касательно товара. Не совсем верно выразился, но сути это не меняет.
Зачем вам минус поставили непонятно, вы правы.
OkAlexey Автор
Данная статья посвящена модерации объявлений. Насчет модерации чатов — посмотрим пристальнее на тех, кто пишет продавцам с новыми товарами. Спасибо за наводку