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