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

Мы углубимся в анализ настроений и узнаем, как использовать тематическое моделирование, чтобы разделить обзоры фильмов на разные категории. Мы собираемся работать с набором данных из 50 000 обзоров фильмов из Интернет-базы данных фильмов (IMDb).

Эта статья представляет собой отрывок из книги Себастьяна Рашки и Вахида Мирджалили Машинное обучение Python, третье издание. Эта книга представляет собой исчерпывающее руководство по машинному обучению и глубокому обучению с помощью Python. Это новое третье издание обновлено для TensorFlow 2.0, GAN, обучения с подкреплением и других популярных библиотек Python. В этой статье мы обсудим популярный метод тематического моделирования, который называется скрытым распределением Дирихле (LDA).

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

Разложение текстовых документов с помощью LDA

Поскольку математика, лежащая в основе LDA, довольно сложна и требует знаний о байесовском выводе, мы подойдем к этой теме с точки зрения практиков и интерпретируем LDA, используя термины непрофессионала. Тем не менее, заинтересованный читатель может узнать больше о LDA в следующей исследовательской статье: Latent Dirichlet Allocation, David M. Blei, Andrew Y. Ng и Michael I. Jordan, Journal of Machine Learning Research 3, страницы: 993–1022, Jan 2003 г.

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

· Матрица от документа к теме

· Матрица слов к теме

LDA разлагает матрицу мешка слов таким образом, что если мы умножим эти две матрицы вместе, мы сможем воспроизвести ввод, матрицу мешка слов, с минимально возможной ошибкой. На практике нас интересуют те темы, которые LDA нашло в матрице словарного запаса. Единственным недостатком может быть то, что мы должны заранее определить количество тем - количество тем - это гиперпараметр LDA, который нужно указывать вручную.

LDA с помощью scikit-learn

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

Сначала мы собираемся загрузить набор данных в pandas DataFrame, используя локальный файл movie_data.csv из обзоры фильмов, которые мы создали в начале этой главы:

