На основе содержания
Система рекомендаций фильмов — один из основных и важных проектов машинного обучения. В этом блоге я покажу вам, как создать систему рекомендации фильмов на основе контента с красивым веб-сайтом и развернуть модель на Heroku.
Чтобы открыть систему рекомендаций фильмов, нажмите на ссылку:
https://nikmoviemaniac.herokuapp.com/
Сбор данных
Я использовал набор данных фильмов TMDB 5000, который можно найти на kaggle по этой ссылке:
https://www.kaggle.com/tmdb/tmdb-movie-metadata.
Этот набор данных содержит два файла csv:
- tmdb_5000_credits.csv
- tmdb_5000_movies.csv
Предварительная обработка данных
Я предварительно обработаю набор данных в Jupyter-Notebook.
Прочитайте оба набора данных с помощью pandas:
Объедините оба CSV-файла в столбцах id и movie_id и назовите объединенный CSV-файл как df. После слияния будет большое количество столбцов.
Чтобы создать рекомендательную систему на основе контента, нам не нужно много столбцов, таких как бюджет, домашняя страница, популярность, время выполнения и т. д. Итак, я уберу эти столбцы, а последние столбцы останутся с нами как:
Многие столбцы в этом наборе данных, такие как жанры, ключевые слова и т. д., имеют формат 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/NIKsaurabh/Movie-Recommendation-Web-App/blob/master/tmdb.ipynb
Здесь я завершил этапы предварительной обработки данных и создал окончательный CSV-файл для дальнейшего использования.
Создание приложения Flask
В этом файле python я буду использовать созданный ранее файл csv.
Я использую метод NearestNeighbors, чтобы найти наиболее похожие фильмы на основе ввода пользователя.
Сначала я импортирую набор данных, а после этого основной шаг, который я выполню, заключается в том, что я создам count_matrix с помощью CountVectorizer.
CountVectorizer будет подсчитывать количество слов, присутствующих в тексте.
CountVectorizer работает следующим образом для каждого текста.
Теперь я создам матрицу оценки сходства, которая представляет собой квадратную матрицу и содержит значения от 0 до 1, потому что здесь я использую косинусное сходство, а значение cos лежит между 1 и 0.
Если два фильма тесно связаны между собой, то угол между ними близок к нулю, а показатель сходства близок к 1.
Теперь я буду получать информацию от пользователя, используя HTML-страницу, которую я создал, ссылка на весь код (html, css и т. д.) приведена в конце блога.
Я уберу все нежелательные символы из пользовательского ввода.
Если в столбце «title» набора данных присутствует заголовок, такой же, как введенный пользователем, тогда найдите индекс по выбору пользователя, и с помощью этого индекса мы можем найти индексы и расстояния связанных фильмов, используя Ближайшие соседи.kneighbors().
Если введенные пользователем данные не совпадают ни с одной строкой в столбце title, извлеките список названий фильмов, который содержит введенные пользователем данные, отсортируйте список и, используя первое название фильма в отсортированном списке, найдите его индекс и выполните описанные выше шаги, чтобы найти индексы и расстояния связанных фильмов.
Код flask в файле python выглядит следующим образом:
Здесь main_page.html — это веб-страница, на которой пользователь вводит название фильма. movie_list.html — это веб-страница, на которой отображается список рекомендуемых фильмов.
Чтобы развернуть модель на Heroku, нам нужны еще два файла:
- Procfile
- требования.txt
Flask ищет файлы HTML в папке «templates» и файлы CSS в папке «static/styles», поэтому никогда не забывайте размещать файлы в правильном месте, иначе они не будут Работа.
Загрузите все файлы и папки на github.
Откройте Heroku и создайте учетную запись или войдите.
Нажмите «Новое/Создать новое приложение».
Введите имя приложения и нажмите «Создать приложение».
Нажмите GitHub и выполните поиск в репозитории.
Нажмите Подключить.
Затем нажмите «Развернуть ветку».
Если все пойдет хорошо, он начнет устанавливать пакеты, перечисленные в файле requirements.txt, и в конце выдаст URL-адрес, заканчивающийся на herokuapp.com .
Вы можете найти весь проект, нажав на ссылку, указанную ниже:
Спасибо ;)