Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

Рекомендательные системы и реализация Content-based системы

Небольшое введение в рекомендательные системы: основные идеи, типы, метрики и как они работают. А также реализация content based системы для аниме и небольшой анализ данных.

288 открытий2К показов
Рекомендательные системы и реализация Content-based системы

Небольшое введение в рекомендательные системы: основные идеи, типы, метрики и как они работают.

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

Теория (самый страшный зверь)

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

Метрика

Чаще всего для оценки расстояния используют косинусное сходство (Cosine Similarity).

Представление данных в форме вектора имеет ещё одно полезное свойство. Мы можем измерить близость двух векторов или угол между ними. Чем угол меньше, тем они ближе.

Рекомендательные системы и реализация Content-based системы 1
Косинусное расстояние

TF-IDF

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

TF — это частота слова в тексте – количество раз, когда слово появляется в документе, деленное на общее количество слов в документе (каждый документ имеет свою частоту терминов). Обратная частота данных IDF — это логарифм обратной частоты распространенности слова в корпусе. Распространенностью называется отношение числа текстов, в которых встретилось искомое слово, к общему числу текстов в корпусе.

Обратная частота данных определяет вес редких слов во всех документах корпуса.

Рекомендательные системы и реализация Content-based системы 2
Визуализация работы TF-IDF

Scikit-Learn предоставляет преобразователь под названием TfidfVectorizer в модуле feature_extraction.text для векторизации с оценками TF-IDF.

Проблемы

  • Холодный запуск

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

  • Разреженность

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

  • Конфиденциальность

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

Рекомендательные системы и реализация Content-based системы 3
Проблемы рекомендательных систем

Типы рекомендательных систем

Рекомендательные системы и реализация Content-based системы 4
Типы рекомендательных систем

Popularity-based

Наиболее простая система выдает рекомендации на основе популярности (popularity-based recommender systems). Чем выше средний рейтинг фильма, купленного товара или статьи, тем вероятнее, что система будет рекомендовать именно их.

Рекомендательные системы и реализация Content-based системы 5
Сводка по popularity-based системам

Сontent-based filtering

Вторым типом рекомендательных систем является, так называемая, фильтрация на основе содержания (content-based filtering). В данном случае алгоритм рекомендует товары или услуги, схожие с теми, которые пользователь приобретал ранее. Например, если вы посмотрели фильм «Матрица» с Киану Ривзом, то в дальнейшем система будет рекомендовать вам научную фантастику, а также другие фильмы с участием этого актера.

Рекомендательные системы и реализация Content-based системы 6
Сводка по content-based системам

Collaborative filtering

Третий тип — коллаборативная система (collaborative filtering). Она основывается на сопоставлении пользователей и товаров (или услуг, новостей и т.д.). Математически и графически в данном случае мы работаем с матрицами предпочтений (user-item matrix).

Рекомендательные системы и реализация Content-based системы 7
Сводка по collaborative системам

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

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

Рекомендательные системы и реализация Content-based системы 8
Отличие collaborative  фильтрации от content-based

Что такое User-item matrix?

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

Рекомендательные системы и реализация Content-based системы 9
Алгоритм работы матрицы предпочтений

В совместной фильтрации используются два подхода:

а) Совместная фильтрация ближайших соседей на основе пользователей (user-based)

Коллаборативные системы, основанные на пользователях (user-based), находят близких по предпочтениям пользователей и рекомендуют одному из них то, что уже попробовал другой.

User Profile:

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

Рекомендательные системы и реализация Content-based системы 10
Сводка по совместной фильтрации на основе пользователя

b) Совместная фильтрация ближайших соседей на основе элементов (item-based)

Системы, основанные на предмете рекомендации (item-based), сравнивают непосредственно близость товаров или услуг. Причем что отличает эту систему, сходство определяется на основе предпочтений всех пользователей, которые оставили свои оценки.

Item Profile:

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

Например, если мы делаем фильм как объект, то его актеры, режиссер, год выпуска и жанр являются наиболее значимыми характеристиками фильма. Мы также можем добавить его рейтинг из IMDB (база данных фильмов в Интернете) в профиле товара.

Рекомендательные системы и реализация Content-based системы 11
Сводка по совместной фильтрации на основе элементов

На этом мы закончим с ознакомлением с системами и перейдем к самому интересному — коду.

Немного о данных

Датасет я создала свой собственный, содержащий в себе данные об аниме (японской анимации) с сайта MyAnimeList(MAL). Очевидно, ниже приведенный код может быть использован для других наборов данных.

Рекомендательные системы и реализация Content-based системы 12
Структура датасета

Проведем небольшой анализ данных, чтобы иметь общее представление с чем же все таки работаем.

Посмотрим, какие жанры и теги чаще всего встречаются.

			ds['genre'] = ds['genre'].astype('str')
ds['themes'] = ds['themes'].astype('str')
title_corpus = ' '.join(ds['genre'])
themes_corpus = ' '.join(ds['themes'])
res = title_corpus + themes_corpus

from wordcloud import WordCloud, STOPWORDS

keywords_wordcloud = WordCloud(stopwords=STOPWORDS, background_color='white', height=2000, width=4000).generate(res)
plt.figure(figsize=(16,8))
plt.imshow(keywords_wordcloud)
plt.axis('off')
plt.show()
		
Рекомендательные системы и реализация Content-based системы 13
Наиболее часто встречаемые теги и жанры в датасете

