Что меня побудило это делать?

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

Стек проекта

Весь проект будет писаться на python, с использованием библиотек pytorch и pyTeleramBotApi.

Разделение проекта на этапы

Я разделил проект на 3 этапа.

1 этап - написать телеграм-бота, который ведёт статистику о токсичности пользователей, написать определение токсичности по простейшим правилам.

2 этап - найти датасет с токсичными комментариями, выбрать архитектуру нейросети, написать нейросеть, обучить нейросеть.

3 этап - отладить телеграм бота в большом чате.

1 Этап - написание бота

Сначала я написал обычного телеграм бота, который собирает и выводит статистику, и уведомляет админа чата о токсичных пользователях, если их рейтинг < -5. На первом этапе для определение токсичных предложений я решил использовать поиск матерных слов.

Пример вывод статистики
Пример вывод статистики
Пример уведомления
Пример уведомления

2 Этап - написание и обучение нейросети

Перед тем, как начать писать и обучать нейросеть, я нашёл датасет на kaggle с токсичными комментариями. В датасете около 14000 сообщений и 2 класса(токсичный, позитивный)

Следующий шаг. Надо выбрать архитектуру нейросети. Я остановился на CNN + GRU.

Архитектура нейросети
Архитектура нейросети

Дальше я поставил нейросеть обучаться на Google Colab`e. Нейросеть обучилась за 30-45 минут.

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

Имя

accuracy

precision

recall

CNN+GRU

0.9

0.9

0.85

CatBoost

0.86

0.75

0.83

Rules (проверка на матные слова)

0.66

0.69

0.53

Осталось, только интегрировать нейросеть в бота.

3 этап - отладка проекта

Я запустил своего телеграм бота в чат с 65 людьми. В течение 3 дней у бота были обнаружены не большие баги, которые были исправлены.

Итог

Пример обработки сообщений
Пример обработки сообщений

Бот более-менее справляется со своей задачей, но иногда нормальное сообщение определяет, как токсичное. Эта проблема решается, нахождением датасета побольше и усложнением архитектуры нейросети, но при усложнении архитектуры ресурсов Google Colab`а может не хватить.

Ссылки

Репозиторий проекта

