Введение в данные

В последнем проекте моего класса НЛП я выбрал набор данных текстовых обзоров видеоигр Amazon в сочетании с их звездными рейтингами. Я заядлый игрок на ПК, и сейчас вы можете поймать меня за игрой в симуляторы гонок. Я хотел изучить язык, используемый для оценки видеоигр из обзоров Amazon. Этот набор данных включал физические игры, консоли и игровые периферийные устройства. Цель проекта — классифицировать текстовый обзор, чтобы он соответствовал соответствующему звездному рейтингу. Мы надеемся, что это означает, что мы сможем точно классифицировать хорошо принятую игру и понять, почему, взглянув на язык, используемый для описания продуктов.

Проблемы

Этот набор данных поставил несколько задач. Меня больше всего беспокоило качество данных, объем (~ 1,5 ГБ) и то, как обрабатывать разделы с отсутствующими данными. Набор данных включал вещи, которые были условно классифицированы как продукты, связанные с играми. Он также включал проблемные точки данных с отсутствующими данными, обзоры без текста и заголовки, вероятно, из-за аномалий очистки.

К счастью, начиная с вопросов качества данных, в этом размеченном наборе данных есть столбец для основной категории каждого продукта. В этом случае что-то, относящееся к категории «Игрушки и игры», может быть настольной игрой, которая в конечном итоге будет свободно помечена ярлыками видеоигр. Другой пример — рулевое колесо с надписью «Toyota MR2 NRG 350MM Steering Wheel 90–93 + Hub + Quick». Вероятно, он закончился преждевременно для быстрого выпуска.

Это Toyota SW20 MR2 90–93 годов.

А это гоночный симулятор.

Близко, но не совсем то же самое. Убери их!

Далее, в некоторых строках не было текста или оценок для анализа и меток соответственно. Еще один легкий кандидат на удаление.

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

ЭДА

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

Рисунок 1: Гистограмма количества слов

На рисунке 1 показано, что подавляющее большинство обзоров содержат от 0 до 50 слов. Функция описания панд показывает, что в самом длинном и страстном обзоре было 32 721 слово. Для анализа текста это сразу же подсказывает мне, что очень короткие обзоры и очень длинные обзоры могут быть не такими уж полезными.

Рисунок 2: Частота оценок

К моему удивлению (но не совсем), почти 70% отзывов попали в категории 4 или 5 звезд. Это будет проблематично, потому что любая модель может достичь 50-процентной точности, просто прогнозируя 5-звездочный рейтинг для каждого отзыва, и это все же лучше, чем случайное предположение (20-процентная точность).

Рисунок 3: Пример классификации с основной категорией «Программное обеспечение».

Как упоминалось в моем разделе о проблемах, некоторые продукты не были точно классифицированы, и на рисунке 3 показан пример этого. Это действительно в некотором смысле видеоигры, но они представляют собой очень широкую категорию, которая также является программным обеспечением. Ниже по списку, не показанной на рисунке, более проблематичной была запись «Adobe Photodeluxe 2.0», которая, безусловно, не является игрой. Если не считать ручного просмотра 2,5 миллионов записей, в моем окончательном наборе данных будет некоторый шум.

В конце концов, я отфильтровал отзывы, содержащие менее 100 слов, и оставил все длинные отзывы. Я думал, что стоп-слова и определение корней удалят нерелевантный материал. Я также решил удалить строки без оценок (без меток) и строки без текста, чтобы общее количество отзывов составило 1,64 миллиона строк.

Встраивание

Сначала я проанализировал текстовые данные, удалив все знаки препинания, слова, содержащие менее двух букв и слова, содержащие более 21 буквы. Это произвольный способ сохранить слова, которые широко известны большинству людей, чтобы иметь более легкую основу для встраивания, чтобы быть ближе друг к другу. Затем я удалил общие стоп-слова с помощью английских стоп-слов NLTK. Затем я удалил все заглавные буквы в каждой лексеме слова, чтобы еще больше упростить анализ. Наконец, я решил включить стеммер через пакет PorterStemmer. Эти изменения в основном рассматривались для скорости обработки в то время и первой попытки прототипирования текстовых моделей.

Я пробовал TF-IDF и GloVe Embeddings с размерами 100 и 200 для своего использования. Я решил снова отказаться от BERT, Word2Vec и fastText в интересах экономии времени. Раньше я использовал GloVe, поэтому у меня был готовый код для переноса в этой ситуации. Оглядываясь назад, я должен был использовать Word2Vec по умолчанию, потому что я использовал монограммы, а не биграммы.

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

Выбором по умолчанию для текстового моделирования в то время были рекуррентные нейронные сети. Вложения TF-IDF впервые использовались для проверки того, может ли более простой подход работать лучше. Затем я выбрал встраивание GloVe как более сложный вариант встраивания. В обоих подходах использовались 100- и 200-мерные вложения.

