Создание системы рекомендаций фильмов с использованием данных о фильмах!

Если вы хотите запустить код самостоятельно, мой блокнот Jupyter доступен на Kaggle!

Введение

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

Пользователям можно порекомендовать много разных вещей. Например, если вы зайдете на Amazon, вы увидите различные рекомендуемые продукты. Если вы пойдете на Netflix, вы увидите разные шоу и фильмы. Для Spotify рекомендуется разная музыка и подкасты. Список можно продолжить.

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

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

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

  • Простые рекомендации (на основе популярности или рейтинга)
  • Контентная фильтрация
  • Совместная фильтрация
  • Гибридные подходы
  • и т. д.

В этой статье мы рассмотрим контентную фильтрацию для получения рекомендаций.

Данные фильма TMBD

Набор данных, с которым мы работаем, — это TMDB 5000 Movie Dataset, который доступен на Kaggle. Он содержит 5000 фильмов с 1916 по 2017 год. Он содержит два файла:

  • tmdb_5000_credits.csv — содержит актерский состав и съемочную группу каждого фильма.
  • tmdb_5000_movies.csv — содержит характеристики и описания каждого фильма.

Простые рекомендации

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

Рекомендации с использованием рейтинга

Из наших данных у нас есть функция vote_average. Функция vote_average — это всего лишь средний рейтинг, присвоенный этому фильму. Эта функция немного обманчива. Тот факт, что фильм имеет более высокое vote_average, чем другой, не обязательно означает, что он лучше. Мы должны учитывать количество голосов, полученных фильмом. К счастью, в наших данных есть функция vote_count, которая сообщает нам количество голосов, полученных фильмом. Фильм с vote_average, равным 8, и vote_count, равным 10, не обязательно лучше, чем тот, у которого vote_average равен 7,5, но 1000. голосов.

Отсортировав наши данные по vote_average, мы получаем следующие результаты:

Эти результаты говорят о том, что вам стоит посмотреть фильмы «Stiff Upper Lips» и «Me You and Five Bucks» 🤢 (да, я уверен, что это тоже отличные фильмы). Это просто показывает, что мы не можем полагаться на vote_average, чтобы получить фильмы с самым высоким рейтингом, особенно когда упомянутые фильмы перечислены выше «Побег из Шоушенка» и «Крестный отец», которые являются одними из лучших фильмов.

Итак, как мы можем получить лучшие фильмы? Что мы можем сделать, так это использовать систему взвешенного рейтинга IMDB для нашего набора данных о фильмах. Формула взвешенного рейтинга:

где:

  • R — средний рейтинг фильма (vote_average)
  • v — количество голосов за фильм (vote_count)
  • m — минимальное количество голосов, необходимое для попадания в топ-лист
  • C — средний рейтинг голосов по всем фильмам.

Вычисляя взвешенный рейтинг и сортируя по наивысшему взвешенному рейтингу, мы получаем следующие результаты:

Эти результаты имеют гораздо больше смысла, поскольку это действительно отличные фильмы.

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

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

Контентная фильтрация

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

Рекомендации по использованию обзора фильма

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

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

TF-IDF

Мы будем использовать TF-IDF для преобразования обзоров в набор векторов, где номера векторов представляют содержимое текста. TF-IDF определяет, насколько важно слово для текстового документа (в нашем случае — обзора) в наборе документов (обзоров) в наборе данных. По сути, это весовой коэффициент для слов. TF-IDF дает оценку каждому слову, чем выше оценка, тем релевантнее оно. Это делается путем умножения двух терминов вместе: TF x IDF.

TF – частота термина. Это количество раз, которое слово встречается в документе. Например, если слово супергерой встречается 9 раз в обзоре из 100 слов, частота термина будет равна 0,09.

IDF – это обратная частота документа. Это вес слова. Если это слово часто встречается во всех обзорах в наборе данных, то оно не имеет большого веса. Ниже приведено уравнение для этого термина:

Гдеn — количество обзоров, а df — частота документов; количество обзоров, содержащих определенное слово.

После того, как мы вычислили TF-IDF для всех обзоров в наборе данных, мы получим матрицу N x M, где N — количество фильмов в нашем наборе данных, а M — количество уникальных слов, используемых для описания всех фильмов. Поэтому каждая строка представляет фильм, а столбцы — отдельные слова. Каждый фильм представлен вектором, где значения внутри вектора являются весами слова, если оно появляется в обзоре фильма. Ниже показано, как выглядят наши обзоры фильмов после TF-IDF:

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

Косинусное сходство в обзоре TF-IDF

Косинусное сходство — это измерение, которое вычисляет, насколько два вектора похожи друг на друга. Мы будем использовать результаты TF-IDF и вычислять косинусное сходство, поскольку фильмы теперь представлены векторами.

Уравнение косинусного подобия:

Числитель — это скалярное произведение между вектором A и вектором B. Знаменатель — это величина вектора A, умноженная на величину вектора B.

Результат после вычисления косинусного сходства представляет собой матрицу N x N, где N — количество фильмов.

Мы можем взять результаты и визуализировать их в фрейме данных:

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

Рекомендации

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

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

Рекомендации по использованию функций видео

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

Предварительная обработка объектов

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

  • Фильтрация
  • Стемминг
  • Удаление пробелов
  • Нижний регистр

В итоге характеристики должны выглядеть так:

Нам нужно объединить все функции в одну последовательность текста, которую мы преобразуем в матрицу векторов. Ниже текст к фильму «Аватар»:

Следующим шагом будет преобразование этой последовательности текста в числа, на этот раз с помощью CountVectorizer.

Векторизатор счетчика

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

Из текста нашего фильма мы получаем следующие результаты после CountVectorizer:

Сходство косинусов в функциях фильмов CountVectorizer

Результат после вычисления косинусного подобия дает те же результаты, что и предыдущий рекомендатель с использованием обзора: матрица N x N, где N — количество фильмов.

Мы можем взять результаты и визуализировать их в фрейме данных:

Рекомендации

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

Мы видим, что рекомендации, сделанные на этот раз, не все фильмы «Звездных войн», и это хорошо! Фильмы «Звездные войны» прекрасны, но разве не лучше открывать для себя новые похожие фильмы? Теперь вы можете смотреть «Звездные войны», «Звездный путь» и «Звездный десант»!

Заключение

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

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

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

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

Спасибо, что нашли время прочитать мою статью! Если вам понравилось, я рекомендую поставить лайк, чтобы вам были рекомендованы статьи, похожие на эту ;)