В этом блоге показана система рекомендаций на основе содержания на Python

Это моя первая серия блогов в новом десятилетии, начиная с 2020 года, и поэтому я очень взволнован. Прежде чем начать иллюстрировать рекомендательные системы на основе контента на Python, я рекомендую вам прочитать этот блог за 4 минуты, в котором описывается рекомендательная система и ее типы с точки зрения непрофессионала.

Https://medium.com/@saketgarodia/the-world-of-recommender-systems-e4ea504341ac?source=friends_link&sk=508a980d8391daa93530a32e9c927a87

В этом блоге я покажу, как реализовать систему рекомендаций на основе контента в Python на наборе данных Kaggle MovieLens 100k.



Приступим к его реализации.

Постановка проблемы

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

Реализация

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

#importing necessary libraries
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
#putting movies data on 'movies' dataframe
movies = pd.read_csv('movies_metadata.csv')

Поскольку мы строим рекомендательную систему на основе графиков, давайте выберем только те столбцы, которые мы будем использовать. Мы будем использовать фильм 'id', фильм 'title' и 'overview' (overview подробно описывает сюжет каждого фильма).

Вот как теперь выглядят данные.

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

movies[‘overview’][0]

Вот как сюжет фильма «История игрушек» выглядит в наборе данных: «Под руководством Вуди игрушки Энди счастливо живут в его комнате, пока на день рождения Энди на сцену не выходит Базз Лайтер. Боясь потерять место в сердце Энди, Вуди замышляет заговор против Базза. Но когда обстоятельства отделяют Базза и Вуди от их владельца, дуэт в конечном итоге учится игнорировать свои разногласия ».

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

В качестве первого шага мы будем использовать TfidfVectorizer, который в основном преобразует наш «обзор» (текстовый столбец) в числовой. Все модели науки о данных основаны на числовых значениях, поскольку компьютеры могут понимать только нули и единицы.

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

tfidf = TfidfVectorizer(stop_words=’english’)
movies[‘overview’] = movies[‘overview’].fillna(‘’)
#Construct the required TF-IDF matrix by applying the fit_transform method on the overview feature
overview_matrix = tfidf.fit_transform(movies[‘overview’])
#Output the shape of tfidf_matrix
overview_matrix.shape
#Output
(45466, 75827)

Теперь у нас есть матрица функций tfidf для всех фильмов. Каждый фильм имеет 75927 количество функций (слов). Теперь, чтобы найти сходство между фильмами, мы будем использовать cosine_similarity. В нашем случае функция linear_kernel вычислит то же самое за нас.

Cosine_Similarity - это в основном мера сходства между двумя векторами. Эта мера представляет собой косинус угла между ними. Здесь у нас есть 75927 функций (значений tfidf) для каждого фильма. Давайте теперь найдем матрицу подобия, используя функцию linear_kernel:

similarity_matrix = linear_kernel(overview_matrix,overview_matrix)
similarity_matrix

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

#movies index mapping
mapping = pd.Series(movies.index,index = movies[‘title’])
mapping

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

def recommend_movies_based_on_plot(movie_input):
movie_index = mapping[movie_input]
#get similarity values with other movies
#similarity_score is the list of index and similarity matrix
similarity_score = list(enumerate(similarity_matrix[movie_index]))
#sort in descending order the similarity score of movie inputted with all the other movies
similarity_score = sorted(similarity_score, key=lambda x: x[1], reverse=True)
# Get the scores of the 15 most similar movies. Ignore the first movie.
similarity_score = similarity_score[1:15]
#return movie names using the mapping series
movie_indices = [i[0] for i in similarity_score]
return (movies[‘title’].iloc[movie_indices])

Давайте теперь попробуем получить рекомендацию для фильма «Жизнь начинается для Энди Харди» с помощью вышеуказанной функции рекомендаций и посмотрим, что она выдает.

recommend_movies_based_on_plot(‘Life Begins for Andy Hardy’)

Наконец, мы видим, что, когда мы вводим фильм «Жизнь начинается для Энди Харди», мы получаем 15 рекомендаций фильмов, сюжеты которых похожи на этот фильм. Это волшебно. Не правда ли?

Чтобы узнать о подходах, основанных на метаданных и совместной фильтрации, просмотрите следующие мои блоги:

  1. Рекомендательные системы на основе метаданных: https://medium.com/@saketgarodia/metadata-based-recommender-systems-in-python-c6aae213b25c
  2. Рекомендательные системы, использующие совместную фильтрацию: https://medium.com/@saketgarodia/recommendation-system-using-collaborative-filtering-cc310e641fde

Спасибо за прочтение.

Пожалуйста, оставьте отзыв.