Система рекомендаций фильмов — фильтрация на основе контента
Блог полностью посвящен системе рекомендаций фильмов на основе контента, которая развернута как веб-сайт на 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-файлов:
- tmdb_5000_credits.csv
- 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, нам нужны еще два файла:
- Procfile
- требования.txt
- runtime.txt (это может потребоваться или не потребоваться — мне пришлось создать этот файл, чтобы явно предоставить версию Python для чтения для heroku)
Flask ищет файлы HTML в папке «templates» и файлы CSS в папке «static/styles», поэтому никогда не забывайте размещать файлы в правильном месте, иначе они не будут работа.
Загрузите все файлы и папки на github.
Откройте Heroku и создайте учетную запись или войдите в систему.
Нажмите «Новое/Создать новое приложение».
Введите имя приложения и нажмите «Создать приложение».
Нажмите GitHub и выполните поиск в репозитории.
Нажмите Подключить.
Затем нажмите «Развернуть ветку».
Если все пойдет хорошо, он начнет устанавливать пакеты, перечисленные в файле requirements.txt, и в конце выдаст URL-адрес, заканчивающийся на herokuapp.com .
Заключение
Именно так мы создаем систему рекомендаций фильмов на основе контента с очень ограниченным объемом данных! Это, очевидно, можно значительно улучшить, добавив различные функции для улучшения части пользовательского интерфейса, и я хотел бы просмотреть и объединить ваши улучшения функций и принять участие в любых проблемах на моем Github! Если вы придумаете улучшения для этого проекта, не стесняйтесь открывать вопрос и вносить свой вклад. Я хотел бы просмотреть и объединить ваши улучшения функций и решить любые проблемы на моем Github!
Вы можете связаться со мной с любыми вопросами по этому поводу в моей почте gmail: [email protected], и я с удовольствием на них отвечу. Спасибо ;)