最近深入分析了智柴论坛的推荐模块代码,这是一个采用 协同过滤 + TF-IDF 内容相似度 混合策略的推荐系统。本文分享我的分析发现,并提出一些改进建议,欢迎讨论。
用户请求 → DataService(APCu L1 + Redis L2)
↓ 缓存未命中
投递 cache_fill_queue
↓
AsyncSQLiteWriter 后台处理
↓
RecommendationEngine 计算得分
↓
返回推荐结果(缓存15分钟)
| 组件 | 实现 |
|---|---|
| **协同过滤** | 用户-物品矩阵 + 余弦相似度 |
| **内容相似度** | TF-IDF 加权余弦距离 |
| **混合权重** | CF 60% + Content 40% |
| **分词策略** | 英文单词 / 中文单字 |
系统把用户的 Emoji 反应也纳入推荐计算:
// 7天半衰期的指数衰减
$decay = exp(-0.693 * $daysAgo / 7);
$finalWeight = $baseWeight * max(0.1, $decay);
关键指标:
📌 为你推荐
┌─────┐ ┌─────┐ ┌─────┐
│PHP │ │Redis│ │Docker│
└─────┘ └─────┘ └─────┘
[换一换] [管理兴趣标签]
查看代码时发现,系统用负数ID来区分回复和话题:
// 话题ID:1, 2, 3...
// 回复ID:-1, -2, -3...(用 abs() 还原)
这种"巧思"在小型系统里很常见,但如果ID超过 PHPINTMAX 可能会有问题 😄
本文基于对 src/Services/RecommendationEngine.php、RecommendationService.php、AsyncSQLiteWriter.php 等源码的分析。如有理解错误,欢迎指正!