От нуля до не совсем героя в НЛП через классификацию языка вражды
Интернет - это джунгли. Здесь богатое разнообразие и чудесные цвета объединяются, чтобы создать уникальную экосистему, позволяющую использовать новые технологии и методы общения. Но за этим ярким навесом скрывается темная подоплека немодерируемого Интернета - места, где безопасность анонимности стирает границы гражданского дискурса.
Здесь вы найдете оскорбления и унижение, оскорбления и насмешки. В этом дивном новом мире человек - просто абстракция, удаленная от того, что он или она говорит. Здесь целые группы людей демонизируются и очерняются не по своей вине. К счастью, некоторые из них являются результатом интернет-троллей - комментарии, тщательно составленные, чтобы симулировать невежество и вызвать возмущение.
Некоторые. Но не все.
Некоторые из этих комментариев - продукт реальных предубеждений и злого умысла. Я хотел посмотреть, смогу ли я найти способ построить модель, которая могла бы обнаруживать и классифицировать эти комментарии и отделять их от остальных. Как человек с очень ограниченными (читай нулевым) знанием методов обработки естественного языка, мне было интересно посмотреть, как далеко я смогу продвинуться за две недели.
"Ужас! Ужас!"
Чтобы ограничить объем своего расследования, я хотел выделить конкретную категорию неприятных комментариев - язык вражды. Хотя этот термин все чаще используют, его все чаще неправильно понимают. Судья Алито в своем письменном мнении по делу Матал против Там определяет язык вражды и наши отношения с ним следующим образом:
Слова, унижающие достоинство по признаку расы, этнической принадлежности, пола, религии, возраста, инвалидности или любого другого подобного основания, являются ненавистными; но самая большая гордость нашей юриспруденции в области свободы слова состоит в том, что мы защищаем свободу выражать «мысли, которые мы ненавидим».
Разжигание вражды в Соединенных Штатах на удивление не регулируется на федеральном уровне и защищено Первой поправкой. Однако такие учреждения, как университеты, часто устанавливают кодексы поведения и приличия, которые накладывают ограничения на речь с ограниченным эффектом.
Благодаря анонимности, предлагаемой Интернетом, и изолированности от последствий, которую он обеспечивает, язык ненависти, безусловно, растет и вызывает все большую озабоченность сообществ и платформ, стремящихся поддерживать вежливость.
Данные
Для начала мне нужно было поработать с языком ненависти. Быстрый поиск в Интернете позволил мне найти коллекцию твитов, помеченных людьми. Эти данные легли в основу статьи Автоматизированное выявление языка вражды и проблема ненормативной лексики. Беглое изучение данных показало, с чем я столкнулся:
Числовые столбцы соответствуют слева направо:
- Индекс или номер записи твита
- Количество читателей, просмотревших твит.
- Количество читателей, которые посчитали твит разжигающим ненависть
- Количество читателей, которые посчитали твит оскорбительным
- Количество читателей, которые не посчитали твит ни одним из вышеперечисленных
- Окончательная классификация, то есть мнение большинства
Каждый твит читали как минимум три читателя, причем вдвое больше, чем для более неоднозначных утверждений.
Поскольку моя задача заключалась в том, чтобы классифицировать твит исключительно по тексту твита, я проигнорировал все числовые столбцы, за исключением окончательного решения о классификации.
Выносить мусор
Твиты по своей сути беспорядочные; Интернет-общение носит неформальный и подвижный характер - повторяющиеся буквы для выделения, нетрадиционные сокращения и постоянно развивающийся сленг - это лишь некоторые из вещей, которые оживляют платформу и делают текст просто тааааааааа намного сложнее для обработки. . Чтобы получить хоть какое-то точное представление о словах, которые были в моих данных, мне нужно было стандартизировать и нормализовать.
Для этого я составил список слов из ряда книг по Project Gutenberg. К сожалению (и это понятно), большая часть ненормативной лексики и жаргона в Интернете не была частью этих классических литературных произведений, и их приходилось добавлять вручную. Это была очень несовершенная система, так как мне было бы невозможно объяснить все, но она сохранила ненормативную лексику, в которой я нуждался, и нормализовала большую часть моего текста.
Я надеялся, что большая часть того, что может выпасть из трещин, по крайней мере, будет некорректно и согласованно нормализовано, тем самым ограничив потенциальное воздействие.
Разрушая это
С моими (в основном) исправленными словами я был готов преобразовать свои твиты в нечто более машиночитаемое. Распространенный подход при работе с текстом - разделение текста на отдельные слова или группы слов, известные как н-граммы.
Затем эти n-граммы были преобразованы в машиночитаемый вектор чисел, с числами, соответствующими tf-idf весу каждого n-грамма.
Частота документа, обратная частотности термина (tf-idf), может рассматриваться как мера того, насколько слово уникально или отличительно от класса документа. Один из подходов к определению важности слова - это просто подсчитать, сколько раз оно встречается (частота слов).
Однако у нас есть проблема. Просто некоторые слова чаще встречаются во всех документах, например «и», «the» или «a». Без удаления этих слов эти неразличимые слова будут преобладать в простом термине, таким образом скрывая реальную информацию.
TF-IDF был разработан, чтобы исправить это, наказывая слова, появляющиеся в нескольких документах. Хотя термин «the» может иметь высокую частоту использования, поскольку он встречается почти в каждом документе, его оценка tf-idf пострадает, позволяя по-настоящему уникальным и описательным словам всплывать на поверхность.
В моем случае классы «оскорбления» и «ненависти» имели общий словарный запас, например ругательства. Я надеялся, что tf-idf позволит появиться отличительным оскорблениям, которые делают язык ненависти тем, чем он является.
Сохраняя это стильно
Я выполнил два основных этапа классификации - пометку части речи и окончательную классификацию как ненавистную, оскорбительную или ни то ни другое.
Превосходная степень, инфинитивы и причастия, о боже!
Теперь я открыто признаю, что не любитель грамматики. Я не знал, что такое «прилагательное в превосходной семантической степени», еще пять минут назад. Но часть речи потенциально могла помочь мне извлечь дополнительный сок из данных, которые у меня были, поэтому я взялся за дело и подготовился к некоторым жестким лингвистическим инструкциям.
Теперь более умные люди уже шли по этому пути, и отличный код уже существует, чтобы пометить текст с минимальными усилиями. Но во имя обучения я решил построить свою собственную низшую модель, чтобы выполнять ту же работу. Взяв предварительно размеченный корпус, я использовал простой и быстрый алгоритм, наивный байесовский классификатор, чтобы выполнить эту работу.
Как можно было бы предположить «наивным», этот тип классификатора прост и основан на предположениях, которые торгуют точностью ради простоты и скорости. И это было просто и быстро; с помощью нескольких строк кода я запустил свой теггер с точностью 85%. Конечно, есть возможности для улучшения, но этого вполне достаточно: мне не терпелось перейти к сути проблемы - выявлению самого языка вражды.
Резюме. На этом этапе я убрал свои исходные твиты, прикрепил теги частей речи, разбил текст на небольшие фрагменты слов и превратил их в целое множество чисел. Я готов к главному событию.
Вне баланса
При первом просмотре данных я обучил пять различных типов моделей каждому из шести типов функций: фрагменты из одного, двух или трех слов и соответствующие им теги частей речи.
Отлично выглядит для первого прохода, правда? Мои наивысшие баллы F1 уже достигли 80-х, и я уверен, что с оптимизацией я смогу подняться выше.
К сожалению, мои данные были не такими добрыми. Когда я стремился создать классификатор языка вражды, меня больше всего интересовал показатель F1, характерный для языка вражды; показывая только то, что данные нарисовали радикально иную картину.
Что тут происходит? К сожалению, в моем волнении и спешке я не проявил усердия в проведении исследовательского анализа данных. Если бы я был более внимательным, я мог бы заметить что-то очень странное в моих данных.
Доля моих занятий была дико несбалансированной. Класс 0, язык вражды - класс, который меня больше всего интересовал - составил чуть более 7% моих общих данных. Из-за схожести словечек между «ненавистными» и «оскорбительными» классами моим моделям было трудно понять, где проходит граница между ненавистническим и оскорбительным.
В команде нет «я»
С моими лучшими моделями, работающими только на уровне 25%, очевидно, что мой подход не работал. Поскольку мои независимые модели не справлялись с этой задачей, я решил объединить лучшее, что у меня было - случайный лес бедняка.
Все пять моделей, которые я выбрал, были деревьями решений или их вариантами. Для классификации каждого твита я принимал решение большинства; если три модели предсказали класс 0, это было бы моим классификационным решением для этого твита. Благодаря этому подходу я получил оценку F1 класса 0 в 21%. Это было меньше, чем я добивался раньше.
У меня не хватило времени, и я забеспокоился. Даже с решением большинства моя модель не могла прийти к правильному выводу. Но это дало мне вторую идею: если большинство моих моделей ошибались в классификации языка ненависти, возможно, они ошибались постоянно. Если бы в этом была какая-то закономерность, я мог бы скормить эти пять решений новому классификатору, который смог бы разобраться во всем этом.
Моя уловка окупилась: ввод данных моей модели в новый наивный байесовский классификатор, принимающий окончательное решение, дал мне оценку F1 в 31%, что не является очень значительным улучшением, конечно, но, тем не менее, улучшением.
Заключительные мысли
Хотя мой успех в классификации языка ненависти не был таким впечатляющим, он дает неплохое начало. Как ни странно, но более важным, чем моя точность, было мое более глубокое понимание хорошего кода и анализа данных, которое могло произойти только в результате совершения ошибок и наличия тупой архитектуры кода.
Что касается самой модели, я, безусловно, мог бы сделать гораздо больше, особенно с тем, что я знаю сейчас. Единственный путь - от изящной обработки дисбаланса классов до изучения более продвинутых алгоритмов или встраивания слов.