Лучшие буррито Yelp

Классификация и анализ настроений — Часть 1

Это проект из трех частей, работающий с открытым набором данных Yelp, универсальным набором данных для обучения. В этой части 1 мы загрузим несколько больших файлов JSON, отфильтруем их, чтобы уменьшить их размер, подмножество данных отзывов и поговорим о токенизации! Часть 2 здесь. Часть 3 здесь. Если вас заинтересовал код, вы можете найти его здесь.

Данные

Yelp поддерживает и распространяет массивный открытый набор данных для обучения, особенно для задач НЛП. Этот набор данных содержит всевозможную информацию, включая данные регистрации, фотографии и бизнес-атрибуты. Однако больше всего нас здесь интересует сбор отзывов. Этот набор данных состоит из нескольких файлов JSON с различной информацией и содержит 7 миллионов отзывов почти для 300 000 компаний. Вау!

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

Чтобы получить это подмножество отзывов, требуется немного поработать над предварительной обработкой. Файл JSON, содержащий все 7 миллионов отзывов, не содержит никакой информации о названии или категории компании, только уникальный идентификатор компании. Чтобы получить список бизнес-идентификаторов, связанных с мексиканскими и техасско-мексиканскими ресторанами, нам нужно обратиться к файлу JSON, который содержит всю информацию о бизнес-атрибутах. Загрузка этого файла JSON прямо в кадр данных pandas позволит нам фильтровать по бизнес-категории. Здесь, что неудивительно, «мексиканский» и «тех-мекс». Это даст нам список чуть более 4000 предприятий, теперь это все рестораны. Достаточно просто и хорошо сокращено с 300 000 предприятий, с которых мы начинали. Перейдите к файлу JSON, содержащему эти 7 миллионов отзывов.

Огромный размер этого файла требует другой стратегии, чем работа с бизнес-атрибутами. Попытка загрузить все 7 миллионов файлов непосредственно в фрейм данных или даже список словарей приведет к ошибке памяти (по крайней мере, с моими 8 ГБ оперативной памяти). Альтернативная стратегия состоит в том, чтобы открыть файл, прочитать объект за объектом и проверить, соответствует ли текущий объект в памяти определенным критериям. В этом случае критерием является сопоставление бизнес-идентификаторов со списком, созданным выше. Если есть совпадение, мы добавим объект JSON (словарь) в список. Затем этот список словарей можно отправить в фрейм данных. Это медленный процесс, но я не уверен, что есть лучшее решение для работы с большими файлами (дайте мне знать в комментариях, если вы думаете иначе)! Несмотря на это, в конце обработки у нас остается фрейм данных, содержащий все отзывы обо всех мексиканских и техасско-мексиканских ресторанах в открытом наборе данных Yelp.

Последним шагом в этом процессе является выделение набора обзоров для проведения анализа тональности в части 3 этого проекта. Поскольку мы заинтересованы в использовании анализа настроений для выявления недооцененных буррито (подробнее об этом позже), мы вытащим все обзоры, в которых конкретно упоминается какая-либо форма слова «буррито». Это тривиально, если использовать векторизованные строковые функции pandas. Конечным результатом всех этих манипуляций являются два датафрейма, содержащие уникальные наборы отзывов. Есть 51 764 отзыва, в которых упоминаются буррито, и еще 328 932 отзыва о мексиканских и техасско-мексиканских ресторанах. По-прежнему большой набор обзоров, но гораздо более управляемый, чем первоначальные 7 миллионов.

Визуальные исследования

Целью этой части проекта является создание классификатора, который правильно предсказывает заданный звездный рейтинг Yelp на основе текста этого обзора. Чтобы лучше понять, с чем мы работаем, давайте посмотрим на некоторые цифры, которые помогают описать данные. Сначала мы проверим количество отзывов по звездному рейтингу, чтобы убедиться, что у нас одинаковое распределение (рис. 1). Как мы видим ниже, количество 5-звездочных отзывов затмевает остальные звездные рейтинги. Это может означать, что этот набор данных выиграет от недостаточной выборки большинства классов. Пока мы просто будем иметь в виду эту информацию.

Еще одна связь, которая может нас заинтересовать, — это связь между длиной текста и звездным рейтингом. Как предположили Остин Маккартни и Ко, производительность классификаторов снижается с уменьшением длины текста. Глядя на те же 5 бинов, что и выше, мы видим, что длина текста варьируется в зависимости от рейтинга, но не слишком сильно (рис. 2). В любом случае, это будет трудно попытаться изменить. Идем дальше.

Теперь, когда у нас есть некоторое представление о том, как распределяются длина отзыва и количество звезд, давайте теперь посмотрим на рестораны, которые составляют эти почти 330 000 отзывов. Ниже приведен список 15 лучших ресторанов, получивших отзывы. Для наших целей здесь все обзоры отдельных сетей складываются вместе (рис. 3). Как и предполагалось, сетевые рестораны составляют большую часть топ-15, но не до такой степени, чтобы это могло стать проблемой. Из всех обзоров в наборе только около 2% относятся к Chipotle.

Приведенный выше список интересен еще и тем, что он, похоже, ориентирован на рестораны американского Запада. В частности, я знаю, что «Barrio Queen» — уважаемый ресторан традиционной мексиканской кухни в Аризоне, «Tacos el Gordo» — уважаемая столица Калифорнии, а «Nacho Daddy» — чемпион по начос из Невады. Раньше мы могли предположить, что этот набор данных от Yelp включает большую часть страны, но нам лучше более внимательно изучить распределение городов и штатов, чтобы увидеть, с чем мы работаем (рис. 4, рис. 5). Как мы видим, Лас-Вегас и небольшое количество городов в Аризоне очень хорошо представлены, а количество отзывов о ресторанах в Аризоне превосходит любой другой штат. Возможно, было бы интересно собрать наши обзоры по этим местам в расширении этого проекта, но сейчас не нужно беспокоиться об этой странной выборке ресторанов.

Учитывая имеющиеся у нас данные и простую конечную цель этой первой части проекта, давайте разделим 5-звездочную рейтинговую систему на 2 категории. Это будут хорошие отзывы (5 и 4 звезды) и плохие/нейтральные (1, 2 или 3 звезды) отзывы. Это упростит классификацию. Выполнить эту манипуляцию несложно, и в итоге мы получим 115 787 плохих/нейтральных отзывов и 213 145 хороших отзывов. Этот дисбаланс, вероятно, означает, что наш классификатор будет работать лучше при классификации хороших отзывов, но это не обязательно исправлять.

Очистка текста

Первым шагом в анализе текста является очистка текста. Это может включать в себя всевозможные различные шаги, но здесь будет довольно просто. Мы будем использовать встроенные функции Natural Language Tool Kit (NLTK). Со всеми обзорами, содержащимися в кадре данных, этот процесс легко выполнить с помощью метода применения pandas. Чтобы получить представление о входе и выходе этого процесса, мы можем посмотреть на рисунок 6 ниже. Мы начинаем с исходного обзора, переключаем все прописные буквы на строчные, преобразуем текст в список строк, затем, наконец, удаляем стоп-слова (часто встречающиеся слова) и знаки препинания (обратите внимание, что восклицательные знаки и смайлик в конце обзора являются ушел).

N-грамм

Этот список слов, сгенерированный выше, можно использовать в модели машинного обучения для классификации после векторизации. Однако простое использование слов в качестве характеристик неизбежно исключает всю информацию, связанную с порядком слов. Здесь в игру вступают n-граммы. N-грамма — это непрерывная последовательность из n элементов, построенная из заданной последовательности текста. Это могут быть биграммы (2 слова), триграммы (3 слова) и т. д. Учитывая окончательный список токенов слов выше на рисунке 6, представлением биграммы будет список кортежей, воспроизведенный на рисунке 7 ниже.

Самым большим недостатком использования представления n-грамм является то, что размер учебного словаря становится огромным. Мы вернемся к этому чуть позже, но словарный запас биграмм, созданных путем векторизации обучающего корпуса, насчитывал более 3 миллионов уникальных терминов. Как и следовало ожидать, использование триграмм или квадраграмм только усугубляет эту проблему. Конечно, конечной конечной точкой будет каждое уникальное предложение, представленное в обучающем корпусе, и идеально подобранная модель. Этого не произойдет с биграммами, и мы добьемся лучшего результата классификации, чем работа с отдельными словами (поверьте мне, я проверял). Это также позволит нам выполнить шаг выбора функции. Все отлично, так что давайте погрузимся! Следуйте за мной во 2 часть здесь.