Изначально я планировал начать процесс моделирования с самых простых и быстрых подходов, случайных лесов, а затем перейти к более сложным, более медленным подходам, нейронным сетям, если это необходимо. Я экспериментировал со всеми четырьмя комбинациями встраивания, введенными в модели случайного леса по умолчанию, 1-2-слойные плотные нейронные сети, 1-2-слойные рекуррентные нейронные сети и 2-слойную одномерную сверточную нейронную сеть.

Оценка модели

Для оценки я решил использовать оценку F1, а не просто точность или просто точность или отзыв. Как отмечалось ранее, точность могла бы быть довольно высокой, если бы модель просто правильно выдавала 4 и 5, а остальные угадывались случайным образом. Это может привести к точности ~ 75% при расчете обратной стороны конверта: 50 (5 звезд) + 20 (4 звезды) + 0,33 * 30 (1, 2 или 3 звезды). Оптимизация для точности и игнорирование ложноотрицательных результатов в этом контексте является упущением, поскольку большинство прогнозов могут легко оказаться за пределами истинных положительных и ложных положительных результатов. Оптимизация для отзыва также не обязательно желательна, потому что предсказание 4, которое на самом деле было 5, не так уж и далеко. В итоге вы все равно получите положительный отзыв. Итак, на мой взгляд, здесь желателен баланс между точностью и отзывом.

Результаты экспериментов

Я решил отказаться от настройки моделей случайного леса, потому что они сильно перекрывают тренировочные данные и дают очень плохие результаты теста F1 около 0,04. Следующими были плотные нейронные сети, которые все еще превосходили мои тренировочные данные, но улучшили результаты теста F1 примерно до 0,330. Плотные нейронные сети с 1–2 слоями сообщили об аналогичном тесте с использованием вложений TF-IDF и GloVe, но не переобучались с использованием вложений TF-IDF.

В следующем наборе экспериментов LSTM использовались обычные LSTM и двунаправленные рекуррентные нейтральные сети LSTM. Эти модели нормализовались намного лучше и показали небольшое улучшение при добавлении слоев. Они превзошли свой тестовый результат F1 примерно на 0,410. В этих случаях встраивание GloVe работало намного лучше, но все же соответствовало требованиям.

Эксперимент 1D CNN обучался очень быстро и не переобучал так сильно, как RNN, но сообщил о гораздо худшем тестовом балле F1 0,278. Наконец, я попробовал одну ансамблевую модель, которая объединила мои лучшие модели LSTM, плотных NN, CNN и двунаправленных моделей LSTM, сильно взвешенных по отношению к моделям LSTM, чтобы получить немного улучшенную оценку F1 0,417.

Эти оценки F1 не велики, и я бы определенно не сказал, что эта модель готова к использованию.

Что бы я сделал по-другому

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

  1. Соедините отзывы с 1–3 звездами вместе и разделите отзывы с 4 и 5 звездами.
  2. Создавайте более равномерные выборки для каждого ярлыка, уменьшая количество отзывов с 4 и 5 звездами. Я бы предложил это, чтобы дать модели более всестороннее представление о плохих обзорах.
  3. Изучите больше данных и рассмотрите возможность отказа от плохих отзывов типа «не получил мой продукт», потому что они не виноваты в самом продукте, но обычно пишут обзоры с 1 звездой. Кроме того, в наборе данных было так много разных типов игр, что это никогда не шло хорошо.
  4. Сначала рассмотрим кластерный анализ — я считаю, что уровень абстракции в этом наборе данных на данный момент слишком широк. Объединение консолей, программного обеспечения для видеоигр и всех жанров видеоигр — это огромная оплошность с моей стороны. Разные жанры имеют разные языки сами по себе, и обзоры консолей определенно имеют другой набор языков по сравнению с обзорами игр.
  5. После кластеризации поэкспериментируйте и запустите разные модели на каждом кластере. Может иметь значение, что у разных жанров есть свой собственный язык, и более детальная модель может быть лучше, даже если она обрабатывается с меньшим количеством данных.
  6. Изучите и внедрите BERT поверх GloVe. Видеоигры определенно имеют свой собственный лексикон, который может и не соответствовать тому, как пишутся новостные статьи.
  7. Повторить разбор текста — пунктуация имеет значение. Необычные слова можно было исключить, потому что они редко появляются в новостных статьях. Это еще одна причина использовать вложения, специфичные для набора данных, вместо предварительно обученного набора.

Приложение

Репозиторий GitHub: https://github.com/SpecCRA/453_final_assignment

Используемые библиотеки Python:

  • Scikit-learn
  • TensorFlow 2.0, Керас
  • НЛТК
  • регулярное выражение
  • Матплотлиб
  • ПортерСтеммер