Когда я решил поработать над анализом настроений, обзор хорошей еды Amazon (проект Kaggle) был довольно интересным, так как он дает нам хорошее введение в анализ текста. Я загрузил набор данных из файла Kaggle (.csv). Файл (.csv) содержит набор текстовых документов (568 454 обзора продуктов питания) по октябрь 2012 г. включительно.

Наша задача - предсказать настроение (положительное или отрицательное) оценки рецензента по шкале от 1 до 5, где 1 означает, что рецензенту крайне не нравится еда, которую он или она упоминает в обзоре, а 5 указывает, что пользователю очень нравится еда. .

Справочная информация о данных

  1. Чтобы прочитать файл .csv, я использовал команду:

2. Набор данных состоит из следующей информации:

3. food_data.head () предоставил мне следующую информацию:

Хотя мы можем видеть, что на рисунке 1 есть много функций, но нас не интересуют все функции. Итак, я извлек столбцы «Оценка» и «Текст» из рисунка 1. Хотя мне было любопытно узнать количество для каждого рейтинга, я обнаружил, что рейтинг 5 был довольно большим числом по сравнению с другим числом.

5    363122
4     80655
1     52268
3     42640
2     29769

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

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

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

  1. Случайная недостаточная выборка: Случайная недостаточная выборка направлена ​​на сбалансированное распределение классов путем случайного исключения примеров большинства классов. Это делается до тех пор, пока экземпляры классов большинства и меньшинства не будут сбалансированы. В этом подходе мы сокращаем данные из более высокого класса (данные с рейтингом 4 и 5), чтобы сопоставить данные с более низким классом (данные с рейтингом 1 и 2).
  2. Случайная избыточная выборка: избыточная выборка увеличивает количество экземпляров в классе меньшинства путем их случайной репликации, чтобы представить более высокое представление класса меньшинства в выборке.
  3. Генерация синтетических данных: простыми словами, вместо репликации и добавления наблюдений из класса меньшинств, он преодолевает дисбаланс путем генерации искусственных данных. Это также разновидность техники передискретизации. Что касается генерации синтетических данных, метод синтетической передискретизации меньшинства (SMOTE) является мощным и широко используемым методом.

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

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

Разделение данных

В то время как мой набор данных теперь сбалансирован, моей следующей задачей было разделить данные на обучающий и тестовый набор. Мой ввод - «Текст», а на выходе - «Настроение».

Граф Векторизатор

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

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

Короче говоря, CountVectorizer помогает нам определить частоту использования определенного слова в текстовом документе.

TfidfVectorizer

Эти данные дополнительно обрабатываются с помощью Tfidf Vectorizer, который помогает нам придавать больший вес важным словам, которым менее важные слова для тематического исследования будут иметь больший вес.

Поскольку наш код основан на подсчете частоты каждого слова в документе, поэтому, если определенные слова, такие как 'the', 'if' и т. Д., Присутствуют чаще, чем более важные слова, такие как 'buy', 'product 'и т. д., что дает нам контекст.

н-граммы

Я решил сделать модель немного интереснее, добавив в нее «n-граммов». Это еще больше улучшило бы нашу модель, например, помогло бы нам различать «хорошо» и «не хорошо», так как оба слова использовались бы вместе (для пар, рассчитанных на два грамма). Кроме того, это помогло бы нам работать с большим количеством функций. Я установил n-граммы в диапазоне от 1 до 2, что помогает нам выделить особенности для 1 и 2 граммов.

Примерка модели

После предварительной обработки модель должна быть подогнана. Для подгонки этой модели я решил работать с логистической регрессией и полиномиальным наивным байесовским алгоритмом. Хотелось бы сравнить обе модели.

- ›Полиномиальный наивный байесовский алгоритм

Обработка текста хорошо работает с полиномиальным алгоритмом NB. Итак, я решил применить Multinomial NB.

После сопоставления модели с моими данными обучения я также спрогнозировал точность модели с помощью «AUC» (Площадь под кривой). Это дает нам оценку 0,924, что хорошо.

-> Логистическая регрессия

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

Показатель «AUC» (0,9428), кажется, дает лучшее предсказание логистической регрессии, чем полиномиальный NB.

Тестирование модели

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

Моя модель, кажется, правильно предсказывает настроение.

Вывод

В соответствии с моим проектом я обнаружил, что логистическая регрессия дала мне лучший результат по сравнению с алгоритмом Multinomial NB. Но я также хотел бы упомянуть, что я использовал метод выборки, что означает, что я не работал со всем набором данных. Точность может еще больше повыситься, если принять во внимание весь набор данных. Было бы интересно работать со всем набором данных, используя методы глубокого обучения, такие как RNN, что выходит за рамки моей текущей работы.