python图书推荐系统 爬虫技术 大数据 协同过滤推荐算法 计算机 毕业设计(附源码)✅

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、源码获取方式

🍅**由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。**🍅

**点赞、收藏、关注,不迷路,**上方查看**👇🏻*获取联系方式*👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知源书院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值