Surprise实现单个Book推荐

参考网址:https://zhuanlan.zhihu.com/p/352181306

数据链接:https://pan.baidu.com/s/1JS1fTrCrZHonNsywLDLhhQ?pwd=a6uf

提取码:a6uf

 1 import pandas as pd
 2 from surprise import Dataset
 3 from surprise import Reader
 4 from surprise import SVD
 5 from surprise.model_selection import cross_validate
 6 import difflib
 7 import random
 8 
 9 # 读取数据
10 ratings_data = pd.read_csv('./data/ratings.csv')
11 books_metadata = pd.read_csv('./data/books.csv')
12 # print(ratings_data.head(10))
13 
14 # 创建Surprise数据集
15 reader = Reader(rating_scale=(1, 5))  # Reader类用于解析包含评级的文件,rating_scale用于每个评级的评级尺度。默认值为(1,5)
16 # 从panda数据帧里加载数据集,第一个参数需要包含user (raw) ids, the item (raw) ids, and the ratings,第二个参数读取文件的读取器
17 data = Dataset.load_from_df(ratings_data[['user_id', 'book_id', 'rating']], reader)
18 
19 # SVD实现
20 # verbose:输出当前epoch,默认为False
21 # n_epochs:迭代次数,默认为20
22 # n_factors:k值,默认为100
23 svd = SVD(verbose=True, n_epochs=10)
24 # 三重交叉验证对SVD模型进行了交叉验证
25 cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=3, verbose=True)
26 
27 
28 # 使用build_full_trainset 方法将交叉验证的数据集转换为一个Surprise的Trainset对象
29 # trainset = data.build_full_trainset()
30 # 可以使用fit方法在整个数据集上训练模型。
31 # svd.fit(trainset)
32 
33 # 有了一个经过训练的SVD模型,我们可以使用它来预测给定用户ID(UID)和项目/书籍ID(IID)的用户对图书的评分。
34 # print(svd.predict(uid=10, iid=100))
35 
36 def get_book_id(book_title, metadata):
37     """
38     根据元数据数据帧中最接近的匹配获取书名的图书ID。
39     """
40 
41     existing_titles = list(metadata['title'].values)
42     closest_titles = difflib.get_close_matches(book_title, existing_titles)
43     book_id = metadata[metadata['title'] == closest_titles[0]]['id'].values[0]
44     return book_id
45 
46 
47 def get_book_info(book_id, metadata):
48     """
49     给定图书id和元数据数据框架,返回有关图书的一些基本信息。
50     """
51 
52     book_info = metadata[metadata['id'] == book_id][['id', 'isbn','authors', 'title', 'original_title']]
53     return book_info.to_dict(orient='records')
54 
55 
56 def predict_review(user_id, book_title, model, metadata):
57     """
58     预测用户对某本书的评论(1-5分)。
59     """
60 
61     book_id = get_book_id(book_title, metadata)
62     review_prediction = model.predict(uid=user_id, iid=book_id)
63     return review_prediction.est
64 
65 
66 def generate_recommendation(user_id, model, metadata, thresh=4):
67     """
68     根据评分阈值为用户生成图书推荐。只有预测评分达到或高于阈值的书籍才会被推荐
69     """
70 
71     book_titles = list(metadata['title'].values)
72     random.shuffle(book_titles)
73 
74     for book_title in book_titles:
75         rating = predict_review(user_id, book_title, model, metadata)
76         if rating >= thresh:
77             book_id = get_book_id(book_title, metadata)
78             return get_book_info(book_id, metadata)
79 
80 
81 #生成一个图书推荐
82 print(generate_recommendation(1000, svd, books_metadata))

 

posted @ 2022-10-30 09:32  silvan_happy  阅读(20)  评论(0编辑  收藏  举报