Системы рекомендаций на основе содержания. Мы обсуждали механизмы рекомендаций в нескольких последних блогах, поэтому я собираюсь сосредоточиться непосредственно на разнообразии механизмов рекомендаций или механизмов, основанных на содержании, которые помогают нам с 'предложениями', когда мы используем разные носители. или развлекательные приложения. В любом случае, давайте быстро приступим к их работе.

Работа системы рекомендаций на основе содержания (алгоритм)

Эти системы дают рекомендации, используя элементы и характеристики профиля пользователя. Они предполагают, что если пользователь интересовался элементом в прошлом, он снова заинтересуется им в будущем. Подобные предметы обычно группируются на основе их характеристик. Профили пользователей создаются с использованием исторических взаимодействий или путем явного опроса пользователей об их интересах. Существуют и другие системы, не считающиеся чисто контентными, которые используют личные и социальные данные пользователей.

Проблемы с фильтрацией на основе содержания
Одна из возникающих проблем заключается в предоставлении очевидных рекомендаций из-за чрезмерной специализации (пользователя А интересуют только категории B, C и D, а система не может рекомендовать товары вне этих категорий, даже если они могут быть им интересны). Еще одна распространенная проблема заключается в том, что новые пользователи не имеют определенного профиля, если только у них явно не запрашивают информацию. Тем не менее, добавить новые элементы в систему относительно просто. Нам просто нужно убедиться, что мы назначаем им группу в соответствии с их характеристиками.

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

Хорошо, теперь давайте перейдем непосредственно к реализации на питоне.

Начнем с импорта наших библиотек.

#Importing libraries which are needed
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

Следующим шагом будет импорт набора данных. Ссылка на набор данных приведена ниже:



Загрузите файл csv и импортируйте его в данную среду, используя следующую команду.

#Importing dataset of metadata from movies
#Importing dataset of metadata from movies
metadata = pd.read_csv(‘movies_metadata.csv’, low_memory=False)
metadata.head(3)

В столбце Вычисляя среднее значение в столбце "среднее значение голосов", мы получаем 6,069064705533525 в качестве вывода.

mean = metadata[‘vote_average’].mean()
print(mean)

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

m = metadata[‘vote_count’].quantile(0.90)
print(m)

Фильтрация подходящих фильмов в новый кадр данных

filtered_movies = metadata.copy().loc[metadata[‘vote_count’] >= m]
filtered_movies.shape

Мы пишем функцию «weighted_rating», которая вычисляет общий рейтинг каждого фильма.

def weighted_rating(x, m=m, mean=mean):
  v = x[‘vote_count’]
  R = x[‘vote_average’]
# Calculation based on the IMDB formula
  return (v/(v+m) * R) + (m/(m+v) * mean)

Определение новой функции под названием "Оценка" и вычисление ее значения с помощью `weighted_rating()`

filtered_movies[‘score’] = filtered_movies.apply(weighted_rating, axis=1)

Сортировка фильмов по убыванию на основе вычисленного значения.

filtered_movies = filtered_movies.sort_values(‘score’, ascending=False)
#Print the top 15 movies
filtered_movies[[‘title’, ‘vote_count’, ‘vote_average’, ‘score’]].head(20)

Приступаем к самой важной части реализации

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

metadata[‘overview’].head(5)

Следующим шагом будет получить векторизатор TF-IDF из sci-kit Learn, и я бы посоветовал изучить документацию библиотеки для запросов на основе синтаксиса.

#Import TF-ID Vectorizer from scikit-learn
from sklearn.feature_extraction.text import TfidfVectorizer
#Define a TF-IDF Vectorizer Object. Remove all english stop words such as 'the', 'a'
tfidf = TfidfVectorizer(stop_words='english')
#Replace NaN with an empty string
metadata['overview'] = metadata['overview'].fillna('')
#Construct the required TF-IDF matrix by fitting and transforming the data
tfidf_matrix = tfidf.fit_transform(metadata['overview'])
#Output the shape of tfidf_matrix
tfidf_matrix.shape

Давайте попробуем получить сопоставление массива из целочисленных индексов объектов с именами объектов.

tfidf.get_feature_names()[5000:5010]

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

# On Importing linear_kernel
from sklearn.metrics.pairwise import linear_kernel
# Computing the cosine similarity matrix
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

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

cosine_sim[1]

Теперь построим обратную карту индексов и названий фильмов.

indices = pd.Series(metadata.index, index=metadata[‘title’]).drop_duplicates()

Вы можете распечатать значения и проверить их.

indices[:10]

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

ГЛАВНАЯ ЧАСТЬ!

def get_recommendations(title, cosine_sim=cosine_sim):
# Get the index of the movie that matches the title
  idx = indices[title]
# Get the pairwsie similarity scores of all movies with that movie
  sim_scores = list(enumerate(cosine_sim[idx]))
# Sort the movies based on the similarity scores
  sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# Get the scores of the 10 most similar movies
  sim_scores = sim_scores[1:11]
# Get the movie indices
  movie_indices = [i[0] for i in sim_scores]
# Return the top 10 most similar movies
  return metadata['title'].iloc[movie_indices]

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

get_recommendations('The Godfather')

Видно, что мы попытались запросить фильм «Крестный отец», и были получены похожие на него результаты, такие как его сиквелы, основанные на вычисленной матрице косинусного сходства. Поскольку мы работаем с текстовым корпусом, мы использовали векторизатор TF-IDF. Первоначально рекомендательная система была разработана исключительно на основе матрицы сходства и оценки, разработанной для фильма. Ближе к финалу мы разработали рекомендательную систему, основанную на актерском составе, ключевых словах и режиссерах.

Это все на сегодня. Спасибо за чтение. Продолжай учиться.

Ваше здоровье.