Наука о данных в реальном мире

Анализ настроений - руководство с обзорами фильмов

Как вы относитесь к анализу сантиментов? Хорошо плохо? К концу этой статьи вы почувствуете себя уверенно!

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

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

Этот пост будет охватывать:

  1. Конкурс
  2. Предварительная обработка данных
  3. Функции
  4. Моделирование
  5. Оценка
  6. Следующие шаги

Конкурс

Мы будем использовать набор данных фильмов IMDB, который содержит 25 000 обзоров с пометками для обучения и 25 000 обзоров для тестирования. Kaggle Challenge требует бинарной классификации (Мешок слов и мешки с попкорном).

Давайте посмотрим на некоторую сводную статистику набора данных (Li, 2019). Нам говорят, что положительные и отрицательные отзывы о фильмах делятся равномерно. Вот несколько положительных и отрицательных отзывов:

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

Предварительная обработка

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

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

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

Функции

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

Мешок слов

Мы получаем список словаря из корпуса (всего текстового набора данных). Длина словарного списка равна длине вектора, который будет выводиться, когда мы применяем Bag of Words (BOW). Для каждого элемента (может быть запись, предложение, строка текста) мы преобразуем текст в счетчик частоты в виде вектора. В этом случае мы ограничиваем его до верхних 5000 слов, чтобы ограничить размерность данных. Мы кодируем это, настраивая векторизатор счетчика из библиотеки sklearn, подгоняем его к обучающим данным, а затем преобразуем как обучающие, так и тестовые данные.

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

Text:
It was the best of times,
it was the worst of times,
it was the age of wisdom,
it was the age of foolishness.
Unique words:
"it", "was", "the", "best", "of", "times", "worst", "age", "wisdom" "foolishness"
"it was the worst of times" = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]
"it was the age of wisdom" = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]
"it was the age of foolishness" = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]

Word2Vec

Word2vec (Word to Vector) - двухслойная нейронная сеть, обрабатывающая текст. Его входными данными является текстовый корпус, а его выходными данными - набор векторов: векторов признаков для слов в этом корпусе. Алгоритм был создан Google в 2013 году. Пространство 50-D можно визуализировать с помощью классических методов проекции (например, PCA), чтобы преобразовать векторы в двумерные данные, которые можно отобразить на графике.

Зачем нам использовать Word2vec вместо BOW? Лучше учить слова в их окружающем контексте. Этот процесс немного сложнее, чем реализация BOW, поэтому я не буду описывать его здесь, но его можно найти в папке GitHub (Dar, Green, Kurban & Mitchell, 2019). Короче говоря, требуется разметка обзоров в виде предложений, а не слов, определение векторных представлений и их соответствующее усреднение.

Tf-Idf

Это сокращение от Term-frequency-Inverse-Document-Frequency и дает нам меру того, насколько важно слово в документе.

Частота термина (как и для пакета слов):

Частота обратного документа измеряет, насколько редко термин встречается во всех документах (чем выше значение, тем реже слово) [1]:

Мы объединяем эти два, чтобы получить Tf-Idf следующим образом:

Для реализации этого представления мы используем функцию TfidfTransformer из библиотеки sklearn. Подгонка происходит на обучающем наборе, и значения для тех же слов определяются для тестового набора.

[1] где ln - натуральный логарифм.

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

Мы попробовали две разные модели для этого набора данных: Naïve Bayes и Random Forest. Наивный Байес основан на теореме Байеса, а случайный лес - это группа деревьев решений. Консолидированный код для этих двух реализаций можно найти в записной книжке NLP_IMDb Jupyter в репозитории GitHub (Dar et al., 2019).

Наивный байесовский

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

B - это свидетельство, а A - гипотеза (Gandhi, 2018). Мы должны предполагать, что функции независимы (одно не влияет на другое).

Обозначая это с точки зрения этой проблемы, мы имеем y, представляющий положительный или отрицательный отзыв, X - вектор характеристик из обзоров. Уравнение, которое мы получаем для поиска класса:

Это реализовано с использованием Наивного байесовского пакета sklearn!

Случайный лес

Случайный лес - это серия деревьев решений, в которых конечные узлы указывают прогнозируемый класс. Мы можем использовать функцию RandomForestClassifier из пакета sklearn’s ensemble.

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

Оценка

Kaggle указывает, что в качестве показателя для этого соревнования используется площадь под кривой ROC. ROC - это сокращение от Receiving Operator Characteristic и представляет собой кривую вероятности. Он отображает соотношение истинно положительных результатов и ложноположительных результатов. [2] Чем выше площадь под этой кривой, тем лучше модель предсказывает результат. График для Мешка слов и Случайного леса приведен ниже. Пунктирная линия представляет собой базовый уровень, которого можно было бы ожидать, если бы прогнозы были случайными.

Мы можем проверить несколько различных перестановок в таблице ниже.

Интересно видеть, что Tf-Idf работает немного лучше, а Naïve Bayes работает немного лучше, чем Random Forest. Однако производительность наивного байесовского метода с функциями Word2Vec значительно упала. Вероятно, это связано с тем, что некоторая информация теряется при преобразовании представления в положительное (поскольку наивный байесовский метод допускает только положительные значения), а вместо него используется гауссовский наивный байесовский код.

[2] Истинно положительный результат представляет, когда положительный элемент прогнозируется как положительный. Ложно-положительный результат представляет, когда отрицательный элемент предсказывается как положительный.

Следующие шаги

Это только начало анализа настроений. Дальнейшие подходы могут использовать биграммы (последовательности двух слов), чтобы попытаться сохранить более контекстное значение, с использованием нейронных сетей, таких как LSTM (долгосрочная краткосрочная память), чтобы увеличить расстояние между словами в обзорах и т. Д.

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

Мешок слов встречает мешки с попкорном. (нет данных). Получено с https://www.kaggle.com/c/word2vec-nlp-tutorial/

Дар О., Грин С., Курбан Р. и Митчелл К. (2019). Спринт 3, команда 1. Получено с https://github.com/shiaoligreen/practical-data-science

Ганди, Р. (5 мая 2018 г.). Наивный байесовский классификатор. Получено с https://towardsdatascience.com/naive-bayes-classifier-81d512f50a7c

Ли С. (18 марта 2019 г.). Полный исследовательский анализ данных и визуализация текстовых данных. Получено с https://towardsdatascience.com/a-complete-exploratory-data-analysis-and-visualization-for-text-data-29fb1b96fb6a »

Анализ настроений. (нет данных). Получено с https://monkeylearn.com/sentiment-analysis/