СТАТЬЯ

Классификация настроений с использованием большого набора данных обзора фильмов, часть 1

Из Машинное обучение с TensorFlow, второе издание Криса Маттманна.

В этой статье рассматривается использование частотности текста и слов (мешок слов) для выражения настроения.

Получите скидку 40% на Машинное обучение с TensorFlow, второе издание, введя fccmattmann в поле кода скидки при оформлении заказа на manning.com.

Одно из волшебных применений машинного обучения, которое сегодня впечатляет всех, - это научить компьютер учиться на тексте. Благодаря социальным сетям, текстовым SMS, мессенджерам Facebook, WhatsApp, Twitter и другим источникам, генерирующим сотни миллиардов текстовых сообщений в день, нет недостатка в тексте, на котором можно учиться.

ПОСМОТРЕТЬ СЕБЯ: ознакомьтесь с этой знаменитой инфографикой, демонстрирующей обилие текстовых данных, поступающих каждый день с различных медиа-платформ: https://www.textrequest.com/blog/how-many-texts-people-send-per -день / .

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

После просмотра фильма вы когда-нибудь находили время, чтобы сказать простое: «Вау, это был отличный фильм! Мне очень понравилось выступление Билла! " или: «Этот фильм был в высшей степени неуместным, длился более трех часов, и поэтому после первого отвращения от крови я заснул, потому что не было сюжета!» (Хорошо, по общему признанию, я возможно написал этот последний комментарий на какой-то онлайн-платформе.) YouTube известен тем, что другие пользователи приходят не только для просмотра видео и вирусного контента, но и для участия в акте чтение комментариев или просмотр письменных обзоров контента для фильмов, видео и других цифровых носителей. Эти обзоры просты в том смысле, что вы можете бросить и забыть пару коротких предложений, выразить свои чувства и продолжить свою жизнь. Иногда эти комментарии веселые, иногда злые, иногда чрезвычайно позитивные и, в конечном итоге, охватывают весь спектр эмоций, которые могут возникнуть у онлайн-участников при просмотре контента.

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

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

  • логистическая регрессия для бинарного настроения
  • softmax регрессия для мультиклассов

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

Модель "Мешок слов"

Модель Bag of Words - это метод обработки естественного языка (NLP), который принимает в качестве входных данных текст в форме предложения и превращает его в вектор признаков, учитывая извлеченные словарные слова и частоту их появления. Названная так, потому что подсчет частоты каждого слова подобен «сумке», где каждое вхождение слова в качестве элемента в этой сумке, модель «Сумка слов» представляет собой современный метод проведения, например, обзора фильма и преобразовать его в вектор характеристик, который вам понадобится, чтобы классифицировать его тональность. Рассмотрим следующий отрывок из отзыва о недавнем фильме Майкла Джексона:

With all this stuff going down at the moment with MJ i've started listening to his music, watching the odd documentary here and there, watched The Wiz and watched Moonwalker again.

Первым шагом в применении модели «Сумка слов» к обработке этого обзора является предварительная обработка текста и извлечение только тех слов, которые имеют значение. Обычно это означает, что вы удаляете любые небуквенные символы, такие как числа или дополнительные аннотации, включая HTML-теги или апострофы, и обычно сокращаете текст до его слов. После этого подход сокращает оставшиеся слова в подмножестве до тех, которые являются существительными, глаголами или прилагательными, и удаляет артикли, союзы и другие стоп-слова или слова, которые не являются отличительными чертами сам текст.

ПРИМЕЧАНИЕ. Вы можете найти множество стандартных списков стоп-слов, например, те, которые используются Python's Natural Language Toolkit (NLTK), являются хорошей отправной точкой: https://gist.github.com/sebleier/554280. Стоп-слова обычно зависят от языка, и вы хотите убедиться, что какой бы список вы ни использовали, он подходит для обрабатываемого языка. К счастью для вас, NLTK в настоящее время обрабатывает стоп-слова из двадцати одного языка, и вы можете узнать больше об этом на странице «https://stackoverflow.com/questions/54573853/nltk-available-languages-for-stopwords найди.

