Как я могу получить рекомендации пользователей, которые не оценили этот элемент, для данного элемента? - PullRequest
1 голос
/ 19 июня 2020

Мой вариант использования:

Учитывая элемент, я хотел бы получить рекомендации пользователей, которые не оценили этот элемент.

Я нашел эту удивительную Python библиотеку, которая может ответить на мой вариант использования:

python -recsys https://github.com/ocelma/python-recsys

Пример: как показано ниже.

Какие пользователи должны видеть «Историю игрушек»? (например, какие пользователи, которые не оценили "Историю игрушек", дадут ей высокую оценку?) -mov ie, которые изначально не оценивались.

К сожалению, эта библиотека написана с использованием Python 2.7, что несовместимо с моим проектом.

Я также нашел библиотеку Scikit Surprise который имеет аналогичный пример.

https://surprise.readthedocs.io/en/stable/FAQ.html#how -to-get-the-k-ближайших-соседей-пользователя-или-элемента

import io  # needed because of weird encoding of u.item file

from surprise import KNNBaseline
from surprise import Dataset
from surprise import get_dataset_dir


def read_item_names():
    """Read the u.item file from MovieLens 100-k dataset and return two
    mappings to convert raw ids into movie names and movie names into raw ids.
    """

    file_name = get_dataset_dir() + '/ml-100k/ml-100k/u.item'
    rid_to_name = {}
    name_to_rid = {}
    with io.open(file_name, 'r', encoding='ISO-8859-1') as f:
        for line in f:
            line = line.split('|')
            rid_to_name[line[0]] = line[1]
            name_to_rid[line[1]] = line[0]

    return rid_to_name, name_to_rid


# First, train the algortihm to compute the similarities between items
data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()
sim_options = {'name': 'pearson_baseline', 'user_based': False}
algo = KNNBaseline(sim_options=sim_options)
algo.fit(trainset)

# Read the mappings raw id <-> movie name
rid_to_name, name_to_rid = read_item_names()

# Retrieve inner id of the movie Toy Story
toy_story_raw_id = name_to_rid['Toy Story (1995)']
toy_story_inner_id = algo.trainset.to_inner_iid(toy_story_raw_id)

# Retrieve inner ids of the nearest neighbors of Toy Story.
toy_story_neighbors = algo.get_neighbors(toy_story_inner_id, k=10)

# Convert inner ids of the neighbors into names.
toy_story_neighbors = (algo.trainset.to_raw_iid(inner_id)
                       for inner_id in toy_story_neighbors)
toy_story_neighbors = (rid_to_name[rid]
                       for rid in toy_story_neighbors)

print()
print('The 10 nearest neighbors of Toy Story are:')
for movie in toy_story_neighbors:
    print(movie)

Печать

The 10 nearest neighbors of Toy Story are:
Beauty and the Beast (1991)
Raiders of the Lost Ark (1981)
That Thing You Do! (1996)
Lion King, The (1994)
Craft, The (1996)
Liar Liar (1997)
Aladdin (1992)
Cool Hand Luke (1967)
Winnie the Pooh and the Blustery Day (1968)
Indiana Jones and the Last Crusade (1989)

Как мне изменить код, чтобы получить результат, подобный приведенному выше примеру python -recsys? Заранее спасибо.

1 Ответ

0 голосов
/ 19 июня 2020

Это просто реализация алгоритма k-ближайших соседей. Прежде чем продолжить, посмотрите, как это работает.

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

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

Это математика, лежащая в основе алгоритма https://youtu.be/4ObVzTuFivY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...