基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】

文章目录

    • ==有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主==
      • 项目介绍
      • 研究背景
      • 研究的目的与意义
      • 协同过滤算法
        • 基于用户的协同过滤算法定义
        • 基于物品的协同过滤算法的定义
      • 数据库设计
      • db_food(美食信息表)
      • db_collect(美食收藏表)
      • db_comment(美食评价表)
      • db_look(美食浏览记录表)
      • db_score(美食评分表)
      • db_type(美食类型表)
      • db_user(用户信息表)
      • db_userlabel(用户兴趣标签表)
      • 美食推荐系统的设计与实现
      • 需求分析
      • 主要功能用例图
      • 系统展示
      • 每文一语

有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主

项目介绍

随着网络和数字媒体的发展,在线美食平台的资源日渐丰富。如何让用户在广博的美食世界里快速找到自己喜欢的美食成为困难。针对这种现象,美食推荐系统应运而生。本文对目前使用最广泛的推荐算法——协同过滤推荐算法展开研究,并实现该算法的两种模型,即基于用户的协同过滤和基于物品的协同过滤为用户提供个性化美食推荐服务,让用户方便、快速的找到自己感兴趣的美食。系统利用爬虫技术在美食天下网中获取美食相关美食数据信息,通过协同过滤算法将相关的数据生成相应的推荐结果,可以直观形象地推荐给用户。

在这里插入图片描述

研究背景

如今,随叫随到的外卖服务非常流行。食客可以浏览在线餐厅市场,选择餐厅并预订他们喜欢的食物或饮料。但是面对网络数据的爆炸增长,使得用户难以在海量的数据中快速地找到适合自己的美食,具有一定的盲目性。通过对现有美食App的调查发现,美食数据排行过于笼统,不能有效解决用户的个人喜好等问题。针对以上问题,现阶段的市场提供个性化推荐服务、提高检索效率、优化用户体验成了广大食客的诉求。面对这一诉求,根据数据集的用户和餐厅特征,提出基于协同过滤的美食推荐系统算法,该算法结合了基于用户的推荐算法、基于美食的推荐算法。现如今,随着我们的生活水准不断提高,对吃食也有了一定的要求,然而大多时候由于其他一些因素的限制,让大众无法了解到所喜爱的饮食习惯,所以有必要设计一个美食推荐系统,记录饮食习惯,推荐匹配度最高的美食。

研究的目的与意义

本课题主要是解决美食网站的个性化推荐功能,以便准确向用户推荐感兴趣的信息。个性化推荐的主要思想是,根据用户的历史操作行为,分析用户兴趣喜好,然后把用户比较感兴趣的同时没有操作行为的物品推荐给用户。个性化推荐也可以根据用户操作行为的变化而实时分析并推荐用户喜好程度比较高的物品,这样用户会对网站产生粘性,提高用户的忠诚度,为商家带来流量,进一步提高商家利润,具有较大的商业价值,可以达到双赢的目的。

个性化推荐的基础和核心是推荐算法,推荐算法的好坏会直接影响推荐效果。目前比较流行的推荐算法是基于用户的协同过滤推荐算法、基于物品的协同过滤推荐算法、聚类算法和混合推荐算法等,这些算法的本质都是分析用户喜好进而向用户推荐最喜欢的物品,不同的算法也会有不同的侧重点和特点。

本课题研究的推荐算法是基于用户和物品的协同过滤推荐算法,基于用户的协同过滤推荐算法通过比较用户之间的操作行为,分析与目标用户操作行为最相似的若干个用户,将若干个最相似用户的喜好程度较高的物品推荐给目标用户,基于物品的协同过滤推荐算法通过比较物品之间的相关性,为用户推荐用户已经喜欢物品的相关性较高的其他物品。

协同过滤算法

协同过滤推荐算法是目前应用最广泛的个性化推荐算法。该算法的基本思想是“物以类聚,人以群分”。对于用户A,我们可以采用两种推荐方案:一是找到和用户A品味相同的用户群,把这些用户喜欢的物品推荐给A;二是以A当前喜欢的物品为参考,把和这个物品相似的物品集推荐给A。这两种解决方案分别描述的是两种模型,一种是基于用户的协同过滤(user-based),一种是基于物品(item-based)的协同过滤。