Самые популярные жанры – школа, научная фантастика, экшен, комедия и романтика. Самый популярный тег – суперсилы.

			sns.barplot(x='anime_score', y='demographic', data=ds, ci=None)
		
Рекомендательные системы и реализация Content-based системы 14
Распределение рейтинга по демографическим группам

Чаще всего высокие оценки у сененов (аниме, рассчитанные на юношей до 18-ти лет), но в целом результаты почти одинаковые.

			sns.barplot(x='anime_score', y='rating', data=ds, ci=None)
		
Рекомендательные системы и реализация Content-based системы 15
Распределение рейтинга по возрастным ограничениям

Высокие оценки имеют аниме с рейтингами R-17 и PG-13, то есть большинство аниме рассчитано на подростков от 13 до 17 лет.

			tab = pd.crosstab(ds['rating'], ds['demographic'])
print (tab)

tab.div(tab.sum(1).astype(float), axis=0).plot(kind="bar", stacked=True)
plt.xlabel('rating')
plt.ylabel('Percentage')
		
Рекомендательные системы и реализация Content-based системы 16
Распределение аниме по возрастному ограничению и демографии

Аниме для детей имеют возрастной рейтинг для всех или для детей (до 13). Сёдзе (произведение для девушек до 18 лет) чаще всего имеет рейтинг для детей. Чем выше возрастное ограничение, тем увеличивается процент содержания сененов и сейненов (произведение для юношей до 18 и старше соответственно)

Выделим релевантные параметры для рекомендаций.

			selected_features = ['genre','themes','demographic','rating','studioname']
combined_features = ds['genre']+' '+ ds['themes'] + ' ' + ds['demographic']+ ' '+ ds['rating']+' '+ ds['studioname']
		
Рекомендательные системы и реализация Content-based системы 17
Параметры для каждого элемента

Рекомендательная система (Content Based)

			import difflib
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# converting the text data to feature vectors

vectorizer = TfidfVectorizer()
feature_vectors = vectorizer.fit_transform(combined_features)
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.metrics.pairwise import linear_kernel, cosine_similarity
		

Для меры сходства (Cosine similarity) выберем linear kernel (ядра являются мерами сходства, т.е. s(a, b) > s(a, c), если объекты a и b считаются “более похожими”, чем объекты a и c), так как это быстрее.

			cosine_sim = linear_kernel(feature_vectors, feature_vectors)
		

Теперь у нас есть матрица парного косинусного сходства (cosine similarity) для всех фильмов в нашем наборе данных. Следующим шагом будет написание функции, которая возвращает 30 наиболее похожих фильмов на основе оценки косинусного сходства.

			smd = ds.reset_index()
titles = smd['anime_name']
indices = pd.Series(smd.index, index=smd['anime_name'])

def get_recommendations(title):
    idx = indices[title]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:31]
    movie_indices = [i[0] for i in sim_scores]
    return titles.iloc[movie_indices]
    
# creating a list with all the anime names given in the dataset

list_of_all_titles = ds['anime_name'].tolist()
		

Наконец, проверим, как работает наша модель

			# getting the anime name from the user

anime_name = input(' Enter your favourite anime name : ')
		
			Enter your favourite anime name : vinland
		
			# finding the close match for the anime name given by the user

find_close_match = difflib.get_close_matches(anime_name, list_of_all_titles)

close_match = find_close_match[0]
		

Теперь сравним полученный список рекомендаций с рекомендациями на популярных сайтах (на примере аниме “Vinland Saga”)

			get_recommendations(close_match).head(20)
		
Рекомендательные системы и реализация Content-based системы 18
Рекомендации к аниме Vinland Saga

Самый популярный сайт на западе (MAL): Shingeki no Kyojin, Dororo, Kenpuu Denki Berserk, 91 Days, Golden Kamuy, Kingdom, Arslan Senki, Shingeki no Kyojin: The Final Season, Mushoku Tensei, Youjo Senki… – совпадает более чем на 70% с полученными результатами. Некоторые произведения не вошли, так как у них не были заполнены некоторые параметры или они вышли раньше 2000-х. Сайт, где рекомендации основываются полностью на отзывах пользователей (AnimePlanet): Shingeki no Kyojin, Berserk, Dororo, One Piece, Arslan Senki, Shoukoku no Altair, Akatsuki no Yona, Shingeki no Kyojin 3, Jormungand, Kingdom, Shigurui, Golden Kamuy 2, 91 Days, Kiseijuu… – похожие результаты как и выше. Можно сделать вывод, что система рекомендаций довольно хорошо работает – она показывает результаты, наиболее похожие на введенное аниме.

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

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

			def improved_recommendations(title):
    idx = indices[title]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:26]
    movie_indices = [i[0] for i in sim_scores]
    
    movies = smd.iloc[movie_indices][['anime_name', 'anime_score']]
    qualified = movies.sort_values(by="anime_score",ascending=False,axis=0).head(20)
    return qualified
    
improved_recommendations(close_match)
		
Рекомендательные системы и реализация Content-based системы 19
Усовершенствованная система рекомендаций

По сути объединили две системы, основанные на контенте: одна принимала на вход демографический параметр и возрастный рейтинг, а другая – метаданные, такие как студия, жанр и темы для составления прогнозов. А также разработали простой фильтр, чтобы отдать предпочтение фильмам с высоким рейтингом.

Источники

Посмотреть полную реализацию кода:

Следите за новыми постами
Следите за новыми постами по любимым темам
288 открытий2К показов