После завершения этого шага модель Bag of Words генерирует гистограмму подсчета оставшихся слов словаря, и эта гистограмма становится отпечатком для входящего текста. Часто отпечаток пальца нормализуется путем деления количества на максимальное количество, в результате чего получается вектор признаков со значениями от 0 до 1. Весь процесс показан на рисунке 1.

Применение модели "Сумка со словами" к обзорам фильмов

Чтобы начать работу с моделью Сумка со словами, вам понадобится текст обзора. Задача Kaggle Мешок слов встречает мешки попкорна - это превосходное, уже завершенное соревнование, в ходе которого было просмотрено 50 000 обзоров фильмов из базы данных Internet Movie DataBase (IMDB) и была произведена классификация настроений на основе этих обзоров. . Вы можете узнать больше о проблеме здесь https://www.kaggle.com/c/word2vec-nlp-tutorial/overview/part-1-for-beginners-bag-of-words. Вы будете использовать эти обзоры в этой статье, чтобы построить наши классификаторы настроений.

Для начала возьмите файл labeledTrainData.tsv с https://www.dropbox.com/s/oom8kp7c3mbvyhv/labeledTrainData.tsv?dl=0 и сохраните его на локальном диске. Вы также захотите загрузить файл testData.tsv со страницы https://www.dropbox.com/s/cjhix4njcjkehb1/testData.tsv?dl=0, который вы будете использовать позже. Файлы отформатированы как значения, разделенные табуляцией (TSV), со столбцами, соответствующими уникальному идентификатору (id), тональности (1 для положительного или 0 для отрицательного) и самого обзора в формате HTML для каждой строки.

Теперь давайте опробуем нашу модель Bag of Words и создадим функцию для создания функций ввода, готовых к машинному обучению, из входного labeledTrainData.tsv файла. Откройте новую записную книжку с именем sentiment_classifier.ipynb, а затем создайте review_to_words функцию. Первое, что делает функция, - это конвертирует HTML-обзор из IMDB в текст обзора, вызывая библиотеку Tika Python. Tika Python - это библиотека для анализа контента, основные функции которой включают идентификацию типа файла, извлечение текста и метаданных из более чем 1400 форматов и идентификацию языка.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Полное объяснение Тики - тема другой книги Мэннинга, написанной мной. Серьезно, посмотрите Tika в действии. Используйте его, чтобы взять HTML и вырезать все теги в текст с помощью интерфейса parser и его from_buffer метода. который принимает на входе строковый буфер и выводит связанный извлеченный текст из анализатора HTML.

Имея в руках извлеченный текст обзора, используйте модуль Python re (для регулярного выражения), чтобы использовать общий шаблон [^a-zA-z], что означает буквально начинать с начала строки (символ ^), а затем сканировать и идентифицировать только прописные и строчные буквы a через z и для всего остального замените значение пробелом.

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

Листинг 1. Создание функций из введенного текста отзывов

from tika import parser
 from nltk.corpus import stopwords
 import re
  
 def review_to_words( raw_review ):
     review_text = parser.from_buffer( "<html>" + raw_review + "</html>" )["content"]#A
  
     letters_only = re.sub("[^a-zA-Z]", " ", review_text) #B
     words = letters_only.lower().split()#C                            
    
     stops = set(stopwords.words("english"))#D                 
     meaningful_words = [w for w in words if not w in stops] #E
     return( " ".join( meaningful_words ))#F

#A Функция преобразования необработанного отзыва в строку слов с помощью Apache Tika

#B Удаляет небуквенные символы

#C Преобразовать в нижний регистр, разбить на отдельные слова

#D Преобразование стоп-слов в набор, который намного быстрее, чем список поиска

#E Удалить стоп-слова

#F Объедините слова обратно в одну строку, разделенную пробелом

Вооружившись нашей функцией генерации чистого текста обзора, вы можете запустить эту функцию для 25 000 отзывов в labeledTrainData.tsv.. Но сначала вам нужно загрузить эти обзоры в Python.