基于用户的协同过滤算法定义

基于用户的协同过滤算法,基本思想是“人以群分”,根据目标用户对物品的喜好,找到和目标用户口味相似的“邻居”用户群,再根据邻居的历史偏好对用户进行推荐,见图1-1所示。假设用户A喜欢美食A和B,用户B喜欢美食D,用户C美食音乐A ,B 和C;从这些用户的偏好信息中,我们可以发现用户A、C的喜好相似。因为用户C喜欢美食C,我们可以推断用户A很有可能也喜欢,可以将美食C推荐给用户A。

在这里插入图片描述
根据用户历史行为信息构建用户-物品评分矩阵。
在这里插入图片描述

根据用户-物品评分矩阵计算用户之间的相似度
计算相似度常用的方法有余弦算法、修正余弦算法、皮尔森算法等等,本物品采用余弦算法。余弦算法公式如下所示:

在这里插入图片描述
表示:(用户u对物品i的评分用户v对物品i的评分)之和/(用户u对物品i的评分的平方之和再开方)(用户v对物品i的评分的平方之和再开方)

根据用户之间的相似度得到目标用户的最近邻居KNN

KNN的筛选常用的有两种方式,一种是设置相似度阀值,给定一个相似度的下限,大于下限的相似度为最近邻居,一种是根据与目标用户相似度的高低来选择前N个最近邻居,本次物品以前N个为例,相似度排序采用经典冒泡排序法。

预测物品评分并进行推荐

计算公式如下所示:

在这里插入图片描述在这里插入图片描述

基于物品的协同过滤算法的定义

而基于物品的协同过滤算法(Item-basing CF)根据物品考虑问题,但算法本身并不是根据物品本身的特性来判断物品之间的相似性,而是通过用户行为来判断物品之间的相似性。如图 2 所示,用户 A 和用户 C 首选的物品中的公共物品是物品 A 和物品 D。根据算法本身的原理,可以得到 A 项与 D 项相似,因此与 A 项相似的 D 项可以在用 户 B 喜欢 A 项时相对推荐。

在这里插入图片描述1.根据用户历史行为信息构建物品-用户评分矩阵。
2.根据物品-用户评分矩阵计算用户之间的相似度。
计算相似度常用的方法有余弦算法、修正余弦算法、皮尔森算法等等,系统采用余弦算法。余弦算法公式如下所示:
在这里插入图片描述
在这里插入图片描述

性能:适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大。
领域:时效性较强,用户个性化兴趣不太明显的领域。
实时性:用户有新行为,不一定造成推荐结果的立即变化。

冷启动:在新用户对很少的物品产生行为后,不能立即对它进行个性化推荐,因为用户相似度表示每隔一段时间离线计算的。新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户。
推荐理由:很难提供令用户信服的推荐解释。

2.3.2 基于物品

性能:适用于物品数明显小于用户数的场合,如果物品很多,计算物品的相似度矩阵代价很大。
领域:长尾物品丰富,用户个性化需求强烈的领域。
实时性:用户有新行为,一定会导致推荐结果的实时变化。

冷启动:新用户只要对一个物品产生行为,就可以给它推荐和该物品相关的其它物品。但没有办法在不离线更新物品相似度表的情况下将新的物品推荐给用户。
推荐理由:利用用户的历史行为给用户做推荐解释,可以令用户比较信服。

推荐算法常见问题及解决方案

冷启动问题

冷启动问题一直是协同过滤算法需要面对的问题,指的是用户刚进入系统,并没有历史行为或历史行为较少(本系统体现在对美食的评分)。根据公式我们可以看出计算出来的相似度很低,几乎没有参考价值。而推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣。

数据稀疏性问题

数据的稀疏性则是在系统搭建的初期用户很少,协同过滤的第一步是建立用户与美食的矩阵来表示。这看上去很简单,但在实际的系统中许多美食推荐系统要对巨大的信息流进行统计。而用户在系统中涉及到的物品(美食)不到系统的百分之一。因此照成形成的矩阵很稀疏。这样计算出来的相似度很难确定邻居用户集,也会极大的损耗计算性能。推荐的效果也会很低。例如用户之间的传递性缺失,如A与B用户的相似度高,B与C相似度也很高,但A与C又没有很多共同的美食评分(交集),那么判断A与C之间的关联度不高,这样会降低推荐的效果。

