Зачем рекомендовать?
Вы когда-нибудь посещали офлайн-магазин одежды? Замечали, как, когда вам нравится какое-то платье, продавец показывает вам полдюжины других, которые, возможно, вам больше понравятся? В глубине души, либо выбирая одежду с похожими характеристиками, либо одежду, которая понравилась предыдущим пользователям, он предлагает продукты. По большому счету, это методы контентной и совместной фильтрации соответственно.
В нашем случае система ML — это продавец. Будь то компания электронной коммерции или компания, занимающаяся потоковой передачей музыки/книг/видео, высокоточная система рекомендаций имеет первостепенное значение для достижения высоких коэффициентов конверсии (от себя лично я считаю, что Spotify создает наиболее «персонализированные» плейлисты). для тебя).
В этом проекте мы заинтересованы в создании системы рекомендаций фильмов на основе контента и развертывании ее в облаке. По сути, мы пытаемся имитировать Netflix.
Набор данных-
Набор данных был получен с https://www.kaggle.com/datasets/tmdb/tmdb-movie-metadata?select=tmdb_5000_movies.csv.
Файл csv «movies» содержит информацию исключительно о фильме — его языке, жанре, бюджете, сюжете и прочем.
Файл данных «Кредиты» содержит информацию об актерах и съемочной группе, задействованных в фильме.
Как мы увидим, оба будут жизненно важны для прогнозирования рейтингов фильма.
Ниже приведены пояснения к атрибутам в файле фильмов:
Budget — бюджет фильма в долларах США.
жанры — жанры, к которым можно отнести фильм.
главная страница — официальный сайт фильма
id — id фильма на сайте TMDB
ключевые слова — примерно самые важные слова в описании фильма
original_language — язык фильма
original_title — название, под которым на самом деле вышел фильм (возможно, на каком-то другом языке)
обзор — описание фильма
популярность — оценка текущей популярности фильма. Подробнее: https://developers.themoviedb.org/3/getting-started/popularity
production_companies — кинокомпании, занимающиеся производством
production_countries — страна, в которой был произведен фильм
release_date — дата выхода фильма (для анализа как datetime)
доход — общий доход, полученный в долларах США.
runtime — продолжительность фильма в минутах
разговорные_языки — языки, на которых говорят в фильме
статус — текущий статус фильма, независимо от того, выпущен ли он, находится в стадии постпродакшна или по слухам.
tagline — слоган фильма
title — название фильма
voice_average — средняя оценка фильма пользователями на сайте TMDB.
voice_count — количество пользователей, которые проголосовали.
Вот атрибуты файла кредитов:
movie_id — внешний ключ, ссылающийся на идентификатор таблицы фильмов
title — название фильма
состав — имена актеров вместе с сыгранным персонажем (и другие метаданные)
съемочная группа — имена других участников, задействованных в производстве (режиссеры, продюсеры, звукорежиссеры и т. д.)
Оба кадра данных объединены в столбце «заголовок».
Предварительная обработка данных-
Поскольку в объединенном фрейме данных 23 столбца, нам нужно вручную удалить некоторые функции. Ниже перечислены функции, которые мы хотели бы сохранить.
жанры — очень важно предсказать, понравится ли это пользователю
id — будет позже использоваться на сайте
ключевые слова, обзор — содержит описания фильма, которые являются важным содержанием.
title — это название фильма
актёры фильма
съемочная группа - люди, участвующие в производстве (режиссер и т. д.).
Числовые характеристики (например, дата_релиза, доход, популярность, среднее_голосование и т. д.) были удалены, поскольку они не связаны с «содержанием» фильма. Теги часто бывают странными и не предоставляют релевантной информации о содержании фильма. Удаление других функций не требует пояснений.
Примечание. Дата_релиза может быть решающим фактором при оценке содержания фильма.
После этого были проверены простое вменение отсутствующих значений (при «обзоре») и дубликаты.
Проблема с жанрами, ключевыми словами, актерским составом, колонками экипажа-
К сожалению, эти столбцы не имели названий в прямом виде, а представляли собой список словарей. Нам нужно предварительно обработать их.
def helper (lst, if_crew=False, if_top=False): ans=list() if (if_crew==True): for dic in eval(lst): if (dic['job']=='Director' or dict['job']=='Writer'): #for crew column only director, writer selected ans.append(dic['name']) return ans else: for dic in eval(lst): #eval() evaluates a string to the datatype contained inside it ans.append(dic['name']) if (if_top==False): return ans else: return ans[0:10] #in case, we need to return top 10 actors
Что касается актерского состава, мы возвращаем только 10 лучших актеров. За съемочную группу мы возвращаем только сценаристов и режиссеров. Код немного сложен, так как он пытается обрабатывать все 4 столбца одновременно.
Кроме того, обзорная колонка была разделена на список.
Удаление пробела внутри слов-
«Сэм Уортингтон» сильно отличается от «Сэма Мендеса». Однако, если мы не удалим пробел внутри строк, обе они будут содержать слово «Сэм», что приведет к ошибочным рекомендациям. Таким образом, «Сэм Уортингтон» должен быть сопоставлен с «Сэм Уортингтон».
Пробелы удаляются с помощью регулярного выражения.
Создание столбцов «теги»
Столбец тегов создается путем объединения столбцов жанров, ключевых слов, обзора, актеров и съемочной группы. Они были объединены с двукратным весом, придаваемым жанру (были опробованы другие соотношения, но больший вес для «команды» приводил к рекомендациям фильмов ТОЛЬКО режиссера запроса).
Предварительная обработка текста в тегах-
Мы создаем новый фрейм данных только со столбцами id, title и tags. Текст предварительно обрабатывается, т.е. преобразуется в нижний регистр, удаляются стоп-слова, лемматизируются, удаляются специальные символы и т. д.
Моделирование и основные функции-
Корпус векторизован с использованием векторизатора Tf-idf с максимальным числом признаков 5000. После этого создается матрица сходства с использованием косинусного сходства.
Мы также определяем функцию, в которой в качестве входных данных используется название фильма, а в качестве выходных данных возвращаются 5 наиболее похожих названий фильмов. Эта функция будет выполняться во время выполнения при развертывании модели.
Что ж, похоже, наша модель дает вполне приличные результаты :).
Поскольку я стремлюсь присоединиться к партнерской программе Medium, подписка с вашей стороны будет шагом к моей цели: https://debadri3.medium.com/
Это все с моей стороны. Модель была развернута с красивым веб-сайтом, созданным с помощью Streamlit:
https://имитация-netflix.herokuapp.com/
Заботиться!