import pandas as pd
df = pd.read_csv(‘movie_data.csv’, encoding=’utf-8')

Затем мы собираемся использовать уже знакомый CountVectorizer для создания матрицы набора слов в качестве входных данных для LDA. Для удобства мы будем использовать встроенную в scikit-learn библиотеку английских стоп-слов через stop_words = ’english’:

from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer(stop_words=’english’, max_df=.1, max_features=5000)
X = count.fit_transform(df[‘review’].values)

Обратите внимание, что мы установили максимальную частоту использования слов в документе, равную 10 процентам (max_df = .1), чтобы исключить слова, которые слишком часто встречаются в документах. Обоснование удаления часто встречающихся слов заключается в том, что это могут быть общие слова, встречающиеся во всех документах, которые, следовательно, с меньшей вероятностью связаны с определенной тематической категорией данного документа. Кроме того, мы ограничили количество учитываемых слов до 5000 наиболее часто встречающихся слов (max_features = 5000), чтобы ограничить размерность этого набора данных, чтобы улучшить выполняемый вывод. пользователя LDA. Однако и max_df = .1, и max_ features = 5000 являются значениями гиперпараметров, выбранными произвольно, и читателям рекомендуется настроить их, сравнивая результаты.

В следующем примере кода показано, как подогнать оценщик LatentDirichletAllocation к матрице набора слов и вывести 10 различных тем из документов (обратите внимание, что подгонка модели может занять до 5 минут и более на портативном или стандартном настольном компьютере):

from sklearn.decomposition import LatentDirichletAllocation
lda = LatentDirichletAllocation(n_components=10,
random_state=123, learning_method=’batch’)
X_topics = lda.fit_transform(X)

Установив learning_method = 'batch', мы позволяем оценщику lda выполнять оценку на основе всех доступных данных обучения. (матрица набора слов) за одну итерацию, что медленнее, чем альтернативный метод обучения «онлайн», но может привести к более точным результатам (настройка learning_method = 'online' аналогично онлайн или мини-пакетному обучению).

После установки LDA у нас теперь есть доступ к атрибуту components_ экземпляра lda, в котором хранится матрица содержащие важность слова (здесь 5000) для каждой из 10 тем в порядке возрастания:

lda.components_.shape
(10, 5000)

Чтобы проанализировать результаты, давайте напечатаем пять самых важных слов для каждой из 10 тем. Обратите внимание, что значения важности слов ранжируются в порядке возрастания. Таким образом, чтобы напечатать первые пять слов, нам нужно отсортировать массив тем в обратном порядке:

n_top_words = 5
feature_names = count.get_feature_names()
for topic_idx, topic in enumerate(lda.components_):
  print(“Topic %d:” % (topic_idx + 1))
  print(“ “.join([feature_names[i]
  for i in topic.argsort()
    [:-n_top_words — 1:-1]]))

Тема 1:
худшие минуты ужасный сценарий глупый
Тема 2:
семья мать отец дети девочка
Тема 3:
американская война dvd музыка тв
Тема 4:
человеческая аудитория чувство искусства кино
Тема 5:
полицейский автомобиль мертвое убийство
Тема 6:
дом ужасов секс девушка женщина
Тема 7:
ролевые выступления комедийных актеров
Тема 8:
сериал, эпизоды войны, сериалы
Тема 9:
книжная версия оригинала читать роман
Тема 10:
боевик бой парень парни крутые

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

  1. Вообще плохие фильмы (не совсем тематическая категория)
  2. Фильмы о семьях
  3. Фильмы о войне
  4. Художественные фильмы
  5. Криминальные фильмы
  6. Фильмы ужасов
  7. Комедии
  8. Фильмы, так или иначе связанные с телешоу
  9. Фильмы по книгам
  10. Боевики

Чтобы убедиться, что категории имеют смысл на основе обзоров, давайте построим три фильма из категории фильмов ужасов (фильмы ужасов относятся к категории 6 в позиции индекса 5):

horror = X_topics[:, 5].argsort()[::-1]
for iter_idx, movie_idx in enumerate(horror[:3]):
  print(‘\nHorror movie #%d:’ % (iter_idx + 1))
  print(df[‘review’][movie_idx][:300], ‘…’)

Фильм ужасов №1:
Дом Дракулы основан на той же основной предпосылке, что и Дом Франкенштейна годом ранее; а именно три самых известных монстра этого Универсального; Дракула, чудовище Франкенштейна и Человек-волк появляются в фильме вместе. Естественно, поэтому фильм довольно грязный, но то, что…

Фильм ужасов №2:
Ладно, какого хрена я сейчас смотрел? «Гора ведьм» должен быть одним из самых бессвязных и безумных испанских фильмов об эксплуатации, и в то же время он также странно убедителен. Здесь нет абсолютно ничего, что имеет смысл, и я даже сомневаюсь в этом…

Фильм ужасов №3:
‹br /› ‹br /› Время ужастиков в японском стиле. Узумаки / Спираль был настоящим праздником фриков от начала до конца. Это был забавный уродский фестиваль, но временами он был слишком зависим от китча, а не от ужасов. Сложно описать лаконично: беззаботная нормальная девочка-подросток начинает приходить…

Используя предыдущий пример кода, мы напечатали первые 300 символов из трех лучших фильмов ужасов. Обзоры - даже если мы не знаем, к какому именно фильму они принадлежат - похожи на обзоры фильмов ужасов (однако можно возразить, что фильм ужасов № 2 также может подходит для темы категории 1: в целом плохие фильмы).

Резюме

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

Об авторах

Себастьян Рашка имеет многолетний опыт программирования на Python, и он провел несколько семинаров по практическим применениям науки о данных, машинного обучения и глубокого обучения, включая учебник по машинному обучению на SciPy - ведущей конференции по научным вычислениям на Python. В настоящее время он является доцентом статистики в UW-Madison, специализируясь на исследованиях в области машинного обучения и глубокого обучения.

Его работа и вклад недавно были отмечены наградой для выдающихся аспирантов в 2016–2017 годах, а также наградой ACM Computing Reviews «Лучшее за 2016 год». В свободное время Себастьян любит участвовать в проектах с открытым исходным кодом, а реализованные им методы теперь успешно используются в соревнованиях по машинному обучению, таких как Kaggle.

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

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