Очистка всех обзоров фильмов

Удобной библиотекой для использования TSV и эффективной загрузки его в Python является библиотека Pandas для создания, управления и сохранения фреймов данных. Вы можете думать о фрейме данных как о таблице, готовой к машинному обучению. Каждый столбец в таблице - это одна из функций, которые вы можете использовать в машинном обучении, а строки - это ввод для обучения или тестирования. Pandas предоставляет функции для добавления и удаления столбцов функций, а также для увеличения и замены значений строк сложными способами. Панды являются предметом многих книг (нет, я не писал их, это писали другие авторы!), И Google предоставляет десятки тысяч обращений по этой теме, но для ваших целей здесь вы можете использовать Pandas для создания данных, готовых к машинному обучению. кадр из входного файла TSV. Затем Pandas может помочь проверить количество функций, строк и столбцов во входных данных.

С этим фреймом данных вы запускаете свой код очистки текста обзора для создания чистых обзоров, которые применяются к модели Bag of Words. Сначала вызовите функцию Pandas read_csv и сообщите ей, что вы читаете файл TSV без строки заголовка, с символом табуляции (\ t) в качестве разделителя, и вы не хотите, чтобы он заключал в кавычки значения функций. После загрузки данных поезда распечатайте его форму и значения столбцов, демонстрируя простоту использования Pandas для проверки фрейма данных.

Поскольку очистка 25 000 обзоров фильмов может занять время, используйте вспомогательную библиотеку Python TQDM, чтобы отслеживать свой прогресс. TQDM - это расширяемая библиотека индикаторов выполнения, которая выводит статус либо в командную строку, либо в записную книжку Jupyter. Вы завершаете свой шаг итерации - функцию range в листинге 2 - как объект tqdm, а затем каждый шаг итерации заставляет пользователя видеть приращение индикатора выполнения либо через командную строку, либо в записной книжке. TQDM - отличный способ запустить и забыть долгую операцию машинного обучения и при этом знать, что что-то происходит, когда вы вернетесь и проверите это.

В листинге 2 печатается обучающая фигура (25000, 3), соответствующая 25 000 обзоров и 3 столбцам (идентификатор, тональность и отзыв), и выходные данные array(['id', 'sentiment', 'review'], dtype=object), соответствующие значениям этих столбцов. Добавьте код из листинга 2 в свою sentiment_classifier.ipynb записную книжку, чтобы создать 25 000 чистых текстовых обзоров и отслеживать прогресс.

Листинг 2. Используйте Pandas для чтения обзоров фильмов и примените функцию очистки

import pandas as pd
 from tqdm import tqdm_notebook as tqdm
  
 train = pd.read_csv("labeledTrainData.tsv", header=0,
                     delimiter="\t", quoting=3) #A
 print(train.shape) #B
 print(train.columns.values) #B
  
 num_reviews = train["review"].size #C
 clean_train_reviews = [] #D
  
 for i in tqdm(range( 0, num_reviews )): #E
     clean_train_reviews.append( review_to_words( train["review"][i] ) )

#A Прочтите 25 000 отзывов из входного файла TSV

#B Печатает форму обучающих данных и количество значений

#C Получите количество отзывов в зависимости от размера столбца фрейма данных

#D Инициализировать пустой список для хранения чистых обзоров

#E Просматривайте каждый отзыв и очищайте его с помощью своей функции

