Сколько раз мы идем в кино после просмотра обзора… для меня обзор имеет огромное значение

Недавно, когда я изучал Kaggle, я нашел этот интересный проект «Анализ настроений при просмотре фильмов». Задача, упомянутая Kaggle: «Классифицировать тональность предложений из набора данных Rotten Tomatoes».

Это проблема классификации нескольких классов, что просто означает, что набор данных имеет более 2 классов (двоичный классификатор). Пять классов, соответствующих настроениям:

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

Исследование данных

Давайте посмотрим на несколько первых фраз обучающего набора данных:

Количество комментариев по категориям

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

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

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

После очистки данных столбец «Phrase» был преобразован в столбец «clean-review».

n-граммы и Tfidf Vectorizer

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

Машинное обучение

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

Для подгонки модели с логистической регрессией я использовал классификатор OnevsRest. Эта стратегия заключается в подборе одного классификатора на класс. Для каждого классификатора класс сопоставляется со всеми другими классами. Эта стратегия используется для многоэлементного обучения, где классификатор используется для прогнозирования нескольких меток, например, путем подгонки к двумерной матрице, в которой ячейка [i, j] равна 1, если образец i имеет метку j, и 0 в противном случае.

Точность для этой модели 72,17%. Я также использовал алгоритмы Linear SVC и Multinomial Naive Bayes, для которых средняя точность составляла 77,44% и 59,50% соответственно.

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

Глубокое обучение

Разделение данных обучения

Данные обучения разделены на данные обучения и проверки с использованием библиотеки разделения sklearn train-test.

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

После разделения данных было вычислено общее количество функций, которое представляет собой общее количество уникальных слов в корпусе.

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

Токенизатор

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

Заполнение последовательности

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

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

Создайте рекуррентную нейронную сеть

Первый уровень в RNN - это так называемый уровень встраивания, который преобразует каждый целочисленный токен в вектор значений. Это необходимо, потому что целочисленные токены могут принимать значения от 0 до 10000 для словаря из 10000 слов. RNN не может работать со значениями в таком широком диапазоне. Слой встраивания обучается как часть RNN и будет учиться отображать слова с аналогичными семантическими значениями с аналогичными векторами встраивания.

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

Я использовал 3 разных варианта RNN и сравнил точность.

LSTM (долгая-краткосрочная память)

Эта модель дала точность около 71,94%. Я использовал две другие модели: CNN (запутанная нейронная сеть) и CNN + GRU. Точность составила 80,17% и 78,21%.

Для дальнейшего тестирования моделей были приняты во внимание новые данные.

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

Эти данные дополнительно обрабатываются (токенизация и заполнение последовательностей) для прогнозирования с использованием различных моделей RNN.

  1. LSTM

2. CNN

3. CNN + ГРУ

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

Полный код этого сообщения можно найти на Github (https://github.com/joseph10081987/Machine-Learning_new/blob/master/Movie%20Review_DL.ipynb).

Я с нетерпением жду любых отзывов или комментариев.