2017-07-18 7 views
0

Ich versuche ein einfaches Empfehlungssystem zu erstellen, das Benutzern die Bücher empfiehlt, die ihre Freunde lesen. Ich habe eine Klasse namens "Empfehlung" erstellt, die Nutzerdetails wie Name, Freunde des Benutzers, Bücher des Benutzers und empfohlene Bücher (Bücher von Freunden) erfasst. Jetzt ist das Problem, wenn die Instanz von Benutzer 'A' erstellt wird, 'Die Liste der empfohlenen Bücher von A ist leer, da sein Freund' B 'noch nicht instanziiert wurde. Wenn 'B' instanziiert wird, hat 'A' immer noch keine Ahnung von Bs Büchern, da 'A' vor 'B' instanziiert wurde. Gibt es eine Möglichkeit, das zu beheben?Erstellen eines einfachen Empfehlungssystems in 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')) 

Eine Möglichkeit, dies zu umgehen ist Wörterbücher von Freunden und Bücher als Attribute zu übergeben, und schreiben Sie eine separate Methode, die Bücher empfehlen. Auf diese Weise wird jeder Benutzer seine Freunde und ihre Bücher zum Zeitpunkt der Instanziierung kennen. Diese Strategie hat jedoch die Möglichkeit zur Folge, Attribute einzelnen Benutzern zuzuweisen (z. B. A.recommended_books).

class recommendation:    

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

Was eine 'User' und' Book' Klasse zu machen und diese Instanzen passieren um? Wenn Sie Strings wie diese verwenden, können Sie den Beziehungen nicht folgen. Sie können Empfehlungen in der Klasse "Benutzer" nur als eine Liste von Büchern speichern. – Grimmy

Antwort

0

Eine schnelle 5 Mockup min eine Alternative zu zeigen:

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()) 

Ausgänge:

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

Es tut ein bisschen komplizierter, die Anfangsdaten hinzufügen, aber Sie werden finde es heraus. Es gibt definitiv Verbesserungen, die gemacht werden können.

0

Folgende Änderungen das Problem behoben:

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() 

Ausgang:

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