Простая система рекомендаций, TfidfVectorizer и CountVectorizer для новичков.

Цель

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

С данными аниме мы применим две разные модели системы рекомендаций: простую систему рекомендаций и систему рекомендаций, основанную на содержании, для анализа данных аниме и создания рекомендаций.

Обзор

Для простой системы рекомендаций нам нужно рассчитать взвешенный рейтинг, чтобы убедиться, что оценка одного и того же балла для разных номеров голосов будет иметь неравный вес. Например, средняя оценка 9,0 от 10 человек будет иметь меньший вес по сравнению со средней оценкой 9,0 от 1000 человек. После того, как мы рассчитаем взвешенный рейтинг, мы можем увидеть список лучших аниме в чарте.

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

Обзор данных

Имея данные об аниме, мы имеем в общей сложности 12 294 аниме с 7 различными типами данных, включая anime_id, имя, жанр, тип, эпизоды, рейтинг и участников.

Выполнение

1. Импортировать данные

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

import pandas as pd
anime = pd.read_csv('…/anime.csv')
anime.head(5)

anime.info()

anime.describe()

Мы видим, что минимальный рейтинг составляет 1,67, а максимальный - 10. Минимальное количество участников - 5, а максимальное - 1 013 917.

anime_dup = anime[anime.duplicated()]
print(anime_dup)

Нет дублирующихся данных, которые нужно очищать.

type_values = anime['type'].value_counts()
print(type_values)

Большинство аниме транслируется по телевидению, за ним следует OVA.

2. Простая система рекомендаций

Во-первых, нам нужно знать расчет взвешенного рейтинга (WR).

v - количество голосов за аниме; m - минимальное количество голосов, необходимое для внесения в таблицу; R - средний рейтинг аниме; C - это среднее количество голосов по всему отчету.

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

m = anime['members'].quantile(0.75)
print(m)

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

qualified_anime = anime.copy().loc[anime['members']>m]
C = anime['rating'].mean()
def WR(x,C=C, m=m):
    v = x['members']
    R = x['rating']
    return (v/(v+m)*R)+(m/(v+m)*C)
qualified_anime['score'] = WR(qualified_anime)
qualified_anime.sort_values('score', ascending =False)
qualified_anime.head(15)

Это список из 15 лучших аниме на основе расчета взвешенного рейтинга.

3. Система рекомендаций по жанрам

С рекомендациями по жанрам мы будем использовать пакет sklearn, который поможет нам анализировать текстовый контекст. Нам нужно будет вычислить схожесть жанров. Мы собираемся использовать два метода: TfidfVectorizer и CountVectorizer.

В TfidfVectorizer он вычисляет частоту слова с учетом того, как часто оно встречается во всех документах. Хотя CountVectorizer проще, он только считает, сколько раз встречается слово.

from sklearn.feature_extraction.text import TfidfVectorizer
tf_idf = TfidfVectorizer(lowercase=True, stop_words = 'english')
anime['genre'] = anime['genre'].fillna('')
tf_idf_matrix = tf_idf.fit_transform(anime['genre'])
tf_idf_matrix.shape

Мы видим, что в 12 294 аниме есть 46 разных слов.

from sklearn.metrics.pairwise import linear_kernel
cosine_sim = linear_kernel(tf_idf_matrix, tf_idf_matrix)
indices = pd.Series(anime.index, index=anime['name'])
indices = indices.drop_duplicates()
def recommendations (name, cosine_sim = cosine_sim):
    similarity_scores = list(enumerate(cosine_sim[indices[name]]))
    similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True)
    similarity_scores = similarity_scores[1:21]
    anime_indices = [i[0] for i in similarity_scores]
    return anime['name'].iloc[anime_indices]
recommendations('Kimi no Na wa.')

Основываясь на расчетах TF-IDF, это 20 лучших аниме-рекомендаций, похожих на Kimi no Na wa.

Далее мы рассмотрим другую модель, CountVectorizer (), и сравним результат между cosine_similarity и linear_kernel.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
count = CountVectorizer(stop_words = 'english')
count_matrix = count.fit_transform(anime['genre'])
cosine_sim2 = cosine_similarity(count_matrix, count_matrix)
recommendations('Kimi no Na wa.', cosine_sim2)

cosine_sim2 = linear_kernel(count_matrix, count_matrix)
recommendations('Kimi no Na wa.', cosine_sim2)

Резюме

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

Надеюсь, вам понравится эта статья!

Ссылки

1. https://www.datacamp.com/community/tutorials/recommender-systems-python