От нуля до не совсем героя в НЛП через классификацию языка вражды

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

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

Некоторые. Но не все.

Некоторые из этих комментариев - продукт реальных предубеждений и злого умысла. Я хотел посмотреть, смогу ли я найти способ построить модель, которая могла бы обнаруживать и классифицировать эти комментарии и отделять их от остальных. Как человек с очень ограниченными (читай нулевым) знанием методов обработки естественного языка, мне было интересно посмотреть, как далеко я смогу продвинуться за две недели.

"Ужас! Ужас!"

Чтобы ограничить объем своего расследования, я хотел выделить конкретную категорию неприятных комментариев - язык вражды. Хотя этот термин все чаще используют, его все чаще неправильно понимают. Судья Алито в своем письменном мнении по делу Матал против Там определяет язык вражды и наши отношения с ним следующим образом:

Слова, унижающие достоинство по признаку расы, этнической принадлежности, пола, религии, возраста, инвалидности или любого другого подобного основания, являются ненавистными; но самая большая гордость нашей юриспруденции в области свободы слова состоит в том, что мы защищаем свободу выражать «мысли, которые мы ненавидим».

Разжигание вражды в Соединенных Штатах на удивление не регулируется на федеральном уровне и защищено Первой поправкой. Однако такие учреждения, как университеты, часто устанавливают кодексы поведения и приличия, которые накладывают ограничения на речь с ограниченным эффектом.

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

Данные

Для начала мне нужно было поработать с языком ненависти. Быстрый поиск в Интернете позволил мне найти коллекцию твитов, помеченных людьми. Эти данные легли в основу статьи Автоматизированное выявление языка вражды и проблема ненормативной лексики. Беглое изучение данных показало, с чем я столкнулся:

Числовые столбцы соответствуют слева направо:

  • Индекс или номер записи твита
  • Количество читателей, просмотревших твит.
  • Количество читателей, которые посчитали твит разжигающим ненависть
  • Количество читателей, которые посчитали твит оскорбительным
  • Количество читателей, которые не посчитали твит ни одним из вышеперечисленных
  • Окончательная классификация, то есть мнение большинства

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

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

Выносить мусор

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

Для этого я составил список слов из ряда книг по 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%, что не является очень значительным улучшением, конечно, но, тем не менее, улучшением.

Заключительные мысли

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

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