根据现有的技术,本系统采用了让新加入系统的用户先选择自己喜欢的分类,先根据分类的标签推荐用户,等用户具有历史操作后再给用户使用协同过滤推荐算法推荐,能解决用户的冷启动问题。

数据库设计

在这里插入图片描述
在这里插入图片描述

db_food(美食信息表)

列名说明数据类型长度主键外键非空
id编号int20
foodname美食名称varchar20
foodtypeid美食类型编号int20
image图片varchar255
material食材varchar255
content简介text
createtime添加时间varchar255

db_collect(美食收藏表)

列名说明数据类型长度主键外键非空
id编号int20
userid用户编号int20
foodid美食编号int20
createtime添加时间varchar255

db_comment(美食评价表)

列名说明数据类型长度主键外键非空
id编号int20
userid用户编号int20
foodid美食编号int20
content评论内容text
createtime添加时间varchar255

db_look(美食浏览记录表)

列名说明数据类型长度主键外键非空
id编号int20
userid用户编号int20
foodid美食编号int20
createtime添加时间varchar255

db_score(美食评分表)

列名说明数据类型长度主键外键非空
id编号int20
userid用户编号int20
foodid美食编号int20
score美食评分int20
createtime添加时间varchar255

db_type(美食类型表)

列名说明数据类型长度主键外键非空
id编号int20非空
typename美食类型名称varchar255

db_user(用户信息表)

列名说明数据类型长度主键外键非空
id编号int20
username用户名varchar20
password密码varchar20
header头像varchar255
gender性别int20
age年龄int20
phone电话varchar255
email邮箱varchar255
lastlogintime最近登录时间varchar255
state用户账号状态int20
createtime注册时间varchar255

db_userlabel(用户兴趣标签表)

列名说明数据类型长度主键外键非空
id编号int20
userid用户编号int20
foodtypeid美食编号int20
createtime添加时间varchar255

美食推荐系统的设计与实现

在这里插入图片描述

(1) PythonDjangoProject,这个是项目名称

(2) PythonDjangoProject下的PythonDjangoProject是项目全局配置文件夹,该文件夹是项目自动生成的,相当于项目容器。

init.py,这个文件是生成的空文件,用它标识一个目录为Python的标准包即模块包,如果没有那么他所在的文件夹就是个普通的文件夹不能被其他模块导入。目前我们已经在里边添加了安装mysql数据库插件模块的代码。

asgi.py,Django3.0版本新出的异步功能。

settings.py,Django 项目的配置文件,包括 Django 模块应用配置,数据库配置,模板配置等。

urls.py,Django 项目的 URL 声明。django下所有的页面都需要在该urls文件中配置一下,否则在访问的时候会找不到该文件。

wsgi.py,全称是 webserver getway interface,即Web服务器的网关接口,是python应用与Web服务器交互的接口,一般不需要做任何修改。

(3) manage.py,manage.py文件位于整个物品的最外层,是该项目的项目管理器,它提供了很多的命令用来管理该项目,在终端中可以查看它提供的所有命令,可通过输入:python manage.py 查看其命令,项目的启动其实也是通过manage.py文件的命令。

(4) MyDjango,是应用程序文件夹。

migrations是用于记录 models 中数据的变更。init.py是生成的空文件。0001_initial.py是在执行python manage.py makemigrations命令时生成的。

init.py,是生成的空文件。

admin.py,映射 models 中的数据到 Django 自带的 admin 后台。

apps.py,用于应用程序的配置。

models.py:创建应用程序数据表模型(对应数据库的相关操作)。

tests.py:创建 Django 测试。单元测试。

views.py,控制向前端显示哪些数据。

需求分析

1、游客:该类用户打开平台后,可以浏览美食信息、搜索美食,并在首页看到美食热点推荐结果(根据美食总评分和总收藏数量降序推荐),同时可以进行注册、登录操作。

