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

Мы используем записную книжку Jupyter Python 3 в качестве среды совместного программирования для этого проекта, а также другие фрагменты кода для разработки и развертывания веб-приложений. Весь код этой серии доступен в этом репозитории GitHub.

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

Алгоритмы рекомендаций фильмов

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

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

  1. Простой рекомендатель: этот подход ранжирует все фильмы по определенным критериям: популярность, награды и / или жанр, а затем предлагает пользователям лучшие фильмы без учета их индивидуальных предпочтений. Примером может служить «Топ 10 в США сегодня» от Netflix.
  2. Рекомендация по совместной фильтрации: этот подход использует прошлое поведение пользователя для прогнозирования элементов, которые могут заинтересовать пользователей. Он учитывает ранее просмотренные пользователем фильмы, числовые рейтинги, присвоенные этим элементам, и ранее просмотренные фильмы аналогичными пользователей.
  3. Рекомендуемая фильтрация на основе содержимого: этот подход использует свойства и метаданные определенного элемента, чтобы предлагать другие элементы с аналогичными характеристиками. Например, рекомендатель может проанализировать жанр и режиссера фильма, чтобы порекомендовать дополнительные фильмы с аналогичными свойствами.

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

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

Сбор и очистка данных

Мы обучаем наш алгоритм рекомендаций чат-ботов на фильмах, выпущенных не ранее июля 2017 года и размещенных на Kaggle. Набор данных содержит метаданные для более чем 45 000 фильмов, перечисленных в полном наборе данных MovieLens. Точки данных включают состав участников, команду, сюжет, языки, жанры, подсчет голосов TMDB, средние значения голосов и другие детали.

В наших проектах используются следующие файлы:

movies_metadata.csv: основной файл метаданных фильмов. Содержит информацию о 45 000 фильмов, представленных в наборе данных Full MovieLens.

keywords.csv: содержит ключевые слова сюжета для наших фильмов MovieLens. Доступен в виде строкового объекта JSON.

credits.csv: содержит информацию об актерах и съемщиках всех наших фильмов. Доступен в виде строкового объекта JSON.

rating_small.csv: набор из 100 000 оценок от 700 пользователей к 9 000 фильмам. Рейтинги выставляются по шкале от 1 до 5 и получены с официального сайта GroupLens.

Мы начинаем с загрузки данных с веб-сайта Kaggle и сохранения их на Google Диске. Чтобы загрузить данные в ноутбук, мы монтируем Google Диск и используем функцию pd.read_csv для импорта и загрузки данных.

Затем мы изучили форму и имя столбцов каждого CSV-файла, чтобы лучше понять данные:

  • movies_metadata.csv имеет форму (45466 строк, 24 столбца) и столбцов как ['для взрослых', 'own_to_collection', 'budget', 'genres', 'homepage', 'id', ' imdb_id ',' original_language ',' original_title ',' overview ',' популярность ',' poster_path ',' production_companies ',' production_countries ',' release_date ',' доход ',' время выполнения ',' разговорные_языки ',' статус ' , 'tagline', 'title', 'video', 'vote_average', 'vote_count']
  • rating.csv имеет форму (26024289 строк, 4 столбца), а столбцы - [‘userId’, ‘movieId’, ‘rating’, ‘timestamp’].
  • credits.csv имеет форму (45476 строк, 3 столбца), а столбцы - [‘cast’, ‘team’, ‘id’].
  • keywords.cvs имеет форму (46419 строк, 2 столбца), а столбцы - ["id", "keywords"].

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

Рекомендации по фильтрации на основе содержания

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

Выбор правильных функций

Мы объединяем все важные функции в одном фрейме данных. Мы используем astype (‘init’), чтобы изменить тип данных идентификатора фильмов на целое число, а затем использовать его в качестве ссылочного ключа для объединения фреймов данных «кредитов» и «ключевых слов» в фрейме данных «метаданные». В результате «метаданные» df имеют форму 27 столбцов.

Итак, давайте посмотрим на важные особенности метаданных:

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

Перед этим нам нужно изменить типы данных из «строковых» списков на их исходные типы данных Python, чтобы избежать ошибок с нашими функциями.

Функция get_director (x) извлекает имя директора и возвращает NaN, если оно не найдено. Функция get_lists (x) возвращает три верхних элемента из каждой функции.

Применяя эти две функции к нашим функциям, мы извлекаем и работаем только с соответствующими данными в нашей системе рекомендаций:

