Swing实现总结.md
11 KB
Swing算法实现总结
完成的任务
本次实现完成了以下功能:
1. Session生成脚本 ✓
文件: offline_tasks/scripts/generate_session.py
功能:
- 从数据库提取用户行为数据
- 聚合用户session(按商品维度累加权重)
- 支持两种输出格式:
- 标准格式:
uid \t {"item_id":score,...} - C++格式:
{"item_id":score,...}(每行一个用户)
- 标准格式:
主要参数:
--lookback_days: 回看天数(默认730天)--format: 输出格式(standard/cpp/both)--output: 输出文件路径--debug: 启用debug模式
使用示例:
cd /home/tw/recommendation/offline_tasks
python3 scripts/generate_session.py --lookback_days 730 --format both
2. Swing运行脚本 ✓
文件: collaboration/run.sh
改进内容:
- ✓ 适配新的数据路径(
../offline_tasks/output/) - ✓ 自动检测session文件格式(带uid或纯json)
- ✓ 增加配置区域,便于修改参数
- ✓ 添加错误检查和友好的输出信息
- ✓ 自动调用debug脚本生成可读文件
- ✓ 支持自定义Python环境
配置项:
SESSION_DATA_DIR="../offline_tasks/output" # session文件目录
ALPHA=0.7 # Swing alpha参数
THRESHOLD1=1 # 交互强度阈值1
THRESHOLD2=3 # 交互强度阈值2
THREAD_NUM=4 # 线程数
SHOW_PROGRESS=1 # 显示进度
PYTHON_CMD="python3" # Python命令
执行流程:
- 编译C++程序
- 查找session文件
- 运行Swing算法(多线程)
- 合并结果
- 生成可读版本(自动调用debug脚本)
3. Debug脚本 ✓
文件: offline_tasks/scripts/add_names_to_swing.py
功能:
- 读取Swing算法输出结果
- 从数据库获取商品名称映射
- 生成可读版本:
item_id:name \t similar_id1:name1:score1,...
使用示例:
cd /home/tw/recommendation/offline_tasks
python3 scripts/add_names_to_swing.py \
../collaboration/output/swing_similar.txt \
../collaboration/output/swing_similar_readable.txt \
--debug
4. 使用文档 ✓
文件:
offline_tasks/SWING_USAGE.md- 完整使用指南collaboration/QUICKSTART.md- 快速开始指南
包含内容:
- 详细的使用步骤
- 参数说明和调优建议
- 故障排查指南
- 性能优化建议
- 完整示例
数据流程
┌─────────────────────────────────────────────────────────────┐
│ 步骤1: 生成Session文件 │
│ generate_session.py │
│ ↓ │
│ 数据库 → 用户行为数据 → 聚合权重 → session.txt.YYYYMMDD │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 步骤2: 运行Swing算法 │
│ collaboration/run.sh │
│ ↓ │
│ session文件 → C++ Swing → sim_matrx.* → swing_similar.txt │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 步骤3: 生成Debug文件 │
│ add_names_to_swing.py (自动调用) │
│ ↓ │
│ swing_similar.txt → 添加商品名 → swing_similar_readable.txt│
└─────────────────────────────────────────────────────────────┘
文件格式说明
Session文件格式
标准格式 (session.txt.YYYYMMDD):
user_id1 {"123":10.0,"456":5.0,"789":3.0}
user_id2 {"123":8.0,"999":12.0}
C++格式 (session.txt.YYYYMMDD.cpp):
{"123":10.0,"456":5.0,"789":3.0}
{"123":8.0,"999":12.0}
Swing结果格式
原始格式 (swing_similar.txt):
12345 67890:0.8523,23456:0.7234,34567:0.6891
可读格式 (swing_similar_readable.txt):
12345:iPhone 15 Pro 67890:iPhone 15:0.8523,23456:iPhone 14 Pro:0.7234
行为权重配置
当前配置(在generate_session.py中):
| 行为类型 | 权重 | 说明 |
|---|---|---|
| purchase | 10.0 | 购买行为(最强信号) |
| contactFactory | 5.0 | 联系厂家 |
| addToCart | 3.0 | 加入购物车 |
| addToPool | 2.0 | 加入询价池 |
快速开始
# 1. 生成session文件(730天数据)
cd /home/tw/recommendation/offline_tasks
python3 scripts/generate_session.py --lookback_days 730
# 2. 运行Swing算法
cd /home/tw/recommendation/collaboration
bash run.sh
# 3. 查看结果
cat output/swing_similar_readable.txt | head -20
项目结构
recommendation/
├── offline_tasks/
│ ├── scripts/
│ │ ├── generate_session.py # 新增:生成session
│ │ ├── add_names_to_swing.py # 新增:添加商品名
│ │ ├── i2i_swing.py # 已有:Python版Swing
│ │ └── debug_utils.py # 已有:Debug工具
│ ├── config/
│ │ └── offline_config.py # 配置文件
│ ├── output/
│ │ ├── session.txt.YYYYMMDD # 生成的session文件
│ │ └── session.txt.YYYYMMDD.cpp # C++格式session
│ ├── SWING_USAGE.md # 新增:详细使用文档
│ └── ...
├── collaboration/
│ ├── run.sh # 修改:适配新数据格式
│ ├── QUICKSTART.md # 新增:快速开始
│ ├── src/
│ │ ├── swing.cc # C++ Swing实现
│ │ ├── swing_symmetric.cc # 对称Swing
│ │ ├── icf_simple.cc # 简单协同过滤
│ │ └── ucf.py # 用户协同
│ ├── bin/ # 编译后的可执行文件
│ ├── output_YYYYMMDD/ # 输出目录
│ │ ├── sim_matrx.* # 多线程输出
│ │ ├── swing_similar.txt # 合并结果
│ │ └── swing_similar_readable.txt # 可读结果
│ └── output -> output_YYYYMMDD # 软链接
└── SWING_IMPLEMENTATION_SUMMARY.md # 本文档
参数调优建议
针对B2B低频场景
# Session生成
--lookback_days 730 # 2年数据(B2B交互频次低)
# Swing算法
ALPHA=0.5-0.7 # 关注用户共同行为的多样性
THRESHOLD1=1 # 低阈值,保留更多数据
THRESHOLD2=3 # 中等阈值,过滤噪音
THREAD_NUM=4-8 # 根据服务器配置
针对大数据量场景
# 增加线程数
THREAD_NUM=8
# 修改C++代码参数
max_sim_list_len=300 # 相似列表长度
max_session_list_len=100 # session截断长度
与现有系统集成
1. 定时任务
# 每天凌晨2点运行
0 2 * * * cd /home/tw/recommendation/offline_tasks && \
python3 scripts/generate_session.py && \
cd ../collaboration && bash run.sh
2. 结果导入Redis
可使用现有的 load_index_to_redis.py 脚本导入结果。
3. 与Python版Swing对比
- C++版本(本次实现):性能更好,适合大数据量
- Python版本(
i2i_swing.py):易于调试,支持时间衰减
可以运行两个版本对比效果:
# Python版本
python3 offline_tasks/scripts/i2i_swing.py --debug
# C++版本
cd collaboration && bash run.sh
测试验证
1. 小数据量测试
# 生成小范围数据(30天)
python3 scripts/generate_session.py --lookback_days 30
# 运行Swing
cd ../collaboration
bash run.sh
2. 查看结果质量
# 查看可读版本前100行
head -100 output/swing_similar_readable.txt
# 检查相似度分布
cat output/swing_similar.txt | awk -F'\t' '{print NF-1}' | sort -n | uniq -c
3. 性能测试
# 记录运行时间
time bash run.sh
故障排查
常见问题
Session文件不存在
- 先运行
generate_session.py
- 先运行
编译失败
- 检查g++版本:
g++ --version - 手动编译:
cd collaboration && make
- 检查g++版本:
数据库连接失败
- 检查配置:
offline_tasks/config/offline_config.py - 测试连接:
python3 offline_tasks/test_connection.py
- 检查配置:
结果为空
- 降低threshold参数
- 增加lookback_days
- 检查数据量:
wc -l output/session.txt.*
详细故障排查参见:offline_tasks/SWING_USAGE.md
后续优化方向
性能优化
- 支持分布式计算
- 增量更新机制
- 结果缓存
功能增强
- 支持多种相似度算法
- 在线实时更新
- A/B测试框架
可观测性
- 添加监控指标
- 结果质量评估
- 自动报警
相关文档
- 详细使用指南:
offline_tasks/SWING_USAGE.md - 快速开始:
collaboration/QUICKSTART.md - 配置说明:
offline_tasks/config/offline_config.py - Debug工具:
offline_tasks/scripts/debug_utils.py - Swing算法原理:
collaboration/README.md
维护说明
代码维护
- Session生成:
offline_tasks/scripts/generate_session.py - Swing执行:
collaboration/run.sh - Debug脚本:
offline_tasks/scripts/add_names_to_swing.py
配置维护
- 数据库配置:
offline_tasks/config/offline_config.py - 行为权重:
generate_session.py中的behavior_weights - Swing参数:
collaboration/run.sh中的配置区域
日志查看
# Session生成日志
ls offline_tasks/logs/debug/generate_session_*.log
# Swing运行日志
ls collaboration/logs/
总结
本次实现完成了一套完整的C++ Swing算法工作流:
- ✓ 前置任务:Session文件生成(
generate_session.py) - ✓ 核心算法:C++ Swing执行(改进的
run.sh) - ✓ 后处理:Debug文件生成(
add_names_to_swing.py) - ✓ 文档完善:详细使用指南和快速开始
所有脚本都支持debug模式,便于调试和监控。整体流程自动化程度高,只需一条命令即可完成全流程。
实现时间: 2024-10-17 状态: ✅ 已完成