电商推荐系统从零实现:UserCF协同过滤在Spring Boot中的落地
推荐系统听起来很高大上——深度学习、Embedding、实时特征工程——但对于一个月活几十万的电商系统,用UserCF(基于用户的协同过滤)加上标签匹配,已经能满足80%的推荐场景。关键是落地,不是炫技。
一、两种推荐策略的组合
我采用的策略是协同过滤为主,标签匹配为补充:
- 协同过滤:找到与当前用户行为相似的用户群体,推荐他们也喜欢的商品。适用于有足够行为数据的活跃用户。
- 标签匹配:基于商品标签与用户历史偏好标签的匹配度推荐。适用于新用户或行为数据不足的冷启动场景。
两者混合推荐:协同过滤结果占70%权重,标签匹配结果占30%,最终按加权分数排序。
二、UserCF的实现
核心流程三步走:
第一步:构建用户-商品评分矩阵。
从订单表和浏览记录中提取隐式反馈数据。购买权重设为5,加购物车3,浏览1,未发生行为的为0。
第二步:计算用户相似度。
用余弦相似度计算两个用户之间的行为相似性
public double cosineSimilarity(Map<Long, Double> userA, Map<Long, Double> userB) {
double dotProduct = userA.entrySet().stream()
.filter(e -> userB.containsKey(e.getKey()))
.mapToDouble(e -> e.getValue() * userB.get(e.getKey()))
.sum();
double normA = Math.sqrt(userA.values().stream().mapToDouble(v -> v * v).sum());
double normB = Math.sqrt(userB.values().stream().mapToDouble(v -> v * v).sum());
return normA == 0 || normB == 0 ? 0 : dotProduct / (normA * normB);
}
实际生产中不会实时计算所有用户对的相似度——O(n²)的复杂度扛不住。做法是只计算与当前用户有过共同商品交互的"候选邻居用户",把计算范围从全量用户降到几百个。
第三步:推荐生成。
找到Top-K个最相似用户,汇总他们的高评分商品(当前用户未购买过的),按加权分数排序取Top-N。
三、标签匹配的冷启动策略
新用户没有行为数据,协同过滤失效。这时用标签匹配顶上:根据用户在注册时选择的兴趣标签、或者落地页来源,匹配对应标签的商品。
标签体系设计示例:
{
"productId": 10001,
"tags": [
{"name": "数码", "weight": 1.0},
{"name": "手机配件", "weight": 0.8},
{"name": "蓝牙", "weight": 0.9},
{"name": "性价比", "weight": 0.6}
]
}
用户行为也会反向更新其偏好标签权重——用户多次浏览"蓝牙"标签的商品,该标签在用户画像中的权重自动提升。
四、推荐结果的后处理
原始推荐结果可能出现同一品牌的商品扎堆、价格分布不均等问题。后处理环节做以下优化:
- 多样性打散:同一类目/品牌的商品限制出现次数,强制插入跨类目的探索性推荐。
- 价格过滤:如果用户从未购买过单价超过500元的商品,推荐结果中过滤高价商品。
- 已购去重:已购买商品从推荐列表中移除。
五、性能与更新策略
用户行为数据和相似度矩阵不需要实时计算。定时任务每天凌晨跑一次全量计算,结果写入Redis或MySQL推荐结果表。API接口直接从缓存中读取,响应时间控制在50ms以内。
// 从推荐缓存中直接读取
String cacheKey = "recommend:user:" + userId;
List<ProductDTO> recommendations = redisTemplate.opsForValue().get(cacheKey);
如果行为数据变化频繁,可以加入准实时增量更新:新行为产生后,不重算全部相似度,只更新该用户的邻居用户列表和推荐结果。
推荐系统的落地需要一个完整的电商底座来验证效果。CRMEB的Java版可以作为搭建推荐引擎的业务基础,直接在其商品和订单数据上构建推荐层。此外,CRMEB在用户行为数据采集方面的埋点方案也值得参考。
SEO小贴士
- 核心关键词:Java商城推荐系统、协同过滤Java实现、电商推荐算法、Spring Boot推荐引擎
- 长尾词:余弦相似度计算、标签匹配推荐、用户画像构建、冷启动策略
- 内容优势:给出可直接运行的余弦相似度Java代码,比纯理论文章更实用
- 搜索意图:用户搜"电商推荐系统"时分两类——想看深度学习方案的和想找可落地简单方案的,本文覆盖后者
更多推荐
所有评论(0)