2、登录用户:该类用户在浏览美食信息时,会有多个推荐方式为其进行个性化推荐美食,还可以添加兴趣标签,对美食进行收藏、评论、评分操作,并且同时查看美食的收藏、评论、评分情况,注销账号。在个人中心里,可以查看修改个人账号相关信息,管理个人的美食浏览记录,修改兴趣标签,查看并操作个人的美食收藏、评论、评分数据。

3、管理员:可以查看修改个人账号信息;查看和删除用户信息、用户选择喜好便签信息、用户浏览记录,对所有用户进行收藏管理、评论管理、评分管理,增删改美食类型信息、美食信息,同时会对数据进行统计。

4、个性化推荐功能:热点榜单(查询浏览数量最多的美食,同时不包括当前登录用户浏览过的美食);基于用户的协同过滤推荐算法(根据评分数据),如果没有推荐结果,采用热点推荐(根据登录用户兴趣标签下的美食的总评分降序推荐,同时是登录用户没有评分的);基于物品的协同过滤推荐算法(根据收藏数据),如果没有推荐结果,采用热点推荐(根据登录用户兴趣标签下的美食的收藏数量降序推荐,同时是登录用户没有收藏的)。

根据功能描述的内容,美食平台划分成以下模块:平台基本功能、个性化推荐、基本信息管理。每一个大的模块又可以划分成许多小模块

在这里插入图片描述
在系统功能模块的树状结构图中,每一个叶子节点都是一个最小的功能模块,每个功能模块都需要对数据库中不同的表进行操作,如查看、修改、删除、添加数据。

在这里插入图片描述
流程图展示了用户在使用系统时的工作过程。

说明:当浏览者进入该平台时,先以游客的身份使用平台功能。当游客要对一些受限的权限操作时。平台会提示游客是否要登录平台或注册为平台用户。当登录验证成功或注册成功后,游客就会变成平台用户并可以享有更多的权限。当平台用户退出系统后又变成了游客的身份。

主要功能用例图

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

爬虫代码部分展示

# 爬取美食列表
    def getFoods(self, type, param):
        try:
            # https://home.meishichina.com/recipe/recai/  第一页
            # https://home.meishichina.com/recipe/recai/page/2/
            # 分页查询当前美食类型下的美食,从第一页开始
            currentPage = 0
            # 每种类型下爬取的美食数量,临时变量
            foodCountTemp = self.foodCount
            endFlag = False  # 每种类型下爬取美食结束标志
            # 遍历
            while True:
                # 每页10条数据
                currentPage = currentPage + 1
                # 定义url
                fullUrlTemp = None
                # 如果是第一页,排序hot:最热,空:最新
                if currentPage == 1:
                    fullUrlTemp = self.base_url + "recipe/" + param
                else:
                    fullUrlTemp = self.base_url + "recipe/" + param + "/page/" + str(currentPage) + "/"
                print("爬取美食类型:【%s" % type.get("foodtypename") + "】第【" + str(currentPage) + "】页开始")
                print("链接地址:" + fullUrlTemp)
                # 反爬虫技术,所以不能一直爬取,休息一会
                Util().getRandomSleep()
                # 爬取数据
                resp = requests.get(fullUrlTemp, headers=self.headers)
                resp.encoding = "utf-8"
                # 使用bs4模块解析html数据
                soup = BeautifulSoup(resp.text, 'lxml')
                # 解析出美食列表
                foodListDiv = soup.find(id="J_list")
                foodList = foodListDiv.find_all("li")
                # 遍历美食列表
                for foodTemp in foodList:
                    # 定义美食对象
                    item = dict()
                    item["type"] = type

系统展示

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

每文一语

每一次的学习都是不断地进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/871000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes】k8s集群图形化管理工具之rancher

目录 一.Rancher概述 1.Rancher简介 2.Rancher与k8s的关系及区别 3.Rancher具有的优势 二.Rancher的安装部署 1.实验准备 2.安装 rancher 3.rancher的浏览器使用 一.Rancher概述 1.Rancher简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实…

【Linux网络】select函数

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 select函数介绍select函数参数介绍select函数返回值select的工作流程TCP服务器【多路复用版】 select函数介绍 在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术&#xff0…

基于springboot的车辆违章信息管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

鸿萌数据恢复服务:SQL Server 中的“PFS 可用空间信息不正确”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时,鸿萌是国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商,为专…

