Системы рекомендаций на основе содержания. Мы обсуждали механизмы рекомендаций в нескольких последних блогах, поэтому я собираюсь сосредоточиться непосредственно на разнообразии механизмов рекомендаций или механизмов, основанных на содержании, которые помогают нам с 'предложениями', когда мы используем разные носители. или развлекательные приложения. В любом случае, давайте быстро приступим к их работе.
Работа системы рекомендаций на основе содержания (алгоритм)
Эти системы дают рекомендации, используя элементы и характеристики профиля пользователя. Они предполагают, что если пользователь интересовался элементом в прошлом, он снова заинтересуется им в будущем. Подобные предметы обычно группируются на основе их характеристик. Профили пользователей создаются с использованием исторических взаимодействий или путем явного опроса пользователей об их интересах. Существуют и другие системы, не считающиеся чисто контентными, которые используют личные и социальные данные пользователей.
Проблемы с фильтрацией на основе содержания
Одна из возникающих проблем заключается в предоставлении очевидных рекомендаций из-за чрезмерной специализации (пользователя А интересуют только категории 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. Первоначально рекомендательная система была разработана исключительно на основе матрицы сходства и оценки, разработанной для фильма. Ближе к финалу мы разработали рекомендательную систему, основанную на актерском составе, ключевых словах и режиссерах.
Это все на сегодня. Спасибо за чтение. Продолжай учиться.
Ваше здоровье.