Система рекомендаций фильмов — фильтрация на основе контента

Блог полностью посвящен системе рекомендаций фильмов на основе контента, которая развернута как веб-сайт на heroku (бесплатно).

Обзор реализации

Для работы со столбцом «key_words», который содержит все необходимые ключевые слова в .csv, мы использовали специальную библиотеку NLP, известную как RAKE (алгоритм быстрого автоматического извлечения ключевых слов). В основном это извлечение ключевых слов путем определения частоты слов и встречаемости. Следующим лучшим обучением было наличие векторных представлений с помощью инструмента count-vectorizer, предоставленного scikit-learn (библиотека ML), который преобразовывает слова в соответствующие векторные формы на основе подсчета частоты слова. Следовательно, после получения окончательной матрицы всех подсчетов слов мы применяем косинусное сходство, чтобы получить матрицу сходства. Что касается результатов, идея заключалась в том, чтобы наилучшим образом отобразить введенный пользователем заголовок, а затем предоставить некоторые другие рекомендации. Итак, я извлекаю рекомендации N+1, где 1-я рекомендация является лучшим результатом или заголовком, введенным пользователем (показывается громче), и, следовательно, предоставляю другие N оставшихся имен рекомендаций.

Найдите сайт по ссылке ниже:

https://recommendmee.herokuapp.com/.

Сбор данных

Набор данных фильмов был взят с kaggle, и его можно найти, как показано ниже:

https://www.kaggle.com/tmdb/tmdb-movie-metadata.

Набор данных состоит из двух CSV-файлов:

  1. tmdb_5000_credits.csv
  2. tmdb_5000_movies.csv

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

Я предварительно обработаю набор данных в Jupyter-Notebook.

Прочитайте оба набора данных с помощью pandas:

Объедините оба CSV-файла в столбцах id и movie_id и назовите объединенный CSV-файл как df. После слияния будет большое количество столбцов.

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

Первый столбец df dataframe

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

Теперь набор данных будет выглядеть следующим образом:

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

Во многих столбцах у меня есть элементы в виде списка. Теперь я уберу запятые в списках и удалю пробел между каждым элементом(например, преобразовать «научная фантастика» в «научная фантастика») списка, чтобы мы могли получить значимые ключевые слова, потому что в более поздние шаги Я собираюсь объединить функции для выполнения некоторых очень важных шагов, которые мы увидим позже. Я также преобразовываю тексты в нижний регистр, потому что Python чувствителен к регистру, и он будет воспринимать слова «приключение» и «приключение» по-разному.

Теперь давайте удалим запятые, пробелы и преобразуем список в строку,

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

Я собираюсь применить алгоритм RAKE к столбцам набора данных.

Объедините все столбцы, кроме original_title и movie_id, потому что в системе рекомендации фильмов на основе контента не используется movie_id и original_title, это название фильмов, которое должно быть в отдельном столбце.

Теперь я удаляю все ненужные столбцы, оставляя только столбцы original_title и Combined_Features.

И набор данных будет выглядеть следующим образом:

Поскольку пользователь может искать фильм в любом формате, например, давайте рассмотрим фильм «Бэтмен против Супермена: На заре справедливости», пользователь может искать как «Бэтмен против Супермена», «Бэтмен-супермен», «Бэтмен на заре справедливости» и т.д. Итак, я уберу все ненужные символы и объединим все слова из столбца original_title, а также из ввода пользователя.

И, наконец, преобразуйте этот формат набора данных в новый файл csv.

Вы можете найти файл jupyter-notebook, содержащий все коды, перейдя по этой ссылке https://github.com/techopus/Recommend-Me.

Здесь я завершил этапы предварительной обработки данных и создал окончательный CSV-файл для дальнейшего использования.

Создание приложения Flask

В этом файле python я буду использовать созданный ранее файл csv.

Я использую метод NearestNeighbors, чтобы найти наиболее похожие фильмы на основе ввода пользователя.

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

CountVectorizer будет подсчитывать количество слов в тексте.

CountVectorizer работает следующим образом для каждого текста.

Теперь я создам матрицу оценки сходства, которая представляет собой квадратную матрицу и содержит значения от 0 до 1, потому что здесь я использую косинусное сходство, а значение cos лежит между 1 и 0.

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

Теперь я буду получать информацию от пользователя, используя HTML-страницу, которую я создал, ссылка на весь код (html, css и т. д.) приведена в конце блога.

Я уберу все нежелательные символы из пользовательского ввода.

Если заголовок, такой же, как и введенный пользователем, присутствует в столбце «title» набора данных, тогда найдите индекс по выбору пользователя, и с помощью этого индекса мы можем найти индексы и расстояния связанных фильмов, используя Ближайшие соседи.kneighbors().

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

Код flask в файле python выглядит следующим образом:

Здесь main_page.html — это веб-страница, на которой пользователь вводит название фильма. movie_list.html — это веб-страница, на которой отображается список рекомендуемых фильмов.

Чтобы развернуть модель на Heroku, нам нужны еще два файла:

  1. Procfile
  2. требования.txt
  3. runtime.txt (это может потребоваться или не потребоваться — мне пришлось создать этот файл, чтобы явно предоставить версию Python для чтения для heroku)

Flask ищет файлы HTML в папке «templates» и файлы CSS в папке «static/styles», поэтому никогда не забывайте размещать файлы в правильном месте, иначе они не будут работа.

Загрузите все файлы и папки на github.

Откройте Heroku и создайте учетную запись или войдите в систему.

Нажмите «Новое/Создать новое приложение».

Введите имя приложения и нажмите «Создать приложение».

Нажмите GitHub и выполните поиск в репозитории.

Нажмите Подключить.

Затем нажмите «Развернуть ветку».

Если все пойдет хорошо, он начнет устанавливать пакеты, перечисленные в файле requirements.txt, и в конце выдаст URL-адрес, заканчивающийся на herokuapp.com .

Заключение

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

Вы можете связаться со мной с любыми вопросами по этому поводу в моей почте gmail: [email protected], и я с удовольствием на них отвечу. Спасибо ;)