SWING_IMPLEMENTATION_SUMMARY.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命令

执行流程:

  1. 编译C++程序
  2. 查找session文件
  3. 运行Swing算法(多线程)
  4. 合并结果
  5. 生成可读版本(自动调用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

故障排查

常见问题

  1. Session文件不存在

    • 先运行 generate_session.py
  2. 编译失败

    • 检查g++版本:g++ --version
    • 手动编译:cd collaboration && make
  3. 数据库连接失败

    • 检查配置:offline_tasks/config/offline_config.py
    • 测试连接:python3 offline_tasks/test_connection.py
  4. 结果为空

    • 降低threshold参数
    • 增加lookback_days
    • 检查数据量:wc -l output/session.txt.*

详细故障排查参见:offline_tasks/SWING_USAGE.md

后续优化方向

  1. 性能优化

    • 支持分布式计算
    • 增量更新机制
    • 结果缓存
  2. 功能增强

    • 支持多种相似度算法
    • 在线实时更新
    • A/B测试框架
  3. 可观测性

    • 添加监控指标
    • 结果质量评估
    • 自动报警

相关文档

  • 详细使用指南: 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算法工作流:

  1. 前置任务:Session文件生成(generate_session.py
  2. 核心算法:C++ Swing执行(改进的run.sh
  3. 后处理:Debug文件生成(add_names_to_swing.py
  4. 文档完善:详细使用指南和快速开始

所有脚本都支持debug模式,便于调试和监控。整体流程自动化程度高,只需一条命令即可完成全流程。


实现时间: 2024-10-17 状态: ✅ 已完成