В наши дни системы рекомендаций довольно распространены. Netflix, Prime Video, YouTube и другие потоковые платформы используют эти системы рекомендаций, чтобы предложить фильм, который вы могли бы посмотреть в соответствии с вашей предыдущей историей просмотра.

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

Мы также создадим систему на Python, используя пакет python scikit-learn. У вас должны быть базовые знания в области программирования на Python и таких терминов машинного обучения, как набор данных, модель, обучение и построение модели.

Что такое система рекомендаций?

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

После того, как мы выберем несколько заголовков, которые, возможно, уже смотрели по телевизору или на Netflix ранее.

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

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

Не только Netflix, но и YouTube используют некоторую систему рекомендаций, чтобы показывать вам релевантные видео на вашей домашней странице.

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

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

Создание простой системы рекомендаций

Есть много видов систем рекомендаций, таких как

  • Система рекомендаций на основе популярности

Например, страница тенденций на YouTube или Netflix, которая предлагает вам на основе просмотров и лайков или времени просмотра видео или фильма, полученных за последние несколько дней.

  • Контентно-ориентированная система рекомендаций

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

Это система, которую мы собираемся построить.

Мы возьмем один ввод (название фильма) и порекомендуем похожие фильмы в качестве вывода (обратно пользователю).

  • Совместная система фильтрации

Это система рекомендаций, ставшая популярной в Netflix. По сути, это равноправные рекомендации. Если человек 1 смотрел фильм, а человек 2 также смотрит фильм, тогда фильм, который будет смотреть человек 1 позже, будет предложен человеку 2, наоборот.

Это соответствует людям со схожими интересами и рекомендует друг другу.

Концепция, лежащая в основе нашей системы:

Поскольку мы собираемся создать систему рекомендаций, основанную на содержании, наша главная цель - найти показатель сходства между двумя объектами или строками. Итак, мы используем концепцию, называемую косинусоидальным подобием.

Что такое косинусное сходство:

Например :

Текст первый: Джек Роуз Джек Джек

Текст второй: Роза Джек Роуз Роуз

Как мы можем получить оценку сходства между слепками этих двух текстов? Вот где на сцену выходит косинусное сходство.

По сути, это дает математическое сходство между приведениями двух названий.

Математика, лежащая в основе косинусного сходства:

На графике я только что нарисовал вхождение слова в тексте примера.

Как нам найти расстояние между этими двумя векторами? Да, как мы узнали в старшей школе, для этого есть два простых метода.

Угловое расстояние: Theta, угловое расстояние между этими векторами,

Евклидово расстояние: соедините концы векторов, и длина будет евклидовым расстоянием.

Мы собираемся использовать формулу CosTheta, с которой большинство из вас может столкнуться в старшей школе.

Хорошо, хватит теории ... Давайте поработаем над кодом. Откройте свой любимый текстовый редактор (я предпочитаю код VS).

Во-первых, вам нужно установить несколько пакетов Python:

scikit-learn - Док

Начните с импорта некоторых пакетов

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

Узнать больше о CountVectorizer

Создайте переменную с нашими двумя текстами:

text =["Jack Rose Jack  Jack", "Rose Jack Rose Rose"]

Мы используем метод векторизатора счетчика для преобразования наших строк в векторы типа (3,1) и (1,3).

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

cv = CountVectorizer()
count_matrix = cv.fit_transform(text)

Вы можете использовать print count_matrix.toarray (), чтобы увидеть выходную матрицу. Это покажет массив NumPy что-то вроде

[[3,1]
[1,3]]

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

smilarity_scores = cosine_similarity(count_matrix)
print(similarity_scores)

Когда вы запускаете программу, она показывает массив с оценками сходства. Итак, это в основном наша концепция, лежащая в основе нашей системы рекомендаций.

Теперь, когда вы знаете концепцию и основную математику, лежащую в основе нашей системы, давайте приступим к созданию нашего движка.

Приступим!

Начните с создания нового файла Python и назовите его как-то вроде Recommender.py.

Начнем с импорта необходимых пакетов:

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

Из предыдущего примера мы дополнительно импортируем pandas и NumPy для обработки и чтения нашего набора данных.

Для этой системы я использовал набор данных IMDB, который нашел на kaggle.com, и немного очистил его, чтобы мы могли использовать его с нашей системой.

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

Https://github.com/kamaravichow/MovieRecommendations/blob/master/movie_dataset.csv

Если вы откроете его в Excel или офисном ПО, он должен выглядеть так:

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

Загрузите набор данных и поместите его в папку с нашим скриптом python.

df = pd.read_csv("movie_dataset.csv")

Мы используем pandas для чтения набора данных CSV и загрузки его в переменную df (DataFrame).

def get_title_from_index(index): 
    return df[df.index == index]["title"].values[0] 
def get_index_from_title(title): 
    return df[df.title == title]["index"].values[0]

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

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

features = ['keywords','cast','genres','director']

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

Теперь давайте объединим все функции в фрейм данных:

for feature in features: 
    df[feature] = df[feature].fillna('')

И функция для их объединения в одно:

def combine_features(row):
 try:
    return row['keywords'] +" "+row['cast']+" "+row["genres"]+"   "+row["director"]
 except:  print "Error:", row 
 df["combined_features"] = df.apply(combine_features,axis=1)

Вы можете увидеть комбинированные функции с помощью метода печати:

print "Combined Features:", df["combined_features"].head()

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

cv = CountVectorizer() 
count_matrix = cv.fit_transform(df["combined_features"])

Получение сходства на основе count_matrix

cosine_sim = cosine_similarity(count_matrix)

Теперь мы берем ввод от пользователя. Это понравившийся пользователю фильм.

movie_user_likes = "Spectre"

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

movie_index = get_index_from_title(movie_user_likes)

Получите список похожих фильмов (индексы похожих фильмов):

similar_movies =  list(enumerate(cosine_sim[movie_index]))

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

sorted_similar_movies = sorted(similar_movies,key=lambda x:x[1],reverse=True)

Теперь, чтобы посмотреть на результат, мы напечатаем 25 наиболее подходящих фильмов на консоль (вывод)

i=0
for element in sorted_similar_movies:
  print get_title_from_index(element[0])
  i=i+1
  if i>25:
   break

Это покажет на консоли 25 наиболее похожих фильмов.

Итак, вот как мы в основном строим систему рекомендаций, основанную на содержании, используя sci-kit-learn и python.

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

Все коды и набор данных в моем репозитории GitHub:

Https://github.com/kamaravichow/MovieRecommendations