В рамках моего участия в конкурсе #66DaysOfData, инициированном Кеном Джи, я начал применять на практике то, чему научился на вводном курсе Kaggle по обработке естественного языка (NLP) и мои предыдущие знания. Поэтому я выбрал набор данных для практики.

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

Отказ от ответственности: это НЕруководство. Воспринимайте эту статью как подробный отчет о моем опыте. Я хотел вести учет того, что я смог сделать, и более подробно объяснить, через что мне пришлось пройти.

Приятного чтения!

Набор данных

Это набор данных со ссылками на предложения и связанные с ними эмоции (вы можете найти его здесь — с более подробным описанием). Для каждого из предложений, содержащихся в наборе данных, у нас есть связанная эмоция. Набор данных содержит 6 различных эмоций:

'sadness', 'anger', 'love', 'surprise', 'fear', 'joy'

От «печали» до «радости» всего 4 эмоции. 😉

Таким образом, цель состоит в том, чтобы иметь возможность предсказывать эмоции, связанные с текстом.

моя тетрадь

В этой части я пропущу ключевые моменты моей работы.

Обработка данных

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

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

У нас есть облако слов. Вот, кроме того, некоторые тексты, связанные с определенными эмоциями в наборе данных:

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

Визуализация данных

Сколько текстов каждой категории у нас есть в этом наборе данных и как они распределяются? Это вопрос, на который я попытался ответить, нарисовав это:

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

Обучение моделей

Пришло время обучать моделей!

Я превратил проблему в задачу классификации. Для этого я векторизовал текст, чтобы он был векторным, и закодировал целевую функцию. Теперь цель принимает значения от 0 до 5 (всего 6 эмоций). Каждый текст теперь представлен соответствующим вектором. Дополнительная информация в следующих разделах.

Очистка текста

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

Токенизация

В области НЛП токенизация состоит в преобразовании текста в серию отдельных токенов¹. В моей работе «серия токенов» — это предложение в наборе данных, а «токен» — это слово в этом предложении. Существует множество алгоритмов токенизации, в зависимости от исходного языка текста, к которому он применяется. Результат токенизации обычно используется для подпитки другого алгоритма. В моем случае этот результат используется для выполнения лемматизации.

лемматизация

В языке слова происходят от определенного корня. Именно от этого корня образовано большинство слов. Процесс лемматизации заключается в возвращении слов к их корню. Например, в английском языке корнем слов «going», «пошли», «ушли» является слово « иди». Это слово называется «лемма». Без этого процесса у нас были бы все эти разные слова («пошли», «пошли», «ушли»…) при анализе тексты, даже если они связаны с одной и той же идеей. Поэтому модель должна изучать информацию, которая ей не нужна, и пытаться обнаружить связь между этими разными словами, даже если они означают одно и то же.

Очистка ненужных слов (стоп-слов)

Теперь необходимо удалить все бесполезные слова: «стоп-слова». Это слова, обычно используемые в языке, но которые ничего не привносят в нашу работу. В английском языке это такие слова, как «the», «a», «an», «in». ». Эти слова создают «шум» в данных и не дают надежных результатов. Они усложняют все обработки текстов и не используются для определения эмоции в тексте, поскольку не имеют прямого отношения к конкретной эмоции.

Кодирование целевых функций

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

Векторизация

Я с трудом мог объяснить, чем векторизация лучше, чем в этом курсе Kaggle²:

«Внедрения слов (также называемые векторами слов) представляют каждое слово численно таким образом, что вектор соответствует тому, как это слово используется или что оно означает. Векторные кодировки изучаются путем рассмотрения контекста, в котором появляются слова. Слова, которые появляются в похожих контекстах, будут иметь похожие векторы. Например, векторы для «леопарда», «льва» и «тигра» будут близки друг к другу, а от «планеты» и «замка» они будут далеко».

Вот фрагмент кода, иллюстрирующий этот процесс.

Разработка функций

Я использовал библиотеку Vader, чтобы добавить в набор данных еще 4 столбца. Для текста анализатор чувств дает оценку нейтральности, позитивности, негативности и общую оценку³.

… И, наконец, обучение моделей

Я решил обучать модели, используя несколько алгоритмов:

Для каждой из этих моделей я делаю следующее:

  1. Создайте базовую модель (с гиперпараметрами по умолчанию)
  2. Создайте вторую оптимизированную модель с поиском оптимальных гиперпараметров через GridSearch.
  3. Сравнение производительности базовой модели и оптимизированной модели

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

Результаты

