Каждый сервис, чьи пользователи могут создавать собственный контент (UGC — User-generated content), вынужден не только решать бизнес-задачи, но и наводить порядок в UGC. Плохая или некачественная модерация контента в итоге может уменьшить привлекательность сервиса для пользователей, вплоть до прекращения его работы.

Сегодня мы вам расскажем про синергию между Юлой и Одноклассниками, которая помогает нам эффективно модерировать объявления в Юле.

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

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

Поэтому мы воспользовались уже готовой платформой модерации, которую к тому времени наши коллеги из Одноклассников допилили до состояния «почти совершенство».

Почему Одноклассники?


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

Команда модерации ОК накопила очень большой опыт, поскольку совершенствует свой инструмент уже 12 лет. Важно, что они не только могли поделиться своими готовыми решениями, но и настроить архитектуру своей платформы под наши специфические задачи.



Дальше для краткости будем называть платформу модерации ОК просто «платформа».

Как всё устроено


Между Юлой и Одноклассниками обмен данными налажен через Apache Kafka.

Почему мы выбрали этот инструмент:

  • В Юле все объявления проходят постмодерацию, поэтому изначально синхронный ответ не требовался.
  • Если случится лютый абзац, и Юла или Одноклассники будут недоступны, в том числе из-за каких-нибудь пиковых нагрузок, то данные из Kafka никуда не пропадут и позже их можно будет дочитать.
  • Платформа уже была интегрирована с Kafka, поэтому большинство вопросов безопасности оказались решены.



На каждое созданное или измененное пользователем объявление в Юле формируется JSON с данными, который кладется в Kafka для последующей модерации. Из Kafka объявления загружаются в платформу, где по ним выносятся решения автоматически или вручную. Плохие объявления блокируются с указанием причины, а те, в которых платформа не нашла нарушений, помечаются как «хорошие». Затем все решения отправляются обратно в Юлу и применяются в сервисе.

В итоге, для Юлы всё сводится к простым действиям: отправить объявление в платформу Одноклассников и обратно получить резолюцию «ок», или почему не «ок».

Автоматическая обработка


Что происходит с объявлением после того, как оно попадает в платформу? Каждое объявление разбивается на несколько сущностей:

  • название,
  • описание,
  • фотографии,
  • выбранная пользователем категория и подкатегория объявления,
  • цена.



Затем по каждой сущности платформа проводит кластеризацию, чтобы найти дубликаты. Причём текст и фотографии кластеризуются по разным схемам.

Тексты перед кластеризацией нормализуются, чтобы выкинуть спецсимволы, измененные буквы и прочий мусор. Полученные данные разбиваются на N-граммы, каждая из которых хэшируется. В итоге получается множество уникальных хэшей. Схожесть между текстами считается по мере Жаккара между двумя получившимися множествами. Если схожесть больше пороговой, то тексты склеиваются в один кластер. Для ускорения поиска похожих кластеров используется MinHash и Locality-sensitive hashing.

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

Последний способ самый «суровый». Для обучения модели подбирались такие тройки изображений (N, A, P), в которых N не похож на А, а P — похож на А (является полудубликатом). Затем нейросеть училась делать так, чтобы A и P были максимально близки, а A и N — максимально далеки. Так получается меньше ложных срабатываний по сравнению с тем, чтобы просто взять эмбеддинги от предобученной сети.

Когда нейросеть получает на вход картинки, она для каждой из них генерирует N(128)-мерный вектор и делается запрос на оценку близости изображения. Далее рассчитывается порог, при котором близкие изображения считаются дубликатами.

Модель умеет мастерски находить спамеров, которые специально фотографируют один и тот же товар с разных ракурсов, чтобы обойти сравнение по pHash.


Пример спамерских фото, склеенных нейронной сетью как дубликаты.

На конечном этапе дубликаты объявлений ищутся одновременно и по тексту, и по изображению.

Если в кластере склеиваются два и более объявления, система запускает автоматическую блокировку, которая по определённым алгоритмам выбирает, какие дубликаты удалить, а какие оставить. Например, если у двух пользователей в объявлении одинаковые фотографии, то система заблокирует более свежее объявление.

После создания все кластеры проходят через ряд автоматических фильтров. Каждый фильтр выставляет кластеру количество очков (score): с какой вероятностью тот содержит угрозу, которую выявляет этот фильтр.

Например, система анализирует описание в объявлении и выбирает для него потенциальные категории. Затем берёт ту, у которой максимальная вероятность, и сравнивает с категорией, которую указал автор объявления. Если они не совпадают, объявление блокируется за неверную категорию. А поскольку мы добрые и честные, то прямо говорим пользователю, какую категорию ему нужно выбрать, чтобы объявление прошло модерацию.


