这个Python项目实现了一个基于用户行为的图书推荐系统。推荐算法作为互联网时代的信息过滤利器,在图书领域能有效解决"选择困难症"问题。根据我的实战经验,一个合格的推荐系统能提升用户30%以上的内容消费时长。
推荐系统的本质是建立"用户-物品"的二维矩阵,通过算法填补矩阵中的缺失值(即预测用户对未接触物品的偏好)。图书推荐的特殊性在于:
推荐系统的基石是数据,我们采用三层数据架构:
python复制# MongoDB文档设计示例
book = {
"_id": ObjectId("5f8d..."),
"isbn": "978711547...",
"title": "Python编程:从入门到实践",
"authors": ["Eric Matthes"],
"publisher": "人民邮电出版社",
"tags": ["编程", "Python", "入门"],
"word_count": 450000,
"publish_date": ISODate("2018-01")
}
user = {
"_id": "user123",
"age": 25,
"gender": "male",
"preferred_tags": ["科技", "编程"],
"reading_history": [
{"book_id": "5f8d...", "rating": 4, "timestamp": ISODate("2023-05-01")}
]
}
经过AB测试验证,混合策略效果最佳:
| 算法类型 | 准确率 | 覆盖率 | 适合场景 | 实现复杂度 |
|---|---|---|---|---|
| 协同过滤 | 0.72 | 58% | 用户行为丰富时 | ★★☆ |
| 内容推荐 | 0.65 | 83% | 冷启动阶段 | ★★☆ |
| 矩阵分解 | 0.81 | 62% | 精准推荐 | ★★★★ |
| 混合模型 | 0.85 | 78% | 综合场景 | ★★★★★ |
mermaid复制graph TD
A[用户登录] --> B[获取历史行为]
B --> C{行为数据>10?}
C -->|Yes| D[协同过滤推荐]
C -->|No| E[内容特征推荐]
D --> F[去重过滤]
E --> F
F --> G[混合排序]
G --> H[返回TOP10]
采用改进的余弦相似度,解决评分标准不一致问题:
python复制import numpy as np
from scipy.spatial.distance import cosine
def weighted_cosine(u1, u2):
# 获取共同评分项
common_books = set(u1['ratings'].keys()) & set(u2['ratings'].keys())
# 计算权重(共同评分数量占比)
weight = len(common_books) / min(len(u1['ratings']), len(u2['ratings']))
# 提取评分向量
vec1 = np.array([u1['ratings'][b] for b in common_books])
vec2 = np.array([u2['ratings'][b] for b in common_books])
# 计算加权相似度
return weight * (1 - cosine(vec1, vec2))
python复制class HybridRecommender:
def __init__(self, cf_model, cb_model):
self.cf = cf_model # 协同过滤模型
self.cb = cb_model # 内容推荐模型
def recommend(self, user_id, n=10):
# 获取基础推荐
cf_recs = self.cf.recommend(user_id, n*2)
cb_recs = self.cb.recommend(user_id, n*2)
# 混合排序算法
combined = []
for book in set(cf_recs + cb_recs):
cf_score = cf_recs.get(book, 0)
cb_score = cb_recs.get(book, 0)
# 动态权重:用户行为越多,协同过滤权重越高
w = min(1, len(user.history)/10)
final_score = w*cf_score + (1-w)*cb_score
combined.append((book, final_score))
# 返回TopN
return sorted(combined, key=lambda x: -x[1])[:n]
采用两级缓存提升响应速度:
python复制def get_recommendations(user_id):
cache_key = f"rec:{user_id}"
# 先查Redis
if rec := redis.get(cache_key):
return json.loads(rec)
# 计算推荐结果
result = calculate_rec(user_id)
# 写入缓存(设置动态TTL)
ttl = 3600 if len(user.history) > 5 else 600
redis.setex(cache_key, ttl, json.dumps(result))
return result
python复制from functools import lru_cache
@lru_cache(maxsize=1000)
def get_cached_rec(user_id):
return calculate_rec(user_id)
使用Celery实现推荐预计算:
python复制@app.task
def precompute_recs():
active_users = User.objects.filter(last_login__gt=timezone.now()-timedelta(days=30))
for user in active_users:
recommendations = calculate_rec(user.id)
cache_recommendations(user.id, recommendations)
我们采用五折交叉验证评估:
| 评估阶段 | RMSE | MAE | 覆盖率 | 多样性 |
|---|---|---|---|---|
| 初始版本 | 1.32 | 0.98 | 63% | 0.45 |
| 加入标签 | 1.18 | 0.87 | 71% | 0.52 |
| 混合模型 | 0.92 | 0.68 | 82% | 0.61 |
python复制def ab_test(user_id):
# 分组策略:根据用户ID哈希值分桶
bucket = hash(user_id) % 100
if bucket < 30:
return get_cf_recommendations(user_id) # 对照组
elif bucket < 60:
return get_hybrid_recommendations(user_id) # 实验组1
else:
return get_deep_learning_recommendations(user_id) # 实验组2
Docker Compose配置示例:
yaml复制version: '3'
services:
recommender:
build: .
ports:
- "8000:8000"
environment:
- MONGO_URI=mongodb://mongo:27017
- REDIS_HOST=redis
depends_on:
- mongo
- redis
mongo:
image: mongo:5.0
volumes:
- mongo_data:/data/db
redis:
image: redis:6.2
volumes:
- redis_data:/data
volumes:
mongo_data:
redis_data:
基于CPU/内存指标的HPA配置:
bash复制kubectl autoscale deployment recommender \
--cpu-percent=70 \
--min=3 \
--max=10 \
--namespace=book-recsys
关键提示:推荐系统需要持续迭代,建议建立每周效果复盘机制,重点关注点击率、转化率、阅读时长等业务指标。