Создание супа из слов

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

Наша цель состоит в том, чтобы, в конечном итоге, иметь одно большое словосочетание для каждого фильма, чтобы мы могли векторизовать эти супы, а затем вычислить косинусное сходство. Мы начинаем с преобразования всех слов в нижний регистр и удаления всех пробелов между ними. Удаление пробелов между словами помогает модели различать повторяющиеся имена. Мы хотим, чтобы имена были объединены без пробела, чтобы при векторизации мы не сохраняли «Роберт» в «Роберте Де Ниро» с той же переменной, что и «Роберт» в «Роберте Дауни-младший», потому что было бы произвольно утверждать, что эти актеры похожи только по имени. Когда мы сохраняем имена как «robertdeniro» и «robertdowneyjunior» вместо этого, мы проводим различие между актерами, создавая отдельные векторизации.

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

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

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

Теперь, когда у нас есть чистые функции, давайте научим нашу модель их читать.

Как упоминалось выше, наша модель рекомендаций принимает в качестве входных данных как предварительно обработанные функции фильма, так и предпочтения пользователя. Затем он обрабатывает вводимые пользователем данные и добавляет их в виде строки в метаданные. Затем модель векторизует слово суп с помощью функции CountVectorizer из библиотеки Python scikit-learn. CountVectorizer принимает документы (разные строки) и возвращает токенизированную матрицу. Каждое слово суп закодировано в частотах слов в этом слове суп. Например, следующие предложения, хранящиеся в списке:

корпус = [

«Это первый документ»,

«Этот документ - второй документ»,

«А это третий.»,

«Это первый документ?»]

Если мы применим к ним CountVectorizer, мы получим следующую таблицу:

В таблице отражена частота встречаемости каждого слова в предложении. Допустим, Word2 - это слово «документ», поэтому слово 2 встречается один раз в первом предложении и два раза во втором предложении.

Мы векторизуем вводимые пользователем данные, добавляя введенное слово «суп» в таблицу метаданных в качестве последней записи, а затем запускаем процесс векторизации для всех данных. Хотя это не самый эффективный способ решения этой проблемы, функция CountVectorize запускается очень быстро и требует мало ресурсов. Более серьезная проблема, с которой нам приходится сталкиваться, - это вычисление косинусного подобия.

Косинусное сходство

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

Косинусное сходство - это математическое вычисление, которое говорит нам о сходстве между двумя векторами A и B. По сути, мы вычисляем косинус угла theta между этими двумя векторами. Функция возвращает значение от -1, указывающее полные противоположные векторы, до 1, указывающее тот же вектор. 0 указывает на отсутствие корреляции между векторами, а промежуточные значения указывают на промежуточные уровни сходства. К счастью, нам не нужно писать новую функцию для вычисления уравнения, поскольку в scikit-learn уже есть встроенная функция под названием cosine_similarities (). Формула, которую мы используем для вычисления косинусного сходства, следующая:

Сложность функции косинусного сходства увеличивается линейно по мере увеличения размера A и B (обратите внимание, что A и B имеют одинаковый размер, n). Для скалярного произведения A и B потребуется n + t дополнительных вычислений, если мы добавим t дополнительных значений к A и B, и величина каждого из них также будет линейно увеличиваться. . Пока никаких проблем с вычислительной сложностью.

Однако наш алгоритм выполняет вычисление косинусного сходства между каждой возможной парой фильмов. Если у нас есть k фильмов, то нам нужно выполнить k² вычислений. Это причина, по которой нам пришлось уменьшить количество фильмов в нашем наборе данных с 45 000 до 10 000, поскольку разница в 35 000 фильмов переводится в 1,925 * 10⁹ вычислений.

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

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

Давайте попробуем нашу рекомендацию:

Вывод

В этой части серии мы обсудили различные типы алгоритмов рекомендаций и выбрали подход контентной фильтрации в качестве основного алгоритма для чат-бота. Мы подробно объяснили механизм построения модели рекомендаций с использованием векторизатора подсчета и оценок косинусного сходства.

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

Ресурсы

(Учебник) Рекомендательные системы на Python. (нет данных). Получено 6 декабря 2020 г. с сайта https://www.datacamp.com/community/tutorials/recommender-systems-python.

Рекомендательная система. (2020, 29 ноября). Получено 6 декабря 2020 г. с сайта https://en.wikipedia.org/wiki/Recommender_system.