Комментарии 19
Поначалу я очень обрадовался этой статье — о, неужели наконец-то кто-то решил научить нейросеть бороться с настоящими токсичными высказываниями, а не тупо работать по словарю.
Читаю дальше — нет, всё то же самое:
нужно поступить так, как поступают пользователи: сгенерировать такие же изменения в сообщениях и добавить их в обучающую выборку к основным данным.
Таким образом, большую часть данных (с очень большими и очень маленькими значениями вероятности) можно было не размечать, а сразу отнести к определенному классу.
Лет эдак пятнадцать назад наш городской провайдер открыл на своём локальном сайте чат местных пользователей.
Безо всякого новомодного машинного обучения там успешно блокировались поклонники академической гребли и люди, к которым в гости приехал поп из деревни.
Прошли годы, а борцы против токсичности — какой-нибудь Steam или Livejournal — продолжают закрывать звёздочками слова типа «захлебнулись» или «хулить», вызывая смех и раздражение.
Это именно то, что порождает больше всего негатива, и, в общем-то, дискредитирует саму идею автомодерации.
Так вот, главная задача всех автоматических борцов с токсичными высказываниями — это не словарь «плохих» слов, а словарь «хороших слов, которые просто похожи на плохие». Добавьте в разметку эту категорию, скорее всего у вас там на вершине списка, где можно «не размечать, а сразу отнести к определённому классу» какая-нибудь «оглобля».
Дальнейшие планы — собрать больше выборку и уменьшать ошибку первого рода (фолзы).
Допустим, можно линковать внутриигровые вещи и есть вещь с названием [Ankh]
Линкуем, добавляем 'us' после линка — гыгыгы! (детский восторг, поход наперекор системы, баттхерт у собеседника).
Жаль что иногда банит слова в пользу "ругательного" значения. Например, рассказать как съел крекер с сыром не получится — забанят за расовые оскорбления, ууу.
Плюс, можно легчайшим образом обмануть:
console.log("fu\u202etahssa gnikc")
// получаем (можете попробовать сами): futahssa gnikc
И система это не детектит, для неё это выглядит как "fu\u202etahssa gnikc".
По сути, просто используется RLO в середине словосочетания. Строка на входе получается мусором c юникодом, а при отображении юникод-символ не отображается, но переворачивает всё что идёт за ним справа на лево. Вы и сами можете это увидеть — попробуйте выделить ругательное словосочетание в комментарии и увидите как выделение "глючит" — сначала выделяет слева на право, о потом начинает идти в обратную сторону.
Вот, кстати, ещё один метод обхода, вдогонку: script capital letters. Например: https://pastebin.com/6jWMb15a
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'
www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification
Там и «датасет» побольше))
Мне кажется можно натренировать что-то на полном «датасете» для понимания использования слова в контексте, а потом «отполировать» на урезанном «датасете» с длиной сообщения меньше X (20?).
С другой стороны основная проблема такой сети — специфический словарь в вашей конкретной области. Как пример — Bert, натренированный на Jigsaw I, дает всего 0.91 ROC AUC для Jigsaw II, но тот же Bert, натренированный на одинаковом по размеру «датасете» Jigsaw II, даст для него же 0.97 ROC AUC. Разница — словарная структура сообщений для модерации.
Построение автоматической системы модерации сообщений