"НАЧИНАЯ"

Введение в анализ настроений

Создание вашей первой модели анализа настроений с помощью Python

«Dynamite» от BTS с 11 768 848 комментариями является самым комментируемым видео на YouTube. Предположим, участник BTS хотел узнать, что слушатели думают о песне. На чтение комментария в секунду у него все равно уйдет более 4 месяцев. К счастью, с помощью машинного обучения он мог автоматически пометить каждый комментарий как положительный или отрицательный. Это называется сентиментальным анализом. Точно так же через онлайн-обзоры, ответы на опросы и публикации в социальных сетях предприятия получают доступ к большому количеству отзывов клиентов. Анализ настроений стал важным для анализа и понимания этих данных.

В этой статье мы рассмотрим процесс построения модели анализа настроений с помощью Python. В частности, мы создадим модель набора слов с помощью SVM. Интерпретируя эту модель, мы также понимаем, как она работает. Попутно вы изучите основы обработки текста. Мы рассмотрим ключевые фрагменты кода, и вы можете найти полный проект на GitHub. Прежде чем мы погрузимся во все это, давайте начнем с объяснения, что такое анализ настроений.

Что такое анализ настроений?

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

В примере с BTS мы пытаемся предсказать мнение слушателей. Позитивное мнение означало бы, что слушателю понравилась песня. Мы могли бы использовать анализ настроений, чтобы выявить потенциально разжигающие ненависть высказывания на нашей платформе. В этом случае отрицательные настроения будут означать, что текст содержит расистские / сексистские мнения. Некоторые другие примеры включают в себя прогнозирование иронии / сарказма или даже намерений человека (то есть планируют ли они купить продукт).

Анализ настроений с помощью Python

Итак, существует множество типов моделей анализа настроений. Есть также много способов провести анализ настроений. Мы сконцентрируемся на применении одного из этих методов. Это создание модели набора слов с использованием SVM. Начнем с пакетов Python, которые помогут нам в этом.

Пакеты

В строках 2–5 у нас есть несколько стандартных пакетов, таких как Pandas / NumPy для обработки наших данных и Matplotlib / Seaborn для их визуализации. Для моделирования мы используем пакет svm (строка 7) из sci-kit learn. Мы также используем некоторые пакеты показателей (строка 8) для измерения производительности нашей модели. Последний набор пакетов используется для обработки текста. Они помогут нам очистить наши текстовые данные и создать элементы модели.

Набор данных

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

Используя приведенный ниже код, мы загружаем весь набор данных. 1600000 строк - это много данных, особенно с учетом того, что нам придется очистить текст и создать из него элементы. Итак, чтобы сделать вещи более управляемыми, в строке 9 мы выбираем случайную выборку из 50 000 твитов.

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

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

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

Обратите внимание, что все очищенные твиты написаны строчными буквами и не имеют знаков препинания. Слова «there», «is», «on», «and», «so», «to», «be» и «how» были удалены из первого твита. Все это примеры игнорируемых слов. Мы ожидаем, что эти слова будут использоваться как в положительных, так и в отрицательных твитах. Другими словами, они ничего не скажут нам о настроении твита. Так что, удалив их, мы надеемся, что у нас останутся слова, которые действительно передают настроение.

После этого важно подумать о том, как очистка текста повлияет на вашу модель. Для некоторых проблем могут быть важны такие вещи, как игнорируемые слова и знаки препинания. Например, рассерженные клиенты могут чаще использовать восклицательные знаки !!! Если вы не уверены, вы всегда можете рассматривать очистку текста как гиперпараметр. Вы можете обучать модели, используя как игнорируемые слова, так и не используя стоп-слова, и видеть влияние на точность.

Разработка функций (набор слов)

Даже после очистки, как и все модели машинного обучения, виртуальные машины защиты не могут понимать текст. Под этим мы подразумеваем то, что наша модель не может принимать необработанный текст в качестве входных данных. Сначала мы должны представить текст математическим способом. Другими словами, мы должны преобразовать твиты в элементы модели. Один из способов сделать это - использовать N-граммы.

N-граммы - это наборы из N последовательных слов. На рисунке 2 мы видим пример того, как предложение разбито на 1 грамм (униграммы) и 2 грамма (биграммы). Униграммы - это просто отдельные слова в предложении. Биграммы - это набор всех двух последовательных слов. Триграммы (3 грамма) будут набором всех 3 последовательных слов и так далее. Вы можете представить текст математически, просто посчитав, сколько раз встречаются определенные N-граммы.

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