Уведомление о блокировке за неправильную категорию.

В нашей платформе машинное обучение чувствует себя как дома. К примеру, с его помощью мы ищем в названиях и описаниях запрещенные в РФ товары. А модели нейронных сетей придирчиво «разглядывают» изображения, нет ли на них URL-адресов, спамерских текстов, телефонов и всё той же «запрещёнки».

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


Кальян пытаются продать, замаскировав его под самовар.

Параллельно со сложными фильтрами работают и простые, решающие очевидные задачи, связанные с текстом:

  • антимат;
  • детектор URL-адресов и телефонных номеров;
  • упоминание мессенджеров и других контактов;
  • заниженная цена;
  • объявления, в которых ничего не продаётся, и т.д.

Сегодня каждое объявление проходит через мелкое сито из более чем 50 автоматических фильтров, которые пытаются найти в объявлении что-то плохое.

Если ни один из детекторов не сработал, то в Юлу отправляется ответ, что с объявлением, «скорее всего», полный порядок. Мы этот ответ применяем у себя, и пользователям, которые подписались на продавца, приходит уведомление о появлении нового товара.


Уведомление о том, что у продавца появился новый товар.

В итоге, каждое объявление «обрастает» метаданными, часть из которых генерируется при создании объявления (IP-адрес автора, user-agent, платформа, геолокация и т.д.), а остальное — это score, выданные каждым фильтром.

Очереди объявлений


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

Например, можно создать очередь объявлений в категории «Сотовые телефоны» от пользователей Юлы якобы из Санкт-Петербурга, но при этом их IP-адреса из Москвы или других городов.


Пример объявлений, размещенных одним пользователем в разных городах.

Или можно формировать очереди на основе баллов, которые нейросеть присваивает объявлениям, расставляя их по убыванию.

Каждая очередь, согласно своей формуле, присваивает итоговый score объявлению. Дальше можно действовать по-разному:

  • указать пороговое значение, при котором объявление будет получать определенный тип блокировки;
  • все объявления в очереди отправить модераторам на ручную проверку;
  • или скомбинировать предыдущие варианты: указать порог автоматической блокировки и отправить модераторам те объявления, которые не достигли этого порога.



Зачем нужны эти очереди? Допустим, пользователь загрузил фотографию огнестрельного оружия. Нейросеть присваивает ей score от 95 до 100 и с 99-процентной точностью определяет, что на картинке оружие. Но если значение score ниже 95 %, точность модели начинает снижаться (такова особенность моделей нейросетей).

В результате формируется очередь на основе score модели, и те из объявлений, которые получили от 95 до 100, автоматически блокируются как «Запрещенный товар». Объявления с количеством баллов ниже 95 отправляются на ручную обработку модераторам.


Шоколадная Beretta с патронами. Только для ручной модерации! :)

Ручная модерация


На начало 2019 года около 94 % всех объявлений в Юле модерируются автоматически.



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

А чтобы при ручной модерации не страдало качество сервиса, работа людей постоянно контролируется. Например, в потоке заданий модератору показываются «ловушки» — объявления, по которым уже есть готовые решения. Если решение модератора не совпадает с готовым, модератору засчитывают ошибку.

На проверку одного объявления модератор в среднем тратит 10 секунд. При этом количество ошибок составляет не более 0,5 % от всех проверенных объявлений.

Народная модерация


