商品推荐(内容过滤 + 协同过滤)

文章详细介绍了协同过滤(包括物品协同过滤和用户协同过滤)在商品推荐系统中的应用,涉及数据模型、相似度矩阵生成、推荐策略以及性能优化。还讨论了Flask和SpringBoot在服务架构中的角色,以及数据采集、训练和推荐服务流程。
摘要由CSDN通过智能技术生成

目录

1. 名词列表

2. 协同过滤

2.1 基于物品的协同过滤 itemCF

2.1.1 数据模型:

2.1.2 商品相似度矩阵生成:

2.1.3 推荐策略:

2.2 基于用户的协同过滤 userCF

2.2.1 数据模型:

2.2.2 用户相似度矩阵生成:

2.2.3 推荐策略:

2.3 user_product_rating_matrix 作为一个中间计算结果:

3. 内容过滤

4. 商品推荐系统整体系统流程:

推荐服务流程:

训练服务流程:

训练数据生成流程:

5. 数据表模型:

6. 内外服务交互方式:

7. 数据采集方式:

8. 训练过程:

9. 推荐服务提供方式:

10. 性能:


1. 名词列表

Flask:使用Python提供Http服务的服务端软件,可以结合 Gunicorn 构建 pre-fork 多进程模型的服务器。

内容过滤:基于内容相似度的商品推荐。

物品协同过滤:基于物品的协同过滤方式的商品推荐。

用户协同过滤:基于用户的协同过滤方式的商品推荐。

2. 协同过滤

2.1 基于物品的协同过滤 itemCF
2.1.1 数据模型:

用户表(user):存储用户基本信息,用于后期采样时进行群体分开训练。

商品表(product):存储商品的基本信息,用于内容过滤匹配和协同过滤,同时用于区分三种来源类别(精选厂家、jd等接口商品、自有商品)。

用户与商品交互表(user_action):存储用户与商品的交互历史日志,用作商品相似度计算的输入。

交互类型与得分映射表(action_score_map):存储每种交互类型的得分权重映射关系的常量数据,如 click: 1, search: 3, order: 10, favourite: 8。

商品相似度矩阵(product_similarity_matrix):存储商品之间的相似度,从用户-商品评分矩阵(user_product_rating_matrix)表生成。

用户-商品评分矩阵(user_product_rating_matrix):用于存储统计计算三种来源的用户-商品评分矩阵。

从 user_product_matrix 表中加载全部的用户-商品交互矩阵,在实际生产环境中是非常大的数据量,可能存在性能问题。

为了优化这个过程,我们可以考虑几个策略:

  1. 只加载活跃用户的交互数据,过滤掉长期不活跃的用户。

  2. 只加载热门商品的交互数据,不加载长尾冷门商品的交互。

  3. 对矩阵进行采样,例如每个用户只随机采样部分交互数据。

  4. 不完整加载矩阵到内存,而是使用延迟加载(Lazy Load)的机制,即只在计算时对特定条目进行加载。

  5. 对矩阵进行分块,按用户或商品的区块进行分组加载。

  6. 使用更优化的矩阵存储格式,如稀疏矩阵存储优化内存占用。

  7. 增量加载,每次只加载最近一次训练后新增的交互数据,避免重复加载。

综合这些策略,可以在保证足够的交互数据的同时,大幅减少内存占用和加载时间,使训练过程更高效。充分利用用户-商品交互矩阵来训练更好的模型。

2.1.2 商品相似度矩阵生成:

根据 user_product_rating_matrix 用户-商品交互矩阵,生成商品相似度矩阵:

从 user_product_rating_matrix 表中加载用户-商品交互数据,使用常用的算法如余弦相似度、改进的余弦相似度和Pearson相关系数等,得到的商品相似度矩阵可以直接供 ItemCF 模型使用。在推荐时,基于用户的商品交互历史,找到相似的商品,然后推荐商品的 topN 的相似商品。

2.1.3 推荐策略:

推荐的商品可能来自三种不同来源,需要做数量控制,再结合内容过滤的推荐方法来增加来源里推荐比较少的商品。综合推荐结果,按比例取出三种来源的前 i, j, k 个商品并去重。

2.2 基于用户的协同过滤 userCF
2.2.1 数据模型:

用户表(user):存储用户基本信息,用于后期采样时进行群体分开训练。

商品表(product):存储商品的基本信息,用于内容过滤匹配和协同过滤,同时用于区分三种来源类别(精选厂家、jd等接口商品、自有商品)。

用户与商品交互表(user_action):存储用户与商品的交互历史日志,用作商品相似度计算的输入。

交互类型与得分映射表(action_score_map):存储每种交互类型的得分权重映射关系的常量数据,如 click: 1, search: 3, order: 10, favourite: 8。

用户相似度矩阵(user_similarity):存储用户之间的相似度,从用户-商品评分矩阵(user_product_rating_matrix)表生成。

用户-商品评分矩阵(user_product_rating_matrix):用于存储统计计算三种来源的用户-商品评分矩阵。

从 user_product_matrix 表中加载全部的用户-商品交互矩阵,在实际生产环境中是非常大的数据量,可能存在性能问题。

2.2.2 用户相似度矩阵生成:

根据 user_product_rating_matrix 用户-商品交互矩阵,生成用户相似度矩阵:

