2017-07-18 77 views
0

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

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.recommended_books)。

class recommendation:    

    def __init__(self): 
     self.friendsgraph = defaultdict(set) 
     self.booksgraph = defaultdict(set) 
+0

有关使'User'和'Book'类,并绕过这些情况怎么办?使用这样的字符串不会使你能够遵循关系。你可以在'User'类中存储建议,只是一本书的列表。 – Grimmy

回答

0

快速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} 

它得到一个比较复杂一点添加的初始数据,但你想办法。肯定有可以改进的地方。

0

以下修改解决了该问题:

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'}