Моделью с наивысшей точностью была Машина опорных векторов с точностью 72 %. Логистическая регрессия также дает хорошие результаты (71%). Худшим оказалось Дерево решений с точностью 35 %. Я сделал сравнение различных используемых алгоритмов:

Legend:
LR = Logistic Regression
DT = Decision Tree
NB = (Gaussian) Naive Bayes
SVM = Support Vector Machines

Ввиду этих результатов может быть интересно продолжить анализ для улучшения двух лучших моделей (SVM и LR).

Вот матрица путаницы для лучшей модели (SVM):

Что можно сказать об этой матрице путаницы?

Неудивительно, что модель (очень) хорошо работает с текстами, связанными с «радость» (85%), и не очень хорошо предсказывает категорию «сюрприз» (46%). ). Он также хорошо справляется с текстами, связанными с «печалью» — 77% (также много текстов, относящихся к этой категории). В целом мы замечаем, что производительность модели для данной категории, по-видимому, связана с количеством текстов этой категории в наборе данных. Впрочем, это не имеет прямого отношения, так как текстов, связанных с «любовью», все же немного больше, чем с «сюрпризом»но худшие выступления выступают за «любовь» (44%). Короче говоря, количество текстов не единственная причина, но она, безусловно, играет роль.

У «любви» есть свои уравнения, о которых SVM ничего не знает.😄

Несколько мыслей перед отъездом

Это упражнение не является вопросом жизни и смерти. В самом деле, дело не в том, чтобы предсказать, является ли клетка раковой или нет, стоит ли инвестировать в ту или иную другую фондовую рыночную стоимость… Также нет четкого определения приложений. Поэтому мы позиционируем себя в «веселом» и информативном контексте. Поэтому я считаю, что в этом контексте точность 72% остается вполне приемлемой. Но мы все же должны спросить себя, можно ли улучшить эти результаты. Это то, что побудило меня написать этот дополнительный раздел.

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

  • Этап предварительной обработки
  • Качество набора данных

Этап предварительной обработки

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

Я просмотрел множество ресурсов (блокноты на Kaggle, исследовательские статьи, видео на YouTube и т. д.), чтобы увидеть результаты, обычно получаемые при решении задач, подобных той, с которой я столкнулся здесь. Я полностью осознаю, что это не совсем одна и та же проблема, что используемые данные, алгоритмы, предварительная обработка и целый ряд других параметров отличаются в ресурсах, с которыми я консультировался. Скорее, цель состояла в том, чтобы получить общее представление о том, что можно сделать сегодня. Я мог видеть, что в целом достигнутые результаты были более или менее равными тем, которые я имею здесь.

Тем не менее, я мог видеть довольно существенные различия в производительности, когда я менял свои методы предварительной обработки, когда я использовал больше или меньше шагов предварительной обработки, когда я тем или иным образом выполнял векторизацию и так далее. У меня были ситуации, когда модели работали не лучше 55%, а некоторые изменения в предварительной обработке приводили к производительности около 70%; Кроме того, наихудшая производительность увеличилась с 35 % до 45 % (Дерево решений) — и это довольно многообещающе. Я также увеличил точность с 25 % в категории "сюрприз" до 46 % на момент публикации, поэтому это определенно очень важный шаг

Наконец, большинство других блокнотов, связанных с этим набором данных на Kaggle, основаны на методах глубокого обучения, где они часто достигают точности более 90%.

Качество набора данных

Ранее я упоминал, что данные были несбалансированы. Возможно, это сыграло роль в достигнутых результатах. Мы могли видеть результаты с матрицей путаницы.

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

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

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

Помимо технического аспекта, это упражнение было для меня временем, чтобы провести ряд мыслей, которые многому меня научили. Я также провел много исследований и читал.

Скажи мне, что ты думаешь об этом. Я также был бы рад сравнить точки зрения. Если у вас есть интересная информация, которой вы хотите поделиться, пожалуйста, не стесняйтесь делать это в комментариях.

Мой блокнот с полным кодом можно найти здесь: https://www.kaggle.com/kelvar/tell-me-your-mood

[1] MAËL FABIEN (2019 г.) francais-tal-nlp/»

[2] Kaggle (01/2020), Word Vectors
https://www.kaggle.com/matleonard/word-vectors

[3] Парул Пандей (09/2018), Упрощение анализа настроений с помощью VADER в Python (в тексте социальных сетей)
https://medium.com/analytics-vidhya/simplifying- анализ настроений в социальных сетях с использованием vader-in-python-f9e6ec6fc52f