Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python创建一个简单的推荐系统_Python_Graph - Fatal编程技术网

用Python创建一个简单的推荐系统

用Python创建一个简单的推荐系统,python,graph,Python,Graph,我正在尝试创建一个简单的推荐系统,向用户推荐他们的朋友正在阅读的书籍。我创建了一个名为“推荐”的类,它捕获用户的详细信息,如姓名、用户的朋友、用户的书籍和推荐的书籍(朋友的书籍)。现在的问题是,当用户“A”的实例被创建时,A的推荐图书列表是空的,因为它的朋友“B”还没有被实例化。当“B”被实例化时,“A”仍然没有关于B书籍的线索,因为“A”在“B”之前被实例化过。有办法解决这个问题吗 from collections import defaultdict class recommendati

我正在尝试创建一个简单的推荐系统,向用户推荐他们的朋友正在阅读的书籍。我创建了一个名为“推荐”的类,它捕获用户的详细信息,如姓名、用户的朋友、用户的书籍和推荐的书籍(朋友的书籍)。现在的问题是,当用户“A”的实例被创建时,A的推荐图书列表是空的,因为它的朋友“B”还没有被实例化。当“B”被实例化时,“A”仍然没有关于B书籍的线索,因为“A”在“B”之前被实例化过。有办法解决这个问题吗

from collections import defaultdict


class recommendation: 
    friendsgraph =  defaultdict(set)  # key: user, value: friends of users
    booksgraph =  defaultdict(set)    # key: user, value: books of user       

    def __init__(self, user, books, friends):
        self.name = user
        self.books  = books
        self.friends = friends
        self.recommended_books = friendsbooks(friends)

        recommendation.friendsgraph[user] = friends
        recommendation.friendsgraph[user] = books

    def friendsbooks(friends):
        recommendation_list = set()
        for friend in friends:
            rec_books = recommendation.booksgraph[friend]
            if rec_books:
                recommendation_list.add(rec_books)
            else:
                recommendation_list = ()
        return recommendation_list


A = recommendation('A',('Harry Potter'),('B'))
B = recommendation('B',('Harry Potter', 'Master Algo'),('A','C'))
解决这个问题的一种方法是将朋友和书籍的字典作为属性传递,并编写一个单独的方法来推荐书籍。这样,每个用户在实例化时都会知道自己的朋友和他们的书籍。然而,这种策略剥夺了将属性与单个用户关联的能力(例如A.推荐的书籍)


一个5分钟的快速模型,以显示备选方案:

class User:
    def __init__(self, name, books=[], friends=[]):
        self.name = name
        self.books = books
        self.friends = friends

    def friendsbooks(self):
        books = set()
        for friend in self.friends:
            books.update(friend.books)
        return books

class Book:
    def __init__(self, name):
        self.name = name
        # Possibility of extending ..

    def __repr__(self):
        return self.name

books = [Book('Harry Potter'), Book('Master Algo')]
users = [
    User('A', books=[books[1]]),
    User('B', books=[books[0], books[1]]),
    User('C', books=[books[0]]),
]
users[0].friends = [users[1]]
users[1].friends = [users[0], users[2]]
users[2].friends = [users[0]]

print(users[2].friendsbooks())
产出:

{Master Algo, Harry Potter}
{Master Algo, Harry Potter}
{Master Algo}

添加初始数据确实会变得有点复杂,但你会明白的。当然可以进行一些改进。

一个5分钟的快速模型来展示一个替代方案:

class User:
    def __init__(self, name, books=[], friends=[]):
        self.name = name
        self.books = books
        self.friends = friends

    def friendsbooks(self):
        books = set()
        for friend in self.friends:
            books.update(friend.books)
        return books

class Book:
    def __init__(self, name):
        self.name = name
        # Possibility of extending ..

    def __repr__(self):
        return self.name

books = [Book('Harry Potter'), Book('Master Algo')]
users = [
    User('A', books=[books[1]]),
    User('B', books=[books[0], books[1]]),
    User('C', books=[books[0]]),
]
users[0].friends = [users[1]]
users[1].friends = [users[0], users[2]]
users[2].friends = [users[0]]

print(users[2].friendsbooks())
产出:

{Master Algo, Harry Potter}
{Master Algo, Harry Potter}
{Master Algo}

添加初始数据确实会变得有点复杂,但你会明白的。确实可以进行一些改进。

以下修改修复了该问题:

from collections import defaultdict

class recommendation:            
    friendsgraph =  defaultdict(set)
    booksgraph =  defaultdict(set)

    def __init__(self, user, books, friends):
        self.name = user
        self.books  = books
        self.friends = friends

        recommendation.friendsgraph[user] =  friends
        recommendation.booksgraph[user] = books


    def friendsbooks(self):
        recommendation_list = set()
        for friend in self.friends:
           rec_books = recommendation.booksgraph[friend]
           if rec_books:
              recommendation_list.add(rec_books)
        return recommendation_list

A = recommendation('A',('Neverland Land'),('B'))
B = recommendation('B',('Harry Potter', 'Master Algo'),('A'))

print A.friendsbooks()
print B.friendsbooks()
输出:

{('Harry Potter', 'Master Algo')}
{'Neverland Land'}

以下修改修复了该问题:

from collections import defaultdict

class recommendation:            
    friendsgraph =  defaultdict(set)
    booksgraph =  defaultdict(set)

    def __init__(self, user, books, friends):
        self.name = user
        self.books  = books
        self.friends = friends

        recommendation.friendsgraph[user] =  friends
        recommendation.booksgraph[user] = books


    def friendsbooks(self):
        recommendation_list = set()
        for friend in self.friends:
           rec_books = recommendation.booksgraph[friend]
           if rec_books:
              recommendation_list.add(rec_books)
        return recommendation_list

A = recommendation('A',('Neverland Land'),('B'))
B = recommendation('B',('Harry Potter', 'Master Algo'),('A'))

print A.friendsbooks()
print B.friendsbooks()
输出:

{('Harry Potter', 'Master Algo')}
{'Neverland Land'}

制作一个
User
Book
类并传递这些实例怎么样?使用这样的字符串不会使您能够遵循关系。您可以在
User
类中存储建议,作为书籍列表。创建
User
Book
类并传递这些实例怎么样?使用这样的字符串不会使您能够遵循关系。您可以在
User
类中将推荐存储为书籍列表。