Использование «VADER» для определения настроений пользователей на основе их комментариев.
Прочитав эту статью, вы научитесь анализировать и выполнять анализ настроений на основе правил в Python. Мы собираемся использовать Python
пакет под названием VADER
и протестировать его в наборе данных комментариев пользователей магазина приложений для мобильной игры под названием Clash of Clan.
Согласно официальной документации, VADER (Valence Aware Dictionary и sEntiment Reasoner):
… Инструмент анализа настроений на основе лексики и правил, специально адаптированный к настроениям, выраженным в социальных сетях.
В отличие от традиционного подхода машинного обучения, метод, используемый VADER
, ориентирован на публикации в социальных сетях. Это может не очень хорошо работать с литературой или новостной статьей. Однако одним из основных преимуществ является то, что время логического вывода очень быстрое, и вы можете без проблем запустить его на простом ноутбуке.
В этом руководстве есть 3 раздела:
- Настраивать
- Выполнение
- Вывод
Переходим к следующему разделу и приступаем к установке необходимых модулей.
1. Настройка
Пакеты Python
Вы можете легко установить VADER
на Python через pip install
. Перед продолжением установки настоятельно рекомендуется создать виртуальную среду. Активируйте свою виртуальную среду и выполните следующую команду.
pip install vaderSentiment
При чтении набора данных нам понадобится еще один модуль с именем pandas
. Установите его с помощью следующей команды:
pip install pandas
Набор данных
Перейдите по следующей ссылке и загрузите весь набор данных в корневой каталог вашего проекта. У вас должен быть csv
файл с именем clash-of-clans.csv
со следующими данными внутри него.
В следующем разделе мы напишем код Python.
2. Реализация
Я собираюсь использовать Jupyter Notebook
для этого урока. Сказав это, вы также можете нормально запускать его внутри Python
файла.
Импортировать
Добавьте следующее объявление импорта вверху файла.
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer import pandas as pd
Инициализация
Затем инициализируйте экземпляр класса SentimentIntensityAnalyzer
. Мы собираемся повторно использовать этот экземпляр каждый раз, когда вычисляем или анализируем тональность текста.
analyzer = SentimentIntensityAnalyzer()
DataFrame
Убедитесь, что clash-of-clan.csv
находится в том же каталоге, что и ваш файл. Загрузите набор данных с помощью функции read_csv
. Измените путь к файлу, если вы сохранили его в другом месте.
df_coc = pd.read_csv("./clash-of-clans.csv", encoding="utf-8") df_coc.head()
Вы должны увидеть в консоли следующий вывод. Форматирование может немного отличаться, если вы используете файл Python вместо Jupyter Notebook.
Анализ настроений
Вы можете рассчитать тональность отдельного текста с помощью функции polarity_scores
, предоставляемой этим модулем.
vs = analyzer.polarity_scores('I felt terrible today') print(vs)
Вы получите словарь, содержащий 4 пары ключ / значение, как показано ниже:
{'neg': 0.508, 'neu': 0.492, 'pos': 0.0, 'compound': -0.4767}
Довожу до вашего сведения,
Оценки
pos
,neu
иneg
- это соотношения для пропорций текста, которые попадают в каждую категорию (так что все они должны в сумме равняться 1 ... или быть близкими к нему с помощью операции с плавающей запятой). Это наиболее полезные метрики, если вам нужны многомерные измерения настроения для данного предложения.
Оценка
compound
вычисляется путем суммирования оценок валентности каждого слова в лексиконе, скорректированных в соответствии с правилами, а затем нормализованных до значений от -1 (крайнее отрицательное значение) до +1 (наиболее крайнее положительное значение). Это наиболее полезный показатель, если вам нужна единственная одномерная мера настроения для данного предложения. Назвать это «нормализованной, взвешенной составной оценкой» - правильно.
Обычно порог устанавливается следующим образом:
positive
-compound
балл ≥ 0,05negative
-compound
оценка ≤ -0,05neutral
-compound
в диапазоне от -0,05 до 0,05
Создайте новую функцию и вставьте в нее следующий код. Эта функция принимает введенный текст и возвращает тональность текста на основе составной партитуры. Ярлык настроения состоит из:
positive
— 2neutral
— 1negative
— 0junk
— -1
def calc_vader_sentiment(text): sentiment = 1 vs = analyzer.polarity_scores(str(text)) compound = vs['compound'] if(compound == 0): sentiment = -1 elif(compound >= 0.05): sentiment = 2 elif(compound <= -0.05): sentiment = 0 return sentiment
После того, как вы создали указанную выше функцию, создайте новый DataFrame
, состоящий из трех столбцов:
uid
— Уникальный идентификатор данных. Мы собираемся использовать индекс в качестве uidtext
— текст отзывов пользователей.label
— Оценка анализа тональности.
Запустите функцию calc_vader_sentiment
внутри понимания списка, как показано ниже.
df = pd.DataFrame({ 'uid': list(df_coc.index.values), 'text': df_coc['Content'], 'label': [calc_vader_sentiment(x) for x in df_coc['Content']] })
Для вычисления оценок потребуется несколько секунд, поскольку у нас есть около 50000 строк данных. Вы можете просто просмотреть первые 10 результатов, запустив следующий код.
df.head(10)
Вы должны получить следующие результаты.
Сохранить в файл
Если вы собираетесь сохранить его в файл, вы можете сделать это с помощью функции to_csv
, предоставляемой модулем pandas. Измените имя файла в соответствии с вашими предпочтениями.
df.to_csv("sentiment_result.csv", encoding='utf8', index=False)
3. Заключение
Подведем итоги тому, что мы узнали сегодня.
Мы начали с краткого объяснения VADER
и его функций. Затем мы установили необходимые модули с помощью pip install и загрузили набор данных clash-of-clan.csv
из Kaggle
.
После этого мы перешли к реализации нашего собственного кода для расчета оценки настроений в отзывах пользователей, используя только составную оценку, рассчитанную с помощью VADER
.
Кроме того, мы также научились сохранять окончательный результат в файл csv для использования в будущем.
Спасибо, что прочитали эту статью. Надеюсь увидеть вас снова в следующей статье!