Как сделать функцию рекомендации в Python - PullRequest
0 голосов
/ 02 декабря 2019

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

Допустим, у нас есть следующие два словаря:

#this is a dictionary where the keys are people and the items are the movies they liked
person_to_movies = {'James': ['Up', 'Fight Club'], 
                    'Lily': ['Harry Potter', 'Up', 'Wreck it Ralph']
                    'Albus': ['50 Shades of Gray', 'Iron Man']
                    'Severus': ['The Matrix', 'Spiderman 1', 'Captain America', 'Iron Man', 'Joker']}
#this is a dictionary of who is friends with whom
person_to_friends = {'James': ['Albus', 'Harry', 'Lily']
                     'Albus': ['James', 'Lily']
                     'Harry': ['James', 'Lily', 'Severus', 'Ronald']
                     'Ronald': ['Harry']}

Что мой метод должен сделать, это взять 3 параметра: словарь "человек в друзья", словарь "человек в кино" и человекчто они рекомендуют фильмы. так, например: recommend_movies(person_to_friends, person_to_clubs, 'James') будет допустимым вызовом.

Что он должен сделать, это (в этом примере)

a) если другу Джеймса нравится фильм, то этот фильм получает +1 балл

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

Примером этого может быть то, что, поскольку Джеймс и Лили дружат, фильм «Разрушь его Ральф» получает очко, но поскольку Лили и Гарри нравятся оба фильма «Вверх», «Разрушить это Ральф» получает другоготочка

формат вывода представляет собой список кортежей, в котором каждый кортеж имеет два элемента: фильм и его точки

Вот что у меня есть

recommend_movies(p2f: Dict[str, List[str]],
        p2m: Dict[str, List[str]],
        p: str,) -> List[Tuple[str, int]]:

    ignore_movies = []

    #we want to ignore the movies the person has already watched
    if p in p2m:
        ignore_movies = p2m[p]

    #we'll make a list of their friends that like at least 1 movie
    friends_list = p2f[p]
    for friend in friends_lst:
        if friend not in p2m:
            friends_lst.remove(friend)    

    #now let's make a list of the movies the person's friends have liked
    movies_lst = []
    for friend in friends_lst:
        for movie in p2m[friend]:
            if movie not in ignore_movies:
                movies_lst.append(movie)

    movie_recommendations = {}
    for movie in movies_lst:
        if movie not in movie_recommendations:
            movie_recommendations[movie] = 1
        elif movie in movie_recommendations:
            movie_recommendations[movie] += 1

    return [(k, v) for k, v in movie_recommendations.items()] 

Этот код, кажется, работает для (а), где, если другу человека нравится фильм, он добавляет к числу, но я не знаю, что делать для (б), если другу человека нравится фильм, а друг иУ человека есть еще один взаимно любимый фильм.

Таким образом, вывод, который я получаю для этого примера, [('50 Shades of Gray', 1), ('Iron Man', 1), ('Harry Potter', 1), ('Wreck it Ralph', 1)] вместо [('50 Shades of Gray', 1), ('Iron Man', 1), ('Harry Potter', 2), ('Wreck it Ralph', 2)]

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