Теперь, когда обзоры чистые, пора применить модель Сумка слов. Библиотека Python SK-learn (http://scikit-learn.org/) - это расширяемая библиотека машинного обучения, которая предоставляет множество дополнительных функций для TensorFlow. Несмотря на то, что некоторые функции частично совпадают, я часто использую функции очистки данных SK-learn. Необязательно быть пуристом, и я рекомендую это. Например, SK-learn поставляется с фантастической реализацией пакета слов под названием CountVectorizer,, который вы будете использовать в листинге 3 для применения модели пакета слов.

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

Следует отметить параметр max_features, который контролирует размер изученного словаря из текста. Выбор размера в пять тысяч гарантирует, что модель TensorFlow, которую мы создаем, будет иметь достаточную насыщенность и что полученные отпечатки «Bag of Words» для каждого обзора можно будет изучить, не увеличивая объем оперативной памяти на вашем компьютере. Очевидно, это пример настройки параметров, с которой вы можете позже поиграться, учитывая более крупные машины и больше времени. Общее практическое правило состоит в том, что словарный запас порядка тысяч должен обеспечивать достаточную усваиваемость для английских фильмов, но для новостей, научной литературы и других областей вам может потребоваться поэкспериментировать, чтобы найти оптимальное значение.

Позвоните по телефону fit_transform, чтобы предоставить чистые обзоры, которые вы создали в листинге 2, и получить обратно векторизованный Мешок слов, по одной строке на обзор с содержанием строки, являющимся счетчиком на словарное слово в обзоре. Затем преобразуйте вектор в массив NumPy, распечатайте его форму и убедитесь, что вы видите (25000,5000), соответствующий 25000 входным строкам с 5000 функциями в каждой строке. Добавьте код из листинга 3 в свой блокнот.

Листинг 3. Примените модель Bag of Words для получения данных для обучения

from sklearn.feature_extraction.text import CountVectorizer #A
 vectorizer = CountVectorizer(analyzer = "word",   \ #A
                              tokenizer = None,    \
                              preprocessor = None, \
                              stop_words = None,   \
                              max_features = 5000)
  
 train_data_features = vectorizer.fit_transform(clean_train_reviews) #B
 train_data_features = train_data_features.toarray() #C
 print(train_data_features.shape) #D

#A импортирует CountVectorizer и создает экземпляр модели Bag of Words

#B Подходит к модели, изучает словарный запас и преобразует данные обучения в векторы

#C Преобразует результаты в массив NumPy

#D Печатает полученную форму входного объекта (25000,5000)

Исследовательский анализ данных о вашем мешке слов

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

Самое замечательное в SK-learn и CountVectorizer заключается в том, что он не только предоставляет однострочный или двухстрочный вызов API для создания вывода Bag of Words, но и позволяет легко проверить результат. Например, вы можете получить выученные словарные слова и распечатать их, подсчитать их размер с помощью быстрого метода суммирования NumPy для сортировки по словам, а затем взглянуть на первые сто слов и их суммы во всех обзорах. Код для этого находится в листинге 4.

Листинг 4. Исследовательский анализ данных о возвращенном «Мешке слов»

vocab = vectorizer.get_feature_names() #A
 print("size %d %s " % (len(vocab), vocab)) #A
  
 dist = np.sum(train_data_features, axis=0) #B
  
 for tag, count in zip(vocab, dist): #C
     print("%d, %s" % (count, tag))  #C
  
 plt.scatter(vocab[0:99], dist[0:99]) #D
 plt.xticks(vocab[0:99], rotation='vertical') #D
 plt.show()

#A Получает выученный словарный запас и распечатывает его размер и выученные слова

#B Суммирует количество каждого словарного слова.

#C Для каждого выведите словарное слово и количество раз, которое оно встречается в обучающем наборе.

#D Постройте количество слов для первых 100 слов

Выходной набор напечатанных слов показан на рисунке 2 для первых ста слов для всех 25 000 обзоров. Я мог произвольно выбрать любой случайный набор из ста слов из словаря, но для простоты использовал первую сотню. Даже в первых ста словах есть статистическая значимость при подсчете этих слов в обзорах, потому что подсчеты неодинаковы и им не хватает единообразия. Некоторые слова используются чаще, чем другие, и есть некоторые очевидные выбросы, из-за чего создается впечатление, что классификатор должен учиться.

Во части 2 мы приступим к построению нашего классификатора логистической регрессии. Быть в курсе!

Это все для этой статьи.

Если вы хотите узнать больше о книге, вы можете предварительно просмотреть ее содержимое на нашей браузерной платформе liveBook здесь.