目录
2.3 user_product_rating_matrix 作为一个中间计算结果:
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 表中加载全部的用户-商品交互矩阵,在实际生产环境中是非常大的数据量,可能存在性能问题。
为了优化这个过程,我们可以考虑几个策略:
-
只加载活跃用户的交互数据,过滤掉长期不活跃的用户。
-
只加载热门商品的交互数据,不加载长尾冷门商品的交互。
-
对矩阵进行采样,例如每个用户只随机采样部分交互数据。
-
不完整加载矩阵到内存,而是使用延迟加载(Lazy Load)的机制,即只在计算时对特定条目进行加载。
-
对矩阵进行分块,按用户或商品的区块进行分组加载。
-
使用更优化的矩阵存储格式,如稀疏矩阵存储优化内存占用。
-
增量加载,每次只加载最近一次训练后新增的交互数据,避免重复加载。
综合这些策略,可以在保证足够的交互数据的同时,大幅减少内存占用和加载时间,使训练过程更高效。充分利用用户-商品交互矩阵来训练更好的模型。
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,提供多节点的分布式服务。