Бот в телеграмме

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


  1. amarao
    07.10.2021 13:57
    +5

    Я сейчас покажу пример токсичного комментария, по мотивам IRL чата. И что ваш бот на это скажет?

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

    Дениска, ты, конечно, молодец с этой идеей, и наверное, кто-то наивный даже поверит, что оно работает, но мы-то серьёзные люди и всё понимаем, правда?

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


    1. opckSheff
      07.10.2021 13:59
      +1

      Не, ну это бан! Уровень токсичности зашкаливает.

      P.S. Идея для новой капчи - расставить несколько фраз по возрастанию уровня токсичности. Человек справится, машина нет.


      1. Kwent
        07.10.2021 14:19
        +3

        Человек справится

        Расставьте:
        1. Жизни черных важны
        2. Жизни белых важны


        1. MentalBlood
          07.10.2021 15:12
          +2

          Ну и что тут токсичного?


          Надо так:


          • Жизни черных не важны
          • Жизни белых не важны


          1. Kwent
            07.10.2021 15:54

            "не токсичные фразы" это фразы с токсичностью близкой к 0, оператор сравнения должен быть определен и для них, условно фраза с 0.1 токсичности токсичнее фразы с 0.05, так что "отсортировать по токсичности" можно все :)


    1. MentalBlood
      07.10.2021 15:07
      +2

      Токсичность уровня "Хабр"


  1. eternum
    07.10.2021 15:11
    +3

    Хохотнул на "Вы уроды!!!"
    "Уроды - это нехорошо! Но на Вы - это хорошо! В целом на троечку. Не нарушайте..."


  1. stekov27
    07.10.2021 15:30
    -1

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

    ну и пример для бота - "котик, ты что совсем дурачок?" намеренно смазал на "дурачок".

    По факту это вопрос, а не оскорбление.)


  1. Wizard_of_light
    07.10.2021 15:58
    +1

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


  1. tuxi
    07.10.2021 16:22
    +2

    Эта проблема решается, нахождением датасета побольше и усложнением архитектуры нейросети

    Другими словами, чтобы достичь 99% эффективности, нужен датасет с 99% всех возможных реплик и оборотов, так?


    1. AlexNikiforov
      09.10.2021 18:33

      Тут скорее исходный датасет кривоват, как будто не человек его делал, а нейросеть.


  1. iandarken
    07.10.2021 17:47
    +3

    А он умеет в сарказм и пассивную агрессию?


    1. sunsexsurf
      08.10.2021 19:44

      В сарказм вообще мало чего умеет, на самом деле.


  1. nullptr
    07.10.2021 18:50
    +2

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


    1. amarao
      07.10.2021 23:31

      Рано или поздно эту проблему кто-то решит, потому что на самом деле, токсичность найти проще, чем сарказм или язвительность.

      Для сравнения:

      • Будет грандиозный успех, как в прошлый деплой было. // Сарказм.

      • Прошлый деплой мы долго не забудем, спасибо тебе. // Язвительность.

      • Только такому мастеру деплоев как ты мы можем поручить создать новый инфоповод. // токсичность

      Все три обсуждают следующий деплой в контексте предыдущего, который закончился 8 часовым дауном (фейсбука), например. При том, что второй обидный, он заслуженный. А вот третий - чистой воды токсичность.


  1. shyneko
    08.10.2021 08:43

    Привет, друзья-уроды!


  1. sunsexsurf
    08.10.2021 19:48

    1/ не понял в чем преимущество нейронок по сравнению с svm (именно для данной задачи toxic comments)

    2/ не увидел гиперпараметров (и как их подбирали), почему выбрана именно такая архитектура? (В принципе, вытекает из первого вопроса.)


    1. Kwent
      13.10.2021 11:54
      +1

      преимущество нейронок в том, что текст (картинки и звук туда же) - это неструктурированные данные, где нейронки классику выкинули давно и безвозвратно, в качестве "мерила" могу предложить любое соревнование, где опытным путем показано преимущество: качество работы. Например, 4 года назад в https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge уже на первом месте CNN+RNN


      1. sunsexsurf
        13.10.2021 12:01

        1/ не горячился бы насчет "классику выкинули давно". Соревнование, которое вы приводите, это соревнование не про 1/0, а про то, какая именно токсичность. И поэтому если речь все же про 1/0, то, как написал выше, классика продолжает работать.

        2/ если есть ссылка на модель - не могли бы дать поиграться?


        1. Kwent
          13.10.2021 12:53
          +1

          1/0 от какая именно отличается по сути активацией и функцией потерь, не больше. Жду пример, где классика работает лучше в обработке естественного языка, если классика продолжает работать :)

          В том же соревновании куча кернелов, с которыми можно поиграться, например один из последних на берте https://www.kaggle.com/oceands/bert-model-for-dummies

          P. S. Кажется, вы немного отстали от темы, очень тяжело объяснять, почему атомные ледоколы лучше парусных. NLP уже давно про глубокое и сложное "word to vector", и модели отличаются тем, какую новую крутую штуку вы придумаете, которая красиво переведет слова в латентное пространство. "Детские" TF-IDF, SVM, мешки слов и прочие архаизмы работают только в купе с новыми методами в качестве поддержки, "чистая классика" проигрывает непозволительно много на всех задачах NLP.


          1. sunsexsurf
            13.10.2021 14:21

            да, возможно отстал, ок. на кернелы погляжу, ок. Про то, что NLP - это про эмбеддинги - это понятно.


  1. butsan
    09.10.2021 19:26

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


  1. kai3341
    10.10.2021 02:01

    1. DenisIndenbom Автор
      10.10.2021 19:03

      Прошу прощение за мой "прекрасный" код.

      Если в нём, что то не так можно сделать pull request.


      1. kai3341
        10.10.2021 20:08

        Мне бы свои конюшни разгрести.

        А ваш код вам и разгребать. С таким отношением я не удивлён, куда мы катимся, почему всё так тормозит и глючит на элементарных задачах. Успехов.


        1. DenisIndenbom Автор
          10.10.2021 21:13

          Если в нём, что то не так можно сделать pull request.

          Я имел виду, что вы можете помочь исправить ошибки(сделав pull request), если у вас есть на то желание. В любом случае я не надеялся на помощь и код разгребать всё равно мне.

          Спасибо, что указали на некоторые ошибки.