基于Jaccard算法的用户浏览历史推荐商品系统实战+springboot+vue源码实现

大家好,这里是小罗毕设工作室。今天给大家带来了一套完整的推荐系统: “基于Jaccard算法的用户浏览历史推荐商品系统”。 系统源码后端实现是springboot,前端是vue3。 

视频演示

基于Jaccard算法的用户浏览历史推荐商品系统实战

图片截图

算法原理介绍

假设我们有两个商品:商品A和商品B。商品A被用户{小明,小红,小张}浏览过,商品B被用户{小红,小张,小李}浏览过。

得到两个用户群体集合 : {小明,小红,小张}    {小红,小张,小李}  。

我们通过Jaccard算法,将两个集合先取交集得到 {小红,小张} ,大小是2 , 在取并集得到 {小明,小红,小张,小李},大小是4。

因此Jaccard相似度=2/4=0.5,这个值表示两个商品的相似程度,值越接近1表示两个商品越相似(被相同用户群体浏览),系统会优先推荐相似度高的商品。

实现流程

基础数据准备

首先我们需要准备用户的行为数据表:

CREATE TABLE `user_behaviors` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '行为ID,自增主键',`user_id` bigint NOT NULL COMMENT '用户ID',`item_id` bigint NOT NULL COMMENT '物品ID',`rating` decimal(3,1) DEFAULT NULL COMMENT '评分(1-5分)',`behavior_type` varchar(20) NOT NULL COMMENT '行为类型(VIEW-浏览,LIKE-喜欢,PURCHASE-购买)',`timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '行为发生时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用户行为记录表';

之所以这里有评分字段,是因为后续要扩展 基于协同过滤算法的用户评分推荐系统

当然这里还要有用户表和商品表:

CREATE TABLE `items` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '物品ID,自增主键',`name` varchar(200) NOT NULL COMMENT '物品名称',`description` text COMMENT '物品描述',`category` varchar(50) DEFAULT NULL COMMENT '物品类别',`price` decimal(10,2) DEFAULT NULL COMMENT '物品价格',PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='商品表';CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID,自增主键',
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) NOT NULL COMMENT '用户邮箱',
`password` varchar(100) NOT NULL COMMENT '用户密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB  COMMENT='用户表';

表建立好之后,我们需要写好基本的用户登录,商品列表,商品详情等基础接口,然后保证有丰富的行为数据落库,这样推荐系统才能发挥作用。

这些基本的接口我就不讲了,主要讲解一下用户推荐接口的实现。

完整系统源码我已经整理清除:

gitcode巅抗目/hadluo2/springboot_vue.git

用户推荐接口的实现

我将代码的流程整理成了一个流程图,首先我们需要构造一个Map结构数据:

 这些数据就是查询用户行为表,将所有的行为数据,按照商品分类,每一个商品都对应了一个用户群体集合。

然后还是查询用户行为表 , 将当前用户的行为数据查询出来,进行下面流程:

 关键的核心点就是:将当前推荐用户买过的商品id对应其他也买过的这个商品的用户作为一个用户集合,然后取所有商品对应的用户群体集合(很多个),然后一个一个经过Jaccard算法计算相似度,把这个相似度最为评分,最后取出评分高的商品最为推荐商品。

讲到这里,你应该能懂了,下面看下关键代码实现:


/**完整代码实现:gitcode巅抗目/hadluo2/springboot_vue.git* 基于用户浏览历史推荐物品* 主要步骤如下:* 1. 获取用户最近的浏览记录,按时间倒序排列* 2. 获取所有用户的浏览记录,构建物品-用户倒排索引* 3. 计算用户最近浏览物品与其他物品的相似度* 4. 考虑时间衰减因素,为每个候选物品计算最终得分* 5. 返回得分最高的N个物品作为推荐结果* @param userId 用户ID* @param numRecommendations 推荐数量* @return 推荐的物品列表*/
public List<Item> recommendBasedOnBrowsingHistory(Long userId, int numRecommendations) {// 1. 获取用户最近的浏览记录// 创建查询条件:匹配用户ID和浏览行为,按时间戳降序排序LambdaQueryWrapper<UserBehavior> wrapper = new LambdaQueryWrapper<>();wrapper.eq(UserBehavior::getUserId, userId).eq(UserBehavior::getBehaviorType, "VIEW").orderByDesc(UserBehavior::getTimestamp);List<UserBehavior> userViews = userBehaviorRepository.selectList(wrapper);// 如果用户没有浏览记录,返回空列表if (CollectionUtils.isEmpty(userViews)) {return Collections.emptyList();}// 2. 获取所有用户的浏览记录// 查询所有用户的浏览行为,用于后续计算物品相似度List<UserBehavior> allViews = userBehaviorRepository.selectList(new LambdaQueryWrapper<UserBehavior>().eq(UserBehavior::getBehaviorType, "VIEW"));// 3. 构建物品-用户的倒排索引// key: 物品ID, value: 浏览过该物品的用户ID集合Map<Long, Set<Long>> itemUserMap = new HashMap<>();for (UserBehavior view : allViews) {// computeIfAbsent: 如果key不存在,则创建一个新的HashSetitemUserMap.computeIfAbsent(view.getItemId(), k -> new HashSet<>()).add(view.getUserId());}// 4. 计算物品相似度和推荐得分// 存储每个候选物品的最终得分Map<Long, Double> itemScores = new HashMap<>();// 获取用户已浏览过的物品ID集合,用于排除推荐Set<Long> userViewedItemIds = userViews.stream().map(UserBehavior::getItemId).collect(Collectors.toSet());// 遍历用户的每个浏览记录for (UserBehavior userView : userViews) {// 获取 浏览该物品的 所有用户Set<Long> itemUsers = itemUserMap.get(userView.getItemId());if (itemUsers == null) continue;// 遍历所有物品,计算与当前浏览物品的相似度for (Map.Entry<Long, Set<Long>> entry : itemUserMap.entrySet()) {Long otherItemId = entry.getKey();// 该用户浏览过了这个商品id, 直接排除if (userViewedItemIds.contains(otherItemId)) continue;// 浏览过这个商品的 其他用户Set<Long> otherItemUsers = entry.getValue();// 使用Jaccard相似度计算物品相似度// Jaccard相似度 = 两个集合的交集大小 / 并集大小//完整代码请见:gitcode巅抗目/hadluo2/springboot_vue.gitdouble similarity = calculateJaccardSimilarity(itemUsers, otherItemUsers);// 考虑时间衰减因素   相当于一个优化因子// 浏览时间越近,权重越大(1/1, 1/2, 1/3, ...)//完整代码请见:gitcode巅抗目/hadluo2/springboot_vue.git// 累加相似度得分(考虑时间权重)itemScores.merge(otherItemId, similarity * timeWeight, Double::sum);}}// 5. 生成推荐结果// 对候选物品按得分降序排序,选择前N个return itemScores.entrySet().stream().sorted(Map.Entry.<Long, Double>comparingByValue().reversed()).limit(numRecommendations).map(e -> itemRepository.selectById(e.getKey())).filter(Objects::nonNull).collect(Collectors.toList());
}

 代码只贴了部分,原理已经教给大家。

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

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

相关文章

正态分布和幂律分布

1. 背景与引入 正态分布 历史来源&#xff1a;18世纪由高斯&#xff08;Gauss&#xff09;在研究测量误差时提出&#xff0c;后被广泛应用于自然现象和社会科学的数据建模。重要性&#xff1a;被称为“钟形曲线”&#xff0c;是统计学中最核心的分布之一&#xff0c;支撑中心极…

免费AI图像编辑平台,最新无损放大技术

软件介绍 腾讯ARC网页在线AI图片处理是一款由腾讯ARC实验室推出的在线图像处理工具。凭借腾讯的科技实力&#xff0c;这款工具在图像处理领域展现了卓越的性能。 功能亮点 这款在线图像处理工具提供多种功能&#xff0c;包括人像修复、人像抠图、动漫增强、万物识别以及…

# 部署深度学习模型:Flask API 服务端与客户端通信实战

部署深度学习模型&#xff1a;Flask API 服务端与客户端通信实战 在这篇文章中&#xff0c;我们将探讨如何使用 Flask 框架部署一个深度学习模型&#xff0c;并通过客户端与服务端进行通信。我们将通过一个实际的例子&#xff0c;展示如何构建服务端和客户端&#xff0c;以及如…

物理服务器紧急救援:CentOS系统密码重置全流程实战指南

前言 在企业IT运维实践中&#xff0c;物理服务器密码丢失是典型的"低概率高风险"事件。某金融科技公司曾因核心服务器密码遗失导致业务中断36小时&#xff0c;直接损失超过800万元。这起真实案例揭示了系统密码管理的关键性——当承载重要业务的物理服务器遭遇密码丢…

【学习心得】好用算力平台推荐OpenBayes“贝式计算”

好用是有定义的&#xff0c;我之前用过AutoDL和DAMODEL&#xff08;丹摩智算&#xff09;&#xff0c;我这里就不扯哪些我觉得不关键的因素。先不废话直接给出导航链接以及CSDN上的官方主页&#xff1a; OpenBayes官方网站https://openbayes.com/ OpenBayes官方CSDN账号主页h…

政务浏览器 一站式首页功能配置说明

一、政务浏览器自定义首页目的和意义 政务综合窗口&#xff0c;通常需要打开诸多的业务系统进行受理和查询&#xff1b;反复的录入系统地址或者在收藏夹查找系统入口&#xff0c;影响办事效率。政务浏览器为该场景设计了一款可定制的“首页”。 “首页”可以根据需要&#xff0…

linux nginx配置访问目录,访问文件直接下载,linux配置nginx直链下载

很简单的一个配置&#xff0c;不指定为啥&#xff0c;别人写的都好麻烦&#xff0c;而且很多配置了也不行&#xff0c;明明就是几句话的事啊&#xff0c;唉。 话不多说&#xff0c;直接上配置 worker_processes 1; events {worker_connections 1024; } http {include …

驱动开发硬核特训 · Day 28(上篇):pinctrl 子系统详解与实战分析

&#x1f4da; 技术平台&#xff1a;嵌入式Jerry&#xff08;B站&#xff09; 一、引言 在嵌入式系统中&#xff0c;SoC 芯片的引脚通常具有多种功能&#xff0c;如 GPIO、UART、I2C、SPI 等。为了在不同的应用场景中灵活配置引脚功能&#xff0c;Linux 内核引入了 pinctrl&am…

图漾相机——Sample_V2示例程序(待补充)

文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.Sample_V2编译流程2.1 Windows环境2.2 Linux环境编译 3.Sample_V2示例程序测试3.1 ListDevice_v23.2 DepthStream_v23.3 ExposureTimeSetting_v23.4 ForceDeviceIP_v23.5 GetCalibData_v23.6 NetStatistic_v23.7 …

Google-chrome版本升级后sogou输入法不工作了

背景&#xff1a; 笔记本Thinkpad E450&#xff0c;操作系统Ubuntu 24.04.2 LTS&#xff0c;Chrome浏览器版本135.0.7049.114-1&#xff0c;Edge浏览器版本131.0.2903.99-1&#xff0c;输入法Sogou版本4.2.1.145 现象&#xff1a; - **正常场景**&#xff1a;Edge中可通过Ctrl…

7系列 之 OSERDESE2

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…

Ansible 流程控制

条件语句(判断) 当满足什么条件时&#xff0c;就执行那些tasks when 当...时ansible获取主机名 # 主机名中&#xff0c;不包含.没有区别 ansible_hostname # 包含.只显示第一个.前面的名字 ansible_fqdn # 包含.显示完整的主机名不管是shell还是各大编程语言中&#xf…

git命令积累(个人学习)

如何将docx文件不上传&#xff1f; 创建或编辑 .gitignore 文件 打开 .gitignore 文件&#xff0c;添加以下内容来忽略所有 .docx 文件&#xff1a; *.docx清除已追踪的 .docx 文件 git rm --cached "*.docx"这将从 Git 仓库中删除 .docx 文件&#xff0c;但不会删…

springboot应用大批量导出excel产生oom处理措施实践(适用于poieasyexcel)

一、背景&#xff1a; 在某些信息管理场景中&#xff0c;存在大批量导出需求&#xff0c;例如一次性导出10~100w行excel数据&#xff0c;如果不做特殊的处理&#xff0c;很容易导致Out Of Memory&#xff0c;特别是堆内存溢出。 oom复现 例如修改IDEA运行配置&#xff0c;VM…

谷歌在即将举行的I/O大会之前,意外泄露了其全新设计语言“Material 3 Expressive”的细节

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层&#xff08;Layer 4&#xff09;负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层&#xff08;Layer 7&#xff09;负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

PyTorch 版本、torchvision 版本和 Python 版本的对应关系

PyTorch 版本、torchvision 版本和 Python 版本的对应关系 在深度学习领域&#xff0c;PyTorch 及其配套库 torchvision 的使用极为广泛。但不同版本的 PyTorch、torchvision 与 Python 之间存在严格的对应关系&#xff0c;若版本搭配不当&#xff0c;会导致代码运行出错…

【hadoop】Hbase java api 案例

代码实现&#xff1a; HBaseConnection.java package com.peizheng.bigdata;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client…

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…

Vue3路由模式为history,使用nginx部署上线后刷新404的问题

一、问题 在使用nginx部署vue3的项目后&#xff0c;发现正常时可以访问的&#xff0c;但是一旦刷新&#xff0c;就是出现404的情况 二、解决方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …