基于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.foodCountendFlag = False  # 每种类型下爬取美食结束标志# 遍历while True:# 每页10条数据currentPage = currentPage + 1# 定义urlfullUrlTemp = None# 如果是第一页,排序hot:最热,空:最新if currentPage == 1:fullUrlTemp = self.base_url + "recipe/" + paramelse: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

系统展示

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

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

每文一语

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse打开失败 java was started but returned exit code=13

报错详细信息如下 原因:eclipse版本和jdk版本不一致。系统之前jdk是1.6,然后安装1.8之后默认修改了环境变量。导致eclipse启动失败 解决方案:修改eclipse目录下的eclipse.ini文件增加一下内容。文档说明:eclipse.ini - Eclipsepe…

还在用Hexo吗?来试试Gatsby搭建一个网站吧!

本文首发于个人博客网站:http://www.blog.lekshome.top/2024/08/20/shi-yong-gatsby-da-jian-ge-ren-wang-zhan/由于CSDN并不是本人主要的内容输出平台,所以大多数博客直接由md文档导入且缺少审查和维护,如果存在图片或其他格式错误可以前往上…

Halcon灰度图像的形态学运算

Halcon灰度图像的形态学运算 本文介绍的算子的输入类型是灰度的Image图像。 1. 灰度图像与区域的区别 基于区域的形态学运算与基于灰度图像的形态学运算的根本区别在于,二者输入的对象不同。前者输入的是一些区域,并且这些区域是经过闽值处理的二值图…

一文搞懂大模型在多GPU环境的分布式训练!

随着大模型时代的到来,模型参数量、训练数据量、计算量等各方面急剧增长。大模型训练面临新的挑战: 显存挑战:例如,175B的GPT-3模型需要175B*4bytes即700GB模型参数空间,而常见的GPU显存如A100是80G显存,这…

visual studio使用技巧:快速生成Json、XML对应类

visual studio快速生成Json、XML对应类 在项目中经常用到json或者xml作为配置文件,进行序列化和反序列化就需要有对应的类,重新写一遍类就比较麻烦,这里就讲一下通过visual studio快速生成json或者xml对应类型的方法。 自动生成Json类 复制…

图像数据处理17

四、形态学图像处理 4.3 开运算与闭运算 4.3.1开运算与闭运算的定义: 开运算:先腐蚀,再膨胀 闭运算:先膨胀,再腐蚀 记忆方法:膨胀(胀开)所以开运算最后对应的结果是膨胀&#x…

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

目录 前言: 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…

springsecurity 登录认证一(ajax)

一、准备工作 1.1 导入依赖 因springboot 3.0 以上版本只能支持java17 顾使用2.5.0 版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><…

网络工程3(子网通信,为什么要使用mac和ip)

文章目录 一. 子网如何通讯1. 子网内部通信2. 子网外部通信 二. 交换机和路由器的连接三. 为什么不只使用mac地址或ip地址进行网络通信1. 首先要明确的是&#xff0c;不管是只用mac或只用ip通信 四. 子网设备如何获得ip五. 不同网段的主机无法直接通信的原因 一. 子网如何通讯 …

音频矩阵主要功能及常规路数配置有哪些

音频矩阵&#xff0c;又称AUDIO矩阵或音频矩阵切换器&#xff0c;是一种用于管理和控制多个音频信号的设备。它具备多种功能&#xff0c;主要可以概括为以下几个方面&#xff1a; 一、主要功能 信号切换&#xff1a; AUDIO128128音频矩阵能够将多个音频源的信号输入到设备中&…

Python实现水果忍者(开源)

一、整体介绍&#xff1a; 1.1 前言&#xff1a; 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动&#xff0c;优化并增加了一些功能。作为自己Python阶段学习的结束作品&#xff0c;文章最后有源码链接。 1.2 Python主要知识&#xff1a; &#xff08;1&#xf…

怎么选开放式耳机好?精选五款物超所值机型推荐!

耳机已成为我们日常生活中的常见伙伴&#xff0c;无论是听音乐、玩游戏还是看剧&#xff0c;都离不开它。市场上耳机品牌和款式众多&#xff0c;找到一款真正适合自己的并不容易。尤其是长时间佩戴传统入耳式耳机可能会感到耳朵不舒服或闷热。开放式耳机因其非侵入式设计&#…

运维学习————Linux环境下Tomcat的部署

目录 一、环境准备 二、 启动测试 三、访问端口修改 四、部署web项目 1、材料准备 2、部署 2.1、上传war包到webapps目录下 2.2、修改项目配置 2.3、浏览器访问 引申 一、环境准备 tomcat安装包&#xff1a;apache-tomcat-9.0.52 JDK环境&#xff1a; 我使用的y…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

LeetCode.80.删除有序数组中的重复项II

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间…

idea 修改背景图片教程

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明修改背景图片 开篇说明 给小白看得懂的修改图片教程&…

物流抓取机器人整体设计方案

一、功能简介 1、运行环境&#xff1a;巡线行驶&#xff08;7路数字循迹&#xff0c;麦克纳姆轮车底盘&#xff09; 2、目标识别&#xff1a;颜色识别&#xff08;Maix-II Dock 视觉模块&#xff09; 3、目标定位&#xff1a;视觉测距&#xff08;Maix-II Dock 视觉模块&#x…

【RPA学习天地:财务网银RPA方案】各银行网银(工行、招行、苏州银行等)流水和回单下载

RPA学习天地&#xff08;https://www.rpa-learning.com/&#xff09; 前言&#xff1a; 自 2021 年起&#xff0c;RPA 学习天地已成功为来自各个行业的数千名学员赋予了 RPA 技能。通过对众多学员在自动化需求方面的深入探究&#xff0c;我们发现财务的资金领域中与网银相关的…

【iOS】—— JSONModel

JSONModel源码 1. JSONModel介绍2. JSONModel的其他用法2.1 转换属性名称2.2 自定义错误 3. 源码分析3.1 - (id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err3.2 JSONModel持有的数据3.3 load3.4 JSONModel的init方法3.5 __inspectProperties方法3.6 JSONMode…

8月19日笔记

http隧道搭建(续) ABPTTS安装使用 一款基于 SSL 加密的 HTTP 端口转发工具&#xff0c;全程通信数据加密&#xff0c;比 reGerog 都要稳定。使用 python2 编写&#xff0c;但是该工具只支持 aspx 和 jsp 脚本的网站。 下载地址&#xff1a;https://github.com/nccgroup/ABPTT…