2017-07-18 96 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'}