В таблице 3 приведен пример матрицы признаков, созданной с использованием этого подхода. В верхнем ряду дается каждая из 1000 N-граммов. Для каждого твита есть пронумерованная строка. Числа в матрице показывают, сколько раз N-грамм встречается в твите. Например, «извините» встречается один раз в твите 2. По сути, мы представляем каждый твит как вектор. Другими словами, мы векторизуем наши твиты, используя количество N-граммов.

Приведенный ниже код используется для создания одной из этих матриц функций. Мы начинаем с разделения нашего набора данных на обучающий (80%) и тестовый (20%) набор. В строке 6 мы определяем CountVectoriser, который будет использовать векторизацию наших твитов с использованием 1000 лучших униграмм / биграмм. В строке 7 мы используем это для векторизации нашего обучающего набора. Функция .fit_transform () сначала получит 1000 наиболее распространенных N-граммов, а затем подсчитает, сколько раз они встречаются в каждом твите.

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

Наконец, мы масштабируем матрицу признаков, используя масштабирование минимум-максимум. Это гарантирует, что все наши функции находятся в одном диапазоне. Это важно, поскольку на SVM могут влиять функции с большими значениями. Как и в случае со списком N-граммов, мы масштабируем оба набора одинаково (т.е. используя максимальное и минимальное значения из обучающего набора).

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

Моделирование

Когда наш набор для обучения и тестирования готов, мы можем обучать нашу модель. Мы делаем это в строке 2 кода ниже. Здесь мы обучаем SVM на нашем обучающем наборе. В частности, мы используем SVM с линейным ядром и устанавливаем параметр штрафа равным 1. В строке 5 мы используем эту модель, чтобы делать прогнозы на тестовом наборе, а в строке 8 мы вычисляем точность этих прогнозов.

В итоге на тестовой выборке модель имела точность 73,4%. Мы можем немного глубже изучить характеристики модели, посмотрев на матрицу путаницы на рисунке 2. Имеется 915 ложных отрицательных результатов по сравнению с 1747 ложными срабатываниями. Другими словами, большинство ошибок происходит из-за того, что модель неверно предсказывает твиты с негативным настроением как имеющие позитивный настрой. Итак, для первого наброска наша модель не так уж плоха, но есть много возможностей для улучшения.

Мы можем улучшить производительность нашей модели несколькими способами. Мы можем потратить больше времени на настройку гиперпараметров модели. Как упоминалось выше, мы установили для параметра штрафа значение 1. Фактически он был выбран после тестирования нескольких различных значений (например, 0,001, 0,01, 0,1, 1 и 10) и определения того, какое из них имеет наивысшую k-кратную точность перекрестной проверки. Таким же образом можно настроить и другие гиперпараметры, такие как этапы очистки ядра и текста. Мы также могли бы интерпретировать нашу модель, выяснить, как она работает, и внести изменения на основе этих результатов.

Интерпретация нашей модели

Один из способов интерпретации SVM - это посмотреть на веса / коэффициенты модели. В процессе обучения SVM каждому N-грамму в обучающем наборе присваивается вес. N-граммы с положительным весом ассоциируются с положительными эмоциями. Точно так же люди с отрицательным весом связаны с отрицательными настроениями.

На рисунке 3 мы визуализируем коэффициент 15 из 1000 N-граммов. Первые 5 имеют высокие положительные коэффициенты. В этом есть смысл, поскольку вы, вероятно, ожидали, что твиты со словами вроде «счастливый» или «улыбка» будут иметь положительное настроение. Точно так же слова с отрицательными коэффициентами: «скучно», «ненавижу» и т. Д. Будут связаны с отрицательными настроениями. Обратите внимание, что есть также N-граммы с коэффициентами, близкими к 0.

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

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

Анализ тональности - это один из типов проблем в обработке естественного языка (NLP). В статье ниже я расскажу вам о процессе решения другой проблемы - идентификации языка. Я рекомендую прочитать его, если вас интересует НЛП. Мы также опираемся на многие концепции, описанные выше.



Источники изображений

Все изображения принадлежат мне или получены с сайта www.flaticon.com. В случае последнего у меня есть Полная лицензия, как определено в их Премиум-плане.

использованная литература

[1] Музыкальные видеоклипы с наибольшим количеством комментариев (2021 г.), https://kworb.net/youtube/topvideos_comments.html

[2] Sentiment Analysis: A Definitive Guide (2021), https://monkeylearn.com/sentiment-analysis/.

[3] Сьюзан Ли, веб-скрапинг, TripAdvisor, Text Mining и анализ настроений для отзывов об отелях (2018 г.), https://towardsdatascience.com/scraping-tripadvisor-text-mining-and-sentiment- анализ-по-отзывам-об отелях-cc4e20aef333