RK3568笔记五十六:yolov8_obb旋转框训练部署

若该文为原创文章,转载请注明原文出处。 本文基于rknn_model_zoo和山水无移大佬的博客和代码训练模型并部署到正点原子的ATK-DLRK3568板子测试。 https://github.com/ultralytics/ultralytics 一、训练 1、环境搭建 使用的是AUTODL环境,yolov8-obb数据集不大,也可以使用c…

歌曲爬虫下载

本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来!!!废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…

代码块分类

局部代码块 public class Test {public static void main(String[] args) {{int a 10;}// 执行到此处时候,变量a已经从内存中消失了。 // System.out.println(a);} } 构造代码块 public class Test {private String name;private int age;{// 构造代码块System.out.…

c#实现数据导出为PDF的方式

PdfSharp vs iTextSharp: C#中PDF导出功能比较 PdfSharp 优点 轻量级:适合简单的PDF生成任务易于学习:API相对简单,学习曲线较缓开源:提供开源版本,可自由使用和修改纯C#实现:不依赖外部库或COM组件支持…

C:每日一练:单身狗(2.0版本)

前言: 今天在刷题的时候突然看到一道题,疑似一位故题。仔细一看,欸!这不是就是单身狗的升级版吗?我想那必须再安排一篇,不过由于本篇文章与上一篇单身狗文章所涉及的知识点基本相同,所以还请大…

设计模式在芯片验证中的应用——状态

一、状态模式 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在RTL中可能存在复杂的有限状态机FSM,在任何一个特定状态中, RTL的行为都不相同,…

【前缀和算法】--- 一维和二维前缀和模板

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…

【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用

文章目录 局域网 LAN广域网 WAN网络中的重要概念IP 地址端口号 认识协议协议分层是什么OSI 七层网络模型TCP/IP 五层网络模型(或四层)物理层传输层网络层数据链表层应用层网络设备所在分层 封装和分用[站在发送方视角](封装)[站在…

邮票孔拼版制作方法

邮票孔拼版制作方法 拼版后的局部图:(中间用连接桥的方式,此方式能最少程度上减少残留) 2)拼版后的效果图 3)邮票孔拼版规则: 拼板与板间距1.2MM或者1.6MM 等邮票孔:8个0.55MM的孔,孔间距0.2MM加两排,邮票孔伸到…

linux服务 学习

服务(Service) 在Linux操作系统中,服务(Service)是一个基本概念,它通常指的是运行在后台的、持续提供特定功能或资源给系统内部组件或者网络上的客户端程序。 这些服务是系统正常运行和提供各种功能的关键…

【三维重建汇总】NeRF和GS重建中,如何排除干扰物?(提升质量)

汇总最近NeRF与GS提升质量的论文 文章目录 前言一、NeRF On-the-go:利用不确定性落地真实世界(CVPR24)摘要1.DINOv2特征的不确定性预测2.NeRF中干扰物去除的不确定性3.优化4. Dilated Patch 扩大采样5.实验结果 二、Pixel-GS:像素感知的梯度密…

关于nginx标准配置参数介绍

标准配置参数: user root;#配置用户或者组,默认为nobody worker_processes 4;#允许生成的进程数,默认为1 项目中nginx.conf配置文件 user root; worker_processes 4; //最大的进程数,要看服务器的内核是多少核的&#xff0…

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑,提示如下,但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…

解决k8s分布式集群,子节点加入到主节点失败的问题

1.问题情况 Master主节点在 使用 kubeadm init 成功进行初始化后,如下所示 Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/k…

【Qt】 常用控件QLCDNumber

常用控件QLCDNumber QLCDNumber是一个专门用来显示数字的控件,类似于“老式计算机”的效果。 QLCDNumber的属性 属性说明 intValue QLCDNumber 显⽰的数字值(int). value QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, i…

玩转单例模式

目录 1. 饿汉式 2. 懒汉式 3. volatile解决指令重排序 4. 反射破坏单例模式 5. 枚举实现单例模式 6. 枚举实现单例模式的好处 7. 尝试反射破坏枚举 8. CAS实现单例模式 所谓单例模式,就是是某个类的实例对象只能被创建一次,单例模式有多种实现方…