python图书推荐系统 爬虫技术 大数据 协同过滤推荐算法 计算机 毕业设计(附源码)✅
1、项目介绍
技术栈:
Django框架、requests爬虫、协同过滤推荐算法、MySQL数据库
2、项目界面
(1)图书数据浏览
(2)图书数据详情页
(3)图书推荐
(4)我的图书评分记录
(5)后台管理系统
(6)注册登录界面
(7)数据爬取
3、项目说明
图书推荐系统是一种基于用户兴趣和行为的智能推荐系统,旨在为用户提供个性化的图书推荐。该系统通过分析用户的历史阅读记录、收藏行为、评分等信息,结合协同过滤推荐算法,为用户推荐他们可能感兴趣的图书。
在系统的后端开发中,常用的技术框架是Django。Django是一个使用Python语言开发的高级Web框架,它提供了一套完善的工具和库,用于快速构建高性能的Web应用程序。使用Django框架可以方便地处理用户请求、管理数据库、实现用户认证和授权等功能。
为了获取图书的相关信息,推荐系统需要进行数据爬取。requests是一个常用的Python库,它可以发送HTTP请求并获取响应内容。通过requests库,我们可以编写爬虫程序,从各大图书网站上获取图书的基本信息、评论、评分等数据。
协同过滤推荐算法是图书推荐系统中常用的算法之一。该算法基于用户的历史行为和其他用户的行为进行推荐。它通过计算用户之间的相似度,找到与目标用户兴趣相似的其他用户,然后根据这些用户的行为推荐给目标用户可能感兴趣的图书。
图书推荐系统通常使用MySQL等关系型数据库来存储用户数据、图书信息和推荐结果等。MySQL是一种开源的关系型数据库管理系统,它具有高性能、可靠性和可扩展性的特点,非常适合用于存储和管理大量的数据。
综上所述,图书推荐系统使用Django框架进行后端开发,使用requests库进行数据爬取,采用协同过滤推荐算法进行个性化推荐,并使用MySQL数据库进行数据存储。
4、核心代码
# -*-coding:utf-8-*-
import os
import django
from user.models import *
from math import sqrt, pow
import operator
from itertools import chain
os.environ["DJANGO_SETTINGS_MODULE"] = "book.settings"
django.setup()
# 提前加载构建评分矩阵
def build_user_map():
all_user = {}
users = User.objects.all()
for user in users:
rates = user.rate_set.all()
rate = {}
# 用户有给图书打分,包装成字典的形式
if rates:
for i in rates:
rate.setdefault(str(i.book.id), i.mark)
all_user.setdefault(user.username, rate)
else:
# 用户没有为图书打过分,设为0
all_user.setdefault(user.username, {})
print("this is all user:", all_user)
return all_user
all_user = build_user_map()
class UserCf:
# 获得初始化数据
def __init__(self, data):
self.data = data
# 通过用户名获得图书列表,仅调试使用
def getItems(self, username1, username2):
return self.data[username1], self.data[username2]
# 计算两个用户的皮尔逊相关系数
def pearson(self, user1, user2): # 数据格式为:商品id,评分
# print("user message", user1)
sumXY = 0.0
n = 0
sumX = 0.0
sumY = 0.0
sumX2 = 0.0
sumY2 = 0.0
# print(user1.items())
for item, score1 in user1.items():
if item in user2.keys(): # 计算公共的商品评分
n += 1
sumXY += score1 * user2[item]
sumX += score1
sumY += user2[item]
sumX2 += pow(score1, 2)
sumY2 += pow(user2[item], 2)
if n == 0:
# print("p氏距离为0")
return 0
molecule = sumXY - (sumX * sumY) / n
denominator = sqrt((sumX2 - pow(sumX, 2) / n) * (sumY2 - pow(sumY, 2) / n))
if denominator == 0:
# print("共同特征为0")
return 0
r = molecule / denominator
# print("p氏距离:", r)
return r
# 计算与当前用户的距离,获得最临近的用户
def nearest_user(self, username, n=1):
# 距离字典
distances = {}
# 用户,相似度
# 遍历整个数据集
for user, rate_set in self.data.items():
# 非当前的用户
if user != username:
distance = self.pearson(self.data[username], self.data[user])
# 计算两个用户的相似度
distances[user] = distance
# 相似度
closest_distance = sorted(
distances.items(), key=operator.itemgetter(1), reverse=True
)
# 最相似的N个用户
m = 0
for i in range(len(closest_distance)):
if closest_distance[i][1] != 0:
m += 1
if m != 0:
return closest_distance[:m]
else:
return closest_distance[:n]
# 给用户推荐商品,username是当前用户,n是最近邻的个数
def recommend(self, username, n=1):
recommend = {}
nearest_user = self.nearest_user(username, n)
# print(nearest_user)
for user, score in dict(nearest_user).items(): # 最相近的n个用户
for item, scores in self.data[user].items(): # 推荐的用户的图书的列表
if item not in self.data[username].keys(): # 当前username没有看过
if item not in recommend.keys(): # 添加到推荐列表中
recommend[item] = scores
# 对推荐的结果按照商品评分返回
return sorted(recommend.items(), key=operator.itemgetter(1), reverse=True)
def recommend_by_user_id(user_id):
current_user = User.objects.get(id=user_id)
# print("我是当前用户")
print(current_user.rate_set.count())
# 如果当前用户没有打分 则按照热度顺序返回
if current_user.rate_set.count() == 0:
book_list = Book.objects.all().order_by("-book_pl")[:15]
return book_list
# users = User.objects.all()
# # 构建评分矩阵
# all_user = {}
# for user in users:
# rates = user.rate_set.all()
# rate = {}
# # 用户有给图书打分,包装成字典的形式
# if rates:
# for i in rates:
# rate.setdefault(str(i.book.id), i.mark)
# all_user.setdefault(user.username, rate)
# else:
# # 用户没有为图书打过分,设为0
# all_user.setdefault(user.username, {})
# print("this is all user:", all_user)
user_cf = UserCf(data=all_user)
recommend_list = user_cf.recommend(current_user.username, 15)
# print("fdfdsfdsf")
# print(recommend_list)
good_list = [each[0] for each in recommend_list]
books_qu = Book.objects.all().filter(id=good_list[0])
for i in range(1, len(good_list)):
books_qu = books_qu | Book.objects.all().filter(id=good_list[i])
# print(type(books_qu))
return books_qu
# rec(1)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
🍅✌**感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目代码以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!**🍅✌
5、源码获取方式
🍅**由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。**🍅
**点赞、收藏、关注,不迷路,**上方查看**👇🏻*获取联系方式*👇🏻