从 user_product_rating_matrix 表中加载用户-商品交互数据,使用常用的算法如余弦相似度、改进的余弦相似度等,得到的用户相似度矩阵可以直接供 userCF 模型使用。在推荐时,基于用户的商品交互历史,找到相似的商品,然后推荐商品的 topN 的相似商品。

2.2.3 推荐策略:

推荐的商品可能来自三种不同来源,需要做数量控制,再结合内容过滤的推荐方法来增加来源里推荐比较少的商品。综合推荐结果,按比例取出三种来源的前 i, j, k 个商品并去重。

2.3 user_product_rating_matrix 作为一个中间计算结果:

常见的做法是将其作为一个中间计算结果,每次在模型训练或推荐请求时动态生成:

  • 根据最新用户行为数据,实时计算交互矩阵

  • 避免了维护一个大型矩阵表的成本

  • 可以确保矩阵数据时效性

  • 但每次计算会增加训练和推荐延时

3. 内容过滤

将商品的标题、描述等信息合为一个宽字段,构建分词矩阵并构建向量矩阵,最终构建相似度矩阵。

具体流程:

  • 查询站点上线的所有商品,按精选、jd等接口商品、会员自有分为3类,将商品信息字段合为一个宽字段,输出 csv 文件,格式为 {product_id:1, detail:"皮手套"};

  • 按3类分别构建商品信息的相似度矩阵,并保存该相似度矩阵以供商品的相似度查询和推荐;

  • 定时任务对商品相似度矩阵进行更新,如果查询到的站点上线的所有商品没有变化,则相似度矩阵保持不变;

  • 推荐商品时,使用商品的信息查询3类相似度矩阵中最相似的前 n 个商品,得到推荐商品列表后去除作为参数传入的商品,3类商品按比例分别取前 j、k、l 个商品,组成最终的推荐列表。

4. 商品推荐系统整体系统流程:

推荐服务流程:

springboot 微服务负责接收请求并对请求进行转换(如把商品 id 转换成商品信息的分词再传给 flask),把请求转发给 flask 集群。flask根据商品id、用户id、商品信息分词,分别推荐商品,把推荐维果返回给 springboot,springboot 综合推荐结果获取3种不同来源的不同比例的商品并去重后,返回给客户端。

训练服务流程:

内容过滤模型训练: 训练进程读取3类来源的商品信息csv文件,按3类分别构建商品信息的相似度模型,并保存该相似度矩阵以供商品的相似度查询和推荐。

物品协同过滤模型训练:训练进程读取用户与商品交互表(user_action)生成的csv文件,来生成最新的用户商品评分矩阵(user_product_rating_matrix),根据最新的评分矩阵训练商品相似度矩阵,商品相似度矩阵即为商品相似度模型。

物品协同过滤模型训练:训练进程读取用户与商品交互表(user_action)生成最新的用户商品评分矩阵(user_product_rating_matrix),根据最新的评分矩阵训练商品相似度矩阵,商品相似度矩阵即为商品相似度模型。

训练数据生成流程:

内容过滤:Java 进程读取商品数据库,合并多个商品表的多个字段,生成商品信息的CSV文件。用定时任务完成。

物品协同过滤:Java 进程将用户商品交互表(user_action)生成为CSV文件;更CSV文件时,对比CSV文件最后一行的记录id和时间戳,以增量的方式更新CSV文件。用定时任务完成。

用户协同过滤:Java 进程将用户商品交互表(user_action)生成为CSV文件;更CSV文件时,对比CSV文件最后一行的记录id和时间戳,以增量的方式更新CSV文件。用定时任务完成。

5. 数据表模型:

内容过滤:

商品信息宽字段,按三种来源生成三种 csv 文件

物品协同:

用户表(user),商品表(product),用户与商品交互表(user_action),交互类型与得分映射表(action_score_map),用户-商品评分矩阵(user_product_rating_matrix),商品相似度矩阵(product_similarity)

用户协同:

用户表(user),商品表(product),用户与商品交互表(user_action),交互类型与得分映射表(action_score_map),用户-商品评分矩阵(user_product_rating_matrix),用户相似度矩阵(user_similarity)

6. 内外服务交互方式:

springboot 微服务:负责参数的传入转发给 flask;推荐结果的综合去重、按比例获取前 i, j, k 个商品处理;内容过滤、物品协同过滤、用户协同过滤的CSV数据文件增量生成的定时任务。

flask 推荐计算服务:负责不同模型的加载和推荐计算,提供Restful 接口,向springboot响应结果。

训练服务:定时任务训练内容过滤模型、物品协同过滤模型、用户协同过滤模型。

7. 数据采集方式:

内容过滤:定时任务

物品协同:用户行为存入用户商品交互表,评分表使用定时任务 + 增量计算

用户协同:用户行为存入用户商品交互表,评分表使用定时任务 + 增量计算

8. 训练过程:

内容过滤:定时任务,每个站点分别生成3个模型(各属于一种商品来源)

物品协同:定时任务 + 增量计算,

用户协同:定时任务 + 增量计算

9. 推荐服务提供方式:

Restful 接口,由 springboot 提供。

10. 性能:

Flask 推荐计算服务可以通过结合 gunicorn 和 nginx,提供多节点的分布式服务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值