Коллеги из Одноклассников пошли ещё дальше, воспользовались «помощью зала»: написали для соцсети приложение-игру, в котором можно быстро размечать большое количество данных, выделяя какой-то плохой признак, — Модератор Одноклассников (https://ok.ru/app/moderator). Хороший способ воспользоваться помощью пользователей ОК, которые стараются сделать контент приятнее.


Игра, в которой пользователи отмечают фотографии, на которых есть номер телефона.

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

Хранение результатов модерации


Мы сохраняем все принятые при модерации решения, чтобы потом не обрабатывать повторно те объявления, по которым уже выносили какое-то решение.

Ежедневно по объявлениям создаются миллионы кластеров. Со временем каждый кластер получает отметку «хороший» или «плохой». Каждое новое объявление или его редакция, попадая в кластер с отметкой, автоматически получает резолюцию самого кластера. Таких автоматических резолюций в сутки набегает около 20 тысяч.



Если в кластер не поступают новые объявления, он удаляется из памяти, а его хэш и решение записываются в Apache Cassandra.

Когда платформа получает новое объявление, то сначала пытается найти похожий кластер среди уже созданных и взять решение из него. Если такого кластера нет, платформа идёт в Cassandra и ищет там. Нашла? Отлично, применяет решение к кластеру и отправляет в Юлу. Таких «повторных» решений ежедневно набирается в среднем 70 тысяч — 8 % от общего количества.

Подводя итог


Мы пользуемся платформой модерации Одноклассников два с половиной года. Результаты нам нравятся:

  • Автоматически модерируем 94 % всех объявлений за сутки.
  • Стоимость модерации одного объявления снизили с 2 рублей до 7 копеек.
  • Благодаря готовому инструменту забыли о проблемах управления модераторами.
  • В 2,5 раза увеличили количество обработанных вручную объявлений при том же количестве модераторов и бюджете. Ещё и качество ручной модерации возросло за счет автоматизированного контроля, и колеблется в районе 0,5 % ошибок.
  • Оперативно покрываем фильтрами новые типы спама.
  • Быстро подключаем к модерации новые подразделения «Юла Вертикали». С 2017 года в Юле появились вертикали Недвижимости, Вакансии и Авто.

Комментарии (21)


  1. yarkov
    07.06.2019 13:57

    Неплохо бы еще научить алгоритм находить несоответствие между фото и описанием, а то описание «продается радиоуправляемый самолет» с «вертолетом на фото» немного удивляет.


    1. OkAlexey Автор
      07.06.2019 14:36

      Спасибо за комментарий. Мы работаем над таким сравнением, но задачка не простая. Товаров в мире миллиарды. А для сравнения текста и фото, для каждого товара нужно понимать, что изображено на фото. Поэтому мы начнем сначала с самых популярных.


      1. yarkov
        07.06.2019 14:54

        Кстати, а как вы боретесь с тем, что вместо объявления пишут откровенную чушь?
        Например я лично пару раз отправлял жалобу. Вместо описания товара там ужасный (с ошибками) текст, например очерняющий кого-то из продавцов или покупателей.
        Ну знаете эти истеричные мамки? Типа я купила коляску, в прихожей было темно, а приехав домой я увидела, что она грязная, а продавец морозится теперь и прочая чепуха.
        Кроме жалоб от пользователей есть какие-то механизмы?


        1. OkAlexey Автор
          07.06.2019 15:37

          1. Все объявления с жалобами проходят ручную модерацию. У нее есть какой-то лаг, поэтому объявление не заблокируется мгновенно.
          2. Насчет объявлений с текстом без смысла, у нас есть детектор абракадабры для русского языка. Но у вас скорее пример о том, что это объявление без продажи. Таких вариантов непродаж много. Если объявлений с каким-то вариантом непродаж единичны — их вычищает ручная модерация, например, по жалобам.
          Если поток становится большим — то мы собираем контрольную выборку, обучаем текстовый классификатор и блокировка начинает происходить автоматически. На жалующихся мамочек посмотрим еще раз :)


          1. read2only
            09.06.2019 11:43

            Что-то очень большой лаг. Достали комментарии к товарам от спаммеров с предложением работы, ссылками и пр. рекламной ерундой. Подавал жалобы, эффект нулевой, модераторы ничего не делают, спаммер регулярно посещает торговую площадку, и продолжает присылать сообщения не относящиеся к товару, стоит только выложить новое объявление. Пришлось просто топорно блокировать его в своём профиле, но на ресурсе то он остался и будет отнимать время у других людей.


            1. OkAlexey Автор
              10.06.2019 12:00
              -1

              Может быть вы говорите про сообщения в чатах? В Юле не возможности комментировать товары.


              1. read2only
                10.06.2019 12:25

                Да, сообщения в чате касательно товара. Не совсем верно выразился, но сути это не меняет.
                Зачем вам минус поставили непонятно, вы правы.


                1. OkAlexey Автор
                  10.06.2019 19:37

                  Данная статья посвящена модерации объявлений. Насчет модерации чатов — посмотрим пристальнее на тех, кто пишет продавцам с новыми товарами. Спасибо за наводку


  1. mapatka
    07.06.2019 16:45

    Есть возможность ручками одобрить объявление? и чтобы его не заблокировало потом автоматом?


    1. OkAlexey Автор
      10.06.2019 12:00

      Да, такая возможность есть.


      1. mapatka
        10.06.2019 12:58

        Отлично.
        Меня убеждали в противоположенном :)
        Я делаю наклейки с никами Инстаграма. Меня не пропускают модераторы, ругаются на слово Инстаграм. Можем как то в частном порядке решить?
        Типа таких:image


        1. OkAlexey Автор
          10.06.2019 19:34

          Напишите мне в личку свой аккаунт, посмотрю что там можно сделать :)


  1. evetrov
    07.06.2019 20:52

    Я не силен в возможностях Юлы, но вот один из примеров в статье: продажа пластинок — дублирование объявления в разных городах — может это не способ спама, а способ обойти недостаток фичи — разместить объявление в разных регионах?

    Автомобиль например можно продать не только у себя в регионе/области, а в соседних.
    Да и многие товары можно доставить доставкой.


    1. Solann
      08.06.2019 20:39

      Я пару раз встречался с такими людьми, у которых в профиле было десяток объявлений на разные города. И каждый раз продавец утверждал что живёт на 2-3 города, что именно сейчас он за тыщу км от меня, в мой город ещё месяц не приедет, поэтому давайте оформим доставочку по предоплате. Кинул на обоих жалобу и авито за пару дней выпилил их


  1. Jem-Kasha
    08.06.2019 10:27

    «Как мы модерируем объявления»
    Главное чтобы не началось как на Авито — вымогательство денег за не проданное объявление, баны объявлений за надпись на фотках, баны объявлений за повтор товара в другом лоте в большом списке и прочая якобы формализация работы. Это всё нужно только разработчику, а пользователю от этого только вред.
    Я всегда ругаюсь поддержке Авито, привожу пример еБэй, Амазона и Озона. — они не берут (как Авито с мая 2017 года начал вымогать) деньги просто за размещение товара), нееет — они их берут только за проданный товар, когда у продавца появились деньги. еБэй отменил плату за размещение уже давно.
    На авито нет рейтинга продавца (а они об этом и не думают, уже 5 лет я им об этом пишу), а это при продаже главное условие. Блииин, я деньги посылаю в другой город или другую страну, Авито!!! о чём вы думаете? )))
    Юла!, вот не надо быть как Авито. Всегда есть альтернативные платформы — мы просто уйдём туда.
    И ещё — во время кризиса (хотя вообще то всегда))) надо бизнесы расширять. Т.е. расширять облагаемую базу, которую можно стричь. Не банить объявы, и требовать деньги за непроделанную работу, а помогать продавцу охватить как можно большую аудиторию. Что делает Авито? ))
    Банит, требует деньги, закрывает объявления. Выставка товара должна быть большой и открытой, но Авито превращает её в тюрьму за деньги. ))
    Юла, не будьте такими. А как вы там «внутре» у себя устроите ваш процесс, нам — ПО БАРАБАНУ. до лампочки!


    1. 3aBulon
      09.06.2019 15:44

      Какие есть альтернативные платформы, не подскажете?
      Торговал на молотке, платил только с проданных товаров. Молоток заколотили.
      Потом ушел на Авито, сделали лимит объявлений в категориях — ушел на Юлу. Сделали и туть. Куда идти? Ибэй не мой вариант, мне нужно рядом, без доставок.

      И не к вам вопрос, а к OkAlexey — вы как-то поощряете в игре одноклассников? Простите, не состою там, не в курсе.


      1. OkAlexey Автор
        10.06.2019 12:06

        В нашей игре за разметку пользователи получают бесплатно платные услуги соцсети.


  1. lostpassword
    09.06.2019 12:03
    +1

    Можете объяснить, почему на фотографиях нельзя размещать контактные данные?

    Фотографии не должны содержать какую-либо контактную информацию: номер телефона, адрес, название сайта, никнеймы, а также прочие контактные данные, названия мессенджеров или способы связи вне интерфейса Юлы.
    Как я понимаю, такая же схема используется на сайте ЦИАН, к примеру. В итоге имеем кучу «агентов», которые просто воруют фотографии и либо выставляют другую квартиру с этими фотографиями, либо размещают объявления от себя, указав завышенную сумму.
    Делали бы хотя бы вотермарку со ссылкой на объявление на самой Юле.


    1. OkAlexey Автор
      10.06.2019 19:36

      Есть несколько пунктов, почему мы запрещаем контактные данные на фото:

      — Для контактных данных есть специальные атрибуты в Юле. Например, поле для указания номера телефона. Указав номер, покупатель может позвонить или написать продавцу через Юлу. Мы заинтересованы в том, чтобы связь между продавцом и покупателем проходила через наш сервис.
      — В последнее время много мошенников стараются увести пользователей из сервиса в мессенджеры, где не работают наши системы антиспама.
      — Объявления с телефонными номерами на фото выглядят некрасиво и портят визуально ленту, поисковую выдачу и рекомендации.


  1. Cubist
    10.06.2019 11:58

    OkAlexey, А какой порядок времени автоматической проверки учитывая все эти конвейеры?
    Есть ли для пользователя разница в появлении объявления, если оно попало на автоматическую проверку или на ручную? Человек же очевидно дольше проверяет объявление.


    1. OkAlexey Автор
      10.06.2019 14:39

      В Юле происходит пост модерация объявлений. Т.е. объявление после публикации сразу становится доступно для поиска и просмотра в карточке продавца. Разница между автоматами и ручной модерацией будет заключаться только в том, как долго объявление, нарушающее правила сервиса, будет доступно пользователям.