company_banner

Модерация текста: уроки этикета от Data Scientist’a

    Привет, Хабр!

    С этой статьи мы начинаем публикацию серии статей про Data Science задачи, которые мы решаем в Центре Развития Финансовых Технологий Россельхозбанка.

    В прошлом году Россельхозбанк объявил о создании и развитии экосистемы для предприятий агропромышленного комплекса. Для одной из базовых площадок экосистемы — Своё Фермерство мы решили сделать пару полезных задач, о которых расскажем ниже.



    Площадка Своё Фермерство является маркетплейсом товаров для сельхозпроизводителей от крупнейших поставщиков со всей России. Площадка включает в себя товары самых приоритетных для фермеров категорий: средства защиты растений, удобрения, семена, сельхозтехника и т.д. Тысячи поставщиков загружают информацию о своих товарах с целью продажи. И, конечно же, необходимо реализовать процесс проверки качества загружаемого контента. В связи с этим мы решили создать свой инструмент премодерации текстовой и графической информации.

    Что делали?


    В этой статье мы расскажем о том, как в рамках сотрудничества с Лабораторией МФТИ, специально созданной под задачи Банка, разработали инструмент, позволяющий с высокой точностью премодерировать текстовый контент.

    Наша цель звучала довольно просто — созданный нами инструмент должен автоматически относить текст к приемлемому для размещения на площадке (класс 0) или неприемлемому (класс 1). В случае если алгоритм не может четко понять к какому классу относится текст, то его (текст) отправляем на ручную модерацию.

    Имеем задачу обработки текста: хотим фильтровать “токсичные” во всех смыслах тексты, а именно: ругательства, оскорбления, различный контент, запрещенный законодательством, да и просто текст, неприемлемый к размещению на площадке.

    Мы ожидаем, что разработанный нами алгоритм будет принимать на вход набор текстов и выдавать число от 0 до 1 — степень или вероятность “токсичности” текста. Чем ближе это число к единице, тем токсичнее комментарий.

    Надо отметить, что задача детектирования токсичных текстов совершенно не новая и является довольно популярной в англоязычном сегменте. Несколько лет назад похожая задача решалась в рамках соревнования Toxic Comment Classification Challenge на Kaggle. Для русского языка решение должно получаться аналогичным образом, но качество модели может оказаться ниже из-за того, что русский язык структурно сложнее английского.

    В открытом доступе есть всего один размеченный русскоязычный датасет для поиска токсичности в тексте. Также нам удалось найти датасет для поиска оскорблений (частный случай токсичности). Плюс ко всему, мы собрали примеры объявлений с сельскохозяйственных порталов и разметили их как приемлемые (класс — 0).

    Поставленная нами задача оказалась довольно уникальной в плане заданной сельскохозяйственной тематики. Её специфика заключается в том, что фразы, которые в обычной жизни являются оскорблениями не всегда являются таковыми, когда речь идет о сельском хозяйстве. Из банальных примеров можно привести следующие: “Не суй свое рыло” – текст явно неприемлемый, в то время как текст со “свиным рылом” вполне себе можно разместить на площадке (хоть и зависит от контекста). Тоже самое относится к определённым подвидам сельскохозяйственных животных и растений.

    Если говорить о решении подобных задач классификации текста, то, на самом деле, даже самые простые модели (линейные) уже дают хороший результат. Но, как и всегда, для достижения более высокого качества, мы будем использовать нейронные сети. Самой популярной архитектурой (на момент написания этой статьи) для решения подобных задач является BERT. На момент соревнования на Kaggle, упомянутого выше, этой архитектуры не существовало, поэтому использовались другие. Однако, позднее эта задача была успешно решена с помощью BERT’a.

    Как делали?


    Перейдём к самой интересной части — решению задачи. Немного поразмыслив над “архитектурой” инструмента, мы решили использовать три модели: поиск по словарю (как фильтр обсценной лексики), логистическую регрессию (в качестве базового решения) и BERT (в качестве более продвинутого).

    Общая схема




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

    Теперь давайте рассмотрим каждую компоненту подробнее.

    Наивный классификатор


    Здесь все совсем просто: по словарю обсценной лексики довольно легко понять, содержится ли в тексте то или иное “плохое” слово или нет.

    То есть на данном этапе можно даже обойтись без ML-модели как таковой и сразу отсеять тексты, в которых есть “плохие” слова. Но что, если в тексте таких словарных слов не используют, но текст, тем не менее, является неприемлемым для размещения на портале? Попробуем решить эту задачу с помощью логистической регрессии и BERT’a.

    Логистическая регрессия


    Простейшая модель позволяет предсказывать значение, на основе имеющихся данных. Вектора текстов для данной модели получаются при помощи TF-IDF и TweetTokenizer’а из nltk. Такая модель, как известно, позволяет оценить вероятность токсичности текста с помощью логистической функции. В нашей архитектуре логистическая регрессия “страхует” нейросеть.

    Великий и ужасный BERT


    Мы использовали предобученную модель RuBert от DeepPavlov, которую дообучили на размеченных текстах. Процесс предсказания, не вдаваясь в детали, выглядит следующим образом:


    Мы строили-строили и наконец построили!


    Качество мы оценивали излюбленными метриками Accuracy, ROC-AUC и F1-мера. Итоговые метрики качества на отложенной выборке получились следующими:

    Алгоритм / Метрика
    Naive
    BERT
    LR
    Naive → BERT
    Naive → LR
    Accuracy
    0.854
    0.901
    0.865
    0.909
    0.879
    ROC-AUC
    0.782
    0.960
    0.921
    0.963
    0.939
    F1-мера
    0.722
    0.840
    0.800
    0.855
    0.824

    Скорость работы: ~2800 текстов в минуту на GPU (GeForce 1080Ti) в случае отработки BERT’а, как самого медленного алгоритма из представленных.

    Как и ожидалось, c BERTом метрики получились чуть лучше, хоть и не сильно.

    Какие мы сделали выводы


    В заключении, хотелось бы отметить несколько важных аспектов, без которых, по нашему мнению, нельзя запускать подобные решения в промышленном режиме.

    1. Всегда нужно учитывать специфику задачи, касательно разметки текстов.
    2. Необходимо предусмотреть ручную модерацию текста, в случае, когда модель “сомневается” в своем решении. Вы же не хотите, чтобы неприемлемый контент в итоге присутствовал в вашем продукте.
    3. Также необходимо отправлять размеченные руками тексты из предыдущего пункта на дообучение. Таким образом можно маленькими шагами улучшить модель и уменьшить со временем количество работы при ручной модерации.
    4. Лучше использовать комплексный подход к решению задачи. Иногда даже самые простые “модели” на словарях уже дают неплохой результат.
    5. Выбирайте лучшую модель исходя из задачи. В нашем случае мы выбрали BERT, так как он лучше логистической регрессии реагирует на контекст.

    Спасибо за внимание!

    В следующей статье мы поделимся своим опытом при премодерации изображений всё на той же площадке нашей экосистемы — Своё Фермерство.
    Россельхозбанк
    Меняем банк и сельское хозяйство

    Похожие публикации

    Комментарии 6

      0

      Хорошая статья. У меня тоже была задача классификация отзывов. По сути f-1 score TF-IDF&LogReg и BERT было одинаковой.

        0

        Особенно понравился «наивный классификатор»
        А так здорово! Это можно много где применять

          0

          В такой статье должно быть много примеров. У вас один пример, про арбуз.

            +2
            Добрый день!

            Отвечу: специально не стали вставлять в статью много примеров, так как каждый может придумать для себя их сколько угодно. В статье упоминается один пример — про «не суй свое рыло» vs «продам свиное рыло». Про арбуз — это просто картинка про то, как верхнеуровнево работает BERT.

            Приведу здесь еще несколько примеров:

            • «Засорять почву» vs «Засирать урожай»
            • «Продаю козла» vs «Ах ты козел»
            • «Имею в наличии отличный хрен» vs «Ну и хрень этот товар»

            и еще много-много других :)
            0

            А "наивный классификатор" — просто поиск по словарю точных вхождений, или что-то более сложное?

              0
              Да, просто поиск по словарю точных вхождений, все верно. Технически, просто CountVectorizer. Более сложные вещи оставили на разбор нейросетке.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое