Дипломная работа: Методы машинного обучения для анализа тональности коротких текстов

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

1.2.5 Модель внимания (Attention)

Достаточно новая модель «Внимания» [31], получившая популярность в задачах машинного перевода и классификации документов может быть применена и к анализу тональности комментариев. В частности, в работе L.Gao и R.Huang 2017 года, посвящённой распознаванию голоса, утверждается: «Механизмы внимания пригодны для отыскания малых участков ненависти в длинных комментариях» [32].

Действительно, не каждое слово оказывает одно и то же влияние на формирование того самого «смысла», семантического значения комментария. Следовательно, мы вводим механизм под названием «Внимание» для того, чтобы извлечь те слова, которые важны для определения значения текста, а затем агрегировать информацию именно из этих информативных слов, сформировав тем самым вектор целого комментария. Архитектурно модель выглядит так:

Рисунок 10. Архитектура модели «Внимание»

Более аккуратно этот процесс можно расписать таким образом [33]:

где к входному вектору применяется нелинейное преобразование для получения нового представления слова - вектора . Затем вычисляется «важность» конкретного слова как его сходство с неким контекстным вектором . Далее вычисляется нормированный «вес» данного слова с помощью функции Softmax:

Наконец, на выходе получаем вектор комментария как взвешенную сумму «важности» весов на их представления:

Под вектором контекста можно понимать как абстрактное представление запроса «какое слово можно считать информативным?» среди заданного множества слов. Вектор контекста инициализируется случайным образом и обучается совместно с другими параметрами.

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

Глава 2. Практическая часть

2.1 Обзор данных

Для разработки решения поставленной в работе задачи использовались материалы соревнования с платформы Kaggle, посвящённому многоклассовой классификации токсичных комментариев из Википедии [34]. Необходимо каждому комментарию сопоставить вектор вероятностей принадлежности к тому или иному типу токсичности. Таких типов всего шесть: toxic, severe_toxic, obscene, threat, identity_hate. Соответственно, комментарии могут принадлежать к токсичным, сильнотоксичным, неприличным, угрозам, оскорблениям, расистским или же принадлежать сразу к нескольким классам. Ввиду последнего обстоятельства мы приходим к задаче многоклассовой классификации с пересекающимися классами, следовательно, наша цель - построить наилучший алгоритм вида:

Применительно к этой задаче предлагается использовать метрику качества ROC-AUC, но её также нужно брать на макро-уровне, т.е. её необходимо усреднить по шести задачам бинарной классификации принадлежности комментария к одному определённому классу токсичности.

Данные уже разделены на тестовую и обучающую выборки, состоящие, соответственно, из 63978 и 159571 комментариев. Отметим их ключевые особенности.

Прежде всего посмотрим на распределение по классам в train'е. При этом добавим в датафрейм ещё один столбец - класс «Clean», отвечающий за разметку тех комментариев, что не были отнесены ни к одному типу токсичности. Из рисунка 11 видно, что подавляющее число комментариев в выборке не были помечены как токсичные, и возможно, их окрас является нейтральным или же положительным. В целом можно сказать, что распределение по классам несбалансированное.

Также стоит отметить, что один и тот же комментарий может принадлежать сразу нескольким классам. Это и понятно, ведь любой комментарий, отмеченный как «высокотоксичный» также наверняка попадёт и в класс «токсичных». Мы можем подсчитать число комментариев, относящихся к никакому, одному, двум, или всем 6 классам одновременно (см. Рис. 12). Имеет смысл посмотреть на то, не коррелируют ли классы между собой. Для этого была построена соответствующая матрица (см. Рис. 13)

Рисунок 11. Распределение комментариев по классам токсичности

Рисунок 12. Число комментариев, отмеченных данным числом тэгов

Рисунок 13. Корреляционная матрица

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

2.2 Предобработка данных

В задачах анализа текстов очень важным этапом работы является предобработка данных, зачастую её наличие или отсутствие радикальным образом сказывается на качестве модели.

В контексте работы с короткими комментариями из социальных сетей большой вес приобретает извлечение первичных признаков. Нам хочется извлечь как можно больше «внешних факторов», указывающих на тот или иной эмоциональный окрас комментария. Ясно, например, что комментарий с большим количеством восклицательных и вопросительных знаков несёт в себе какую-то эмоцию автора, можно с большой вероятностью утверждать, что он не нейтральный. Можно также предположить, что наиболее длинные комментарии с меньшей вероятностью будут являться токсичным. Таким образом, первичные признаки могут нести в себе много информации о текстах, которая зачастую будет потеряна в результате очистки данных, поэтому мы их и извлекаем. Первичные признаки для обучения линейных моделей были выбраны достаточно стандартно:

Рисунок 14. Первичные признаки для обучения линейных моделей

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

В качестве первого шага тексты были приведены к нижнему регистру, из данных были удалены переносы строк, IP-адреса, никнеймы пользователей. Затем, используя TweetTokenizer, тексты были разбиты на слова. Также при токенизации использовался словарь английских слов, пишущихся с апострофом, типа «you're». Такие слова были разбиты на два новых слова.

Стемминг, как известно, просто «обрезает» слова с конца по определённым правилам, что делает его простым и быстрым методом нормализации. Можно применять так называемый SnowballStemmer или же стеммер, разработанный М.Портером. Мы же в работе воспользовались другим подходом - лемматизацией, основанной на словарях. Если же слова нет в словаре, то по определённому алгоритму оно изменяется, и делается вывод о его начальной форме. В работе был использован WordNetLemmatizer.

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

2.3 Применение методов машинного обучения

2.3.1 Линейные модели

После предобработки текстов с помощью функции TfidfVectorizer библиотеки sklearn из очищенных данных были извлечены признаки, основанные на модели мешка слов и рассчитываемые по формуле:

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

На полученном пространстве признаков обучались рассмотренные в главе 1 линейные методы машинного обучения. Для проверки качества и настройки моделей использовалась кросс-валидация с пятью фолдами. Стоит отметить, что признаков всего было извлечено 70014, что заняло большое количество времени. Как для логистической регрессии, так и для наивного байесовского классификатора изменение гиперпараметра(обратного коэффициента регуляризации и параметра сглаживания, соответственно) практически не оказывало никакого влияния на итоговый результат по метрике качества, поэтому в итоговых вариантах моделей они взяты стандартными: , . Код реализации наивного байесовского классификатора представлен на рисунке 15.

Рисунок 15. Обучение наивного байесовского классификатора

2.3.2 Нейронные сети

Работа по обучению нейронных сетей производилась с помощью модуля keras, обладающим очень удобными методами для обработки текстов. В частности, в keras встроен класс Tokenizer. С его помощью можно создать словарь всех встречающихся в нашей выборке слов и сопоставить им индекс - место слова в «иерархии» относительно встречаемости в текстах. Ясно, что начальные индексы принадлежат стоп-словам. Затем комментарии кодируются индексами входящих в них слов. На деле это выглядит так:

Рисунок 16. Методы fit_on_texts и texts_to_sequences

На вход нейронной сети комментарии должны подаваться в виде векторов фиксированной размерности, но как выбрать эту размерность? Посмотрим на распределение числа слов в обучающей и тестовой выборках (см. Рис.17):

Рисунок 17. Распределение числа слов в комментариях обучающей и тестовой выборок

Понятно, что комментарии действительно короткие, медианой для обучающей выборки служит значение в 36 слов, а для тестовой - 32 слова. Разумно будет выбрать фиксированное значение числа возможных слов в комментарии равным 100. Далее все комментарии «режутся» и «дополняются» до фиксированной длины методом pad_sequences, при этом мы параллельно избавляемся от стоп-слов за счёт верхнего порога встречаемости, как бы исключая их из процедуры кодирования комментария. Собственно, данный массив закодированных комментариев и будет подаваться нами на слой Embedding'а нейронной сети.

Далее необходимо закодировать слова в каждом комментарии и сопоставить каждому вектор фиксированной размерности. Для этого существует много подходов, о них вскользь уже упоминалось в разделе 1.2.4. Суть их в том, чтобы передать компьютеру семантические свойства слов (такой возможности не предоставляет подход Bag of Words) и, желательно, сохранить при этом свойства векторной алгебры. Наиболее часто используется подход word2vec, но, на самом деле, появляется всё больше новых, более комплексных вероятностных подходов учёта контекста слов посредством их векторного представления. В данной работе решено было воспользоваться Стэнфордской моделью GloVe, обученной на корпусе данных из Википедии и GigaWord 5 ёмкостью в 6 млрд. токенов на английском языке [35].

Итак, по сути, на слое эмбеддинга слова проецируются в определённое векторное пространство в зависимости от контекста, «расстояния» от близлежащих слов. Для этого заготавливается матрица весов эмбеддинга, сопоставляющая каждому уникальному слову в выборке вектор из модели GloVe размерности 50, если, конечно же, это слово есть в словаре GloVe. Если же мы кодируем, например, смайлик, то ему будет сопоставлен случайный вектор размерности 50, значения которого обладают тем же математическим ожиданием и среднеквадратичным отклонением. В коде это выглядит так:

Рисунок 18. Создание матрицы весов для слоя Embedding

На этих векторных представлениях были обучены модели рекуррентных нейронных сетей с долгой краткосрочной памятью (BiLSTM) и сеть с архитектурой управляемых рекуррентных блоков (BiGRU). Следует иметь в виду ранее отмечавшуюся особенность, связанную с тем, что при использовании двусторонних версий этих архитектур выход рекуррентного слоя будет иметь в два раза большую размерность в силу конкатенации. Обе сети имеют идентичное строение, отличаются лишь, собственно, типом архитектуры рекуррентного блока (см. Рис.19).

Рисунок 19. Строение сети типа BiLSTM(BiGRU)

В сети шесть слоёв. Во-первых, ранее рассмотренные слои «Embedding» и слой «LSTM/GRU). Стоит отметить, что модель быстро переобучалась, поэтому на рекуррентном слое решено было использовать как обычный дропаут, так и рекуррентный дропаут скрытых состояний внутри LSTM-блока, после чего результаты заметно улучшились. При этом параметр обнуления для обоих видов дропаута составил .

Далее идёт слой max-пулинга, т.е., получая векторов размерности 100 на входе, этот слой возвращает вектор размерности 100 с максимальными значениями по всем входящим векторам. Затем этот новый полученный вектор проходит через полносвязный слой «Dense» с 50-ю нейронами (активационная функция - ReLU), слой «Dropout» с параметром обнуления и, наконец, через ещё один полносвязный слой с сигмоидальной функцией активации. Модель возвращает вектор размерности 6 для каждого комментария на входе - вероятности его попадания в той или иной класс токсичности.

Оптимизация производилась методом Adam[36], штрафная функция - binary_crossentropy, метрика - accuracy. Для модели BiLSTM: batch_size = 32 число эпох - 2. Для модели BiGRU: batch_size = 32 число эпох - 2. При большем числе эпох модели сильно переобучалась. Все гиперпараметры подбирались с помощью валидационной подвыборки. Результат прохода моделей можно увидеть на рисунках 20, 21.

Рисунок 20. Обучение сети с архитектурой типа BiLSTM

Рисунок 21. Обучение сети с архитектурой типа BiGRU

Результат хороший, но возникает вопрос, а можем ли мы ещё улучшить качество модели. Для этого необходимо её несколько усложнить, изменить строение. С этой целью был добавлен дополнительный свёрточный слой поверх рекуррентного слоя, возвращающий 32 вектора, соответствующих применённым 32 фильтрам с размером окна, равным трём (см. пункт 1.2.4, посвящённый CNN). Далее идёт слой max-пулинга и слой «Dense», имеющий уже не 50 нейронов, а 32. Следующие слои повторяют ранее рассмотренную архитектуру. Результат прохода моделей можно увидеть на рисунках 22, 23.

Источник: https://otherreferats.allbest.ru/download/1181134/