Pull to refresh

Comments 19

false-positive срабатываний на фразы типа «хватит мне запрещать оскорблять употреблять» нет?
Периодически бывают, но в оффлайн версии их сильно меньше. Сильно зависит от корпуса, на котором было обучение.
Попробую дать вам совет, как сделать бота лучше, хоть и не связанный с работой нейросетей.

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

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


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


Лет эдак пятнадцать назад наш городской провайдер открыл на своём локальном сайте чат местных пользователей.

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

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

Это именно то, что порождает больше всего негатива, и, в общем-то, дискредитирует саму идею автомодерации.

Так вот, главная задача всех автоматических борцов с токсичными высказываниями — это не словарь «плохих» слов, а словарь «хороших слов, которые просто похожи на плохие». Добавьте в разметку эту категорию, скорее всего у вас там на вершине списка, где можно «не размечать, а сразу отнести к определённому классу» какая-нибудь «оглобля».
Спасибо за совет! У нас бот работает только на английском (пока что), но основную проблему вы подметили верно. Мы решаем такую проблему тем, что ищем нетривиальные корпусы, как игровые чаты и используем сетки, они как раз и могут выучивать локальные зависимости. С точки бизнес логики, задача была сделать рейтинг сообщений 12+ (то есть уровень цензуры довольный высокий, а именно высокий recall), но при этом падает точность и решение может фолзить, что в нашем случае не так страшно.
Дальнейшие планы — собрать больше выборку и уменьшать ошибку первого рода (фолзы).
дополнительная часть челленжа — если можно что-то вставлять в игровых чатах и использовать эти вставки как часть слов — это будет сделано.
Допустим, можно линковать внутриигровые вещи и есть вещь с названием [Ankh]
Линкуем, добавляем 'us' после линка — гыгыгы! (детский восторг, поход наперекор системы, баттхерт у собеседника).
Если собеседник оскорбительно тупой или вызывающе умный — никакие системы модерации не спасут.
Эзопов язык никто не отменял. Будут говорить иносказаниями, да.

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

Жаль что иногда банит слова в пользу "ругательного" значения. Например, рассказать как съел крекер с сыром не получится — забанят за расовые оскорбления, ууу.


Плюс, можно легчайшим образом обмануть:


console.log("fu\u202etahssa gnikc")
// получаем (можете попробовать сами): fu‮tahssa gnikc

И система это не детектит, для неё это выглядит как "fu\u202etahssa gnikc".

Разумно, это же то, что вы ей отправили. Понятно, что в любой системе модерации можно найти уязвимость. Таких данных в нашем корпусе не было и такой метод аугментации я лично не встречал, сможете разъяснить? Это сложнее, чем русскую с на английскую c. vladbarcelo

По сути, просто используется RLO в середине словосочетания. Строка на входе получается мусором c юникодом, а при отображении юникод-символ не отображается, но переворачивает всё что идёт за ним справа на лево. Вы и сами можете это увидеть — попробуйте выделить ругательное словосочетание в комментарии и увидите как выделение "глючит" — сначала выделяет слева на право, о потом начинает идти в обратную сторону.

Не элегантно конечно, но обычно для всех символов, выходящих за рамки «белого списка» идет нормализация или другая обработка.

import unicodedata
s = 'xxx' #ваша строка, хабр режет ее к сожалению
s = ''.join([unicodedata.name(c).split()[-1:][0] if len(unicodedata.name(c).split()[-1:][0])==1 else c  for c in s])



> s
'FUCK YOU'
так в конечном итого сколько всего у Вас было наблюдений в датасете?
подскажите также плз что по времени обучению было для онлайн. также что по метрикам.
и какую Вы выбрали модельку для оффлайна все же? и что по метрикам тут тоже.

зы
нужное дело сделали. :fire:
Всего в датасете 420к примеров, из которых примерно 20% токсичные.
Время обучения онлайн модели не больше часа, F-мера на тестовом наборе данных ~0.86. 

Про модель для оффлайн: не можем раскрывать финальную архитектуру, но она посложнее, чем примеры архитектур в статье.
Мы следим за ним, но пока думаем. Датасет больше, но он не совсем нам подходит, у нас таргет именно на сообщения, а там большие тексты. В нашей работе их данные не очень помогли.
Средняя длина предложений в Jigsaw II (в словах) ~60.
Мне кажется можно натренировать что-то на полном «датасете» для понимания использования слова в контексте, а потом «отполировать» на урезанном «датасете» с длиной сообщения меньше X (20?).
С другой стороны основная проблема такой сети — специфический словарь в вашей конкретной области. Как пример — Bert, натренированный на Jigsaw I, дает всего 0.91 ROC AUC для Jigsaw II, но тот же Bert, натренированный на одинаковом по размеру «датасете» Jigsaw II, даст для него же 0.97 ROC AUC. Разница — словарная структура сообщений для модерации.
Sign up to leave a comment.

Articles