基于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.pswp.cn/web/79055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79055.shtml
英文地址,請注明出處:http://en.pswp.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 …