Использование «VADER» для определения настроений пользователей на основе их комментариев.

Прочитав эту статью, вы научитесь анализировать и выполнять анализ настроений на основе правил в Python. Мы собираемся использовать Python пакет под названием VADER и протестировать его в наборе данных комментариев пользователей магазина приложений для мобильной игры под названием Clash of Clan.

Согласно официальной документации, VADER (Valence Aware Dictionary и sEntiment Reasoner):

… Инструмент анализа настроений на основе лексики и правил, специально адаптированный к настроениям, выраженным в социальных сетях.

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

В этом руководстве есть 3 раздела:

  1. Настраивать
  2. Выполнение
  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,05
  • negative - compound оценка ≤ -0,05
  • neutral - compound в диапазоне от -0,05 до 0,05

Создайте новую функцию и вставьте в нее следующий код. Эта функция принимает введенный текст и возвращает тональность текста на основе составной партитуры. Ярлык настроения состоит из:

  • positive — 2
  • neutral — 1
  • negative — 0
  • junk — -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 — Уникальный идентификатор данных. Мы собираемся использовать индекс в качестве uid
  • text — текст отзывов пользователей.
  • 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 для использования в будущем.

Спасибо, что прочитали эту статью. Надеюсь увидеть вас снова в следующей статье!

Ссылка

  1. Официальная страница Github для vaderSentiment
  2. Комментарии пользователей магазина приложений Clash of Clans, набор данных от Kaggle