STRUCTURE.md 11.9 KB

项目目录结构

/home/tw/recommendation/
│
├── db_service.py                    # 数据库连接服务(共享模块)
├── requirements.txt                 # Python依赖包列表
│
├── offline_tasks/                   # 【离线任务主目录】
│   │
│   ├── config/                      # 配置目录
│   │   └── offline_config.py       # 离线任务配置文件
│   │                                  - 数据库配置
│   │                                  - Redis配置
│   │                                  - 算法参数配置
│   │                                  - 时间配置
│   │
│   ├── scripts/                     # 脚本目录
│   │   ├── i2i_swing.py            # Swing算法实现
│   │   │                              输出: i2i_swing_YYYYMMDD.txt
│   │   │
│   │   ├── i2i_session_w2v.py      # Session Word2Vec算法
│   │   │                              输出: i2i_session_w2v_YYYYMMDD.txt
│   │   │                                   session_w2v_model_YYYYMMDD.model
│   │   │
│   │   ├── i2i_deepwalk.py         # DeepWalk算法
│   │   │                              输出: i2i_deepwalk_YYYYMMDD.txt
│   │   │                                   deepwalk_model_YYYYMMDD.model
│   │   │                                   item_graph_YYYYMMDD.txt
│   │   │
│   │   ├── interest_aggregation.py # 兴趣点聚合索引生成
│   │   │                              输出: interest_aggregation_hot_YYYYMMDD.txt
│   │   │                                   interest_aggregation_cart_YYYYMMDD.txt
│   │   │                                   interest_aggregation_new_YYYYMMDD.txt
│   │   │                                   interest_aggregation_global_YYYYMMDD.txt
│   │   │
│   │   └── load_index_to_redis.py  # 索引加载到Redis
│   │
│   ├── output/                      # 输出目录(自动创建)
│   │   ├── i2i_swing_*.txt         # Swing算法输出
│   │   ├── i2i_session_w2v_*.txt   # Session W2V输出
│   │   ├── i2i_deepwalk_*.txt      # DeepWalk输出
│   │   ├── interest_aggregation_*  # 兴趣点聚合输出
│   │   ├── *.model                 # 训练的模型文件
│   │   └── item_graph_*.txt        # 物品图结构
│   │
│   ├── logs/                        # 日志目录(自动创建)
│   │   ├── run_all_*.log           # 总调度日志
│   │   ├── load_redis.log          # Redis加载日志
│   │   └── cron.log                # 定时任务日志
│   │
│   ├── run_all.py                   # 【主调度脚本】
│   │                                  统一运行所有离线任务
│   │
│   ├── install.sh                   # 安装脚本
│   │                                  自动安装依赖和初始化
│   │
│   ├── test_connection.py           # 连接测试脚本
│   │                                  测试数据库和Redis连接
│   │
│   ├── example_query_redis.py       # Redis查询示例
│   │                                  演示如何查询索引
│   │
│   ├── README.md                    # 详细文档
│   ├── QUICKSTART.md                # 快速开始指南
│   ├── PROJECT_SUMMARY.md           # 项目总结
│   └── STRUCTURE.md                 # 本文档
│
├── item_sim.py                      # 原有的物品相似度脚本(参考)
├── hot/                             # 原有的热门商品模块(参考)
├── collaboration/                   # 原有的协同过滤模块(参考)
└── graphembedding/                  # 原有的图嵌入模块(参考)

数据流向图

┌─────────────────┐
│   数据源         │
│  (SelectDB)     │
└────────┬────────┘
         │
         │ SQL查询
         │
         ▼
┌─────────────────────────────────────────────────────────┐
│                    离线任务处理                          │
│                                                          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │ Swing算法    │  │ Session W2V  │  │ DeepWalk算法 │  │
│  │              │  │              │  │              │  │
│  │ 用户行为共现  │  │ 会话序列     │  │ 图随机游走   │  │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘  │
│         │                 │                 │           │
│         └─────────────────┴─────────────────┘           │
│                           │                              │
│                           │ i2i相似度索引                │
│                           ▼                              │
│                  ┌─────────────────┐                     │
│                  │  输出文件(.txt) │                     │
│                  └─────────────────┘                     │
│                                                          │
│  ┌──────────────────────────────────────────────────┐   │
│  │           兴趣点聚合                              │   │
│  │                                                   │   │
│  │  按维度分组: 平台/国家/客户类型/分类              │   │
│  │  按类型分组: 热门/加购/新品/全局                  │   │
│  │  时间衰减 + 行为权重                              │   │
│  └────────────────────┬─────────────────────────────┘   │
│                       │                                  │
│                       │ 多维度索引                       │
│                       ▼                                  │
│              ┌─────────────────┐                         │
│              │  输出文件(.txt) │                         │
│              └─────────────────┘                         │
└─────────────────────────────────────────────────────────┘
                       │
                       │ 加载
                       ▼
              ┌─────────────────┐
              │     Redis        │
              │   (在线索引)     │
              └────────┬────────┘
                       │
                       │ 查询
                       ▼
              ┌─────────────────┐
              │   在线推荐服务   │
              │                  │
              │ - 详情页推荐     │
              │ - 首页推荐       │
              │ - 搜索推荐       │
              └──────────────────┘

核心模块说明

1. 配置模块

文件: config/offline_config.py

职责:

  • 数据库连接配置
  • Redis连接配置
  • 算法超参数配置
  • 行为权重配置
  • 时间范围配置

2. i2i相似度模块

2.1 Swing算法

文件: scripts/i2i_swing.py

输入: 用户行为数据(user_id, item_id, event_type, create_time)

核心逻辑:

# 对于物品i和j,计算它们的Swing相似度
for user_u in common_users:
    for user_v in common_users:
        common_items = items_u  items_v
        sim(i, j) += 1 / (alpha + |common_items|)

输出: i2i_swing_YYYYMMDD.txt

item_id \t item_name \t similar_item_id1:score1,similar_item_id2:score2,...

2.2 Session Word2Vec

文件: scripts/i2i_session_w2v.py

输入: 用户会话序列

核心逻辑:

  1. 按时间间隔切分用户会话
  2. 训练Word2Vec模型
  3. 计算物品向量相似度

输出:

  • i2i_session_w2v_YYYYMMDD.txt
  • session_w2v_model_YYYYMMDD.model

2.3 DeepWalk

文件: scripts/i2i_deepwalk.py

输入: 用户-物品交互数据

核心逻辑:

  1. 构建物品共现图
  2. 执行随机游走生成序列
  3. 训练Word2Vec模型
  4. 计算物品向量相似度

输出:

  • i2i_deepwalk_YYYYMMDD.txt
  • deepwalk_model_YYYYMMDD.model
  • item_graph_YYYYMMDD.txt

3. 兴趣点聚合模块

文件: scripts/interest_aggregation.py

输入: 用户行为数据 + 用户特征

核心逻辑:

# 按维度聚合
for each behavior:
    weight = behavior_weight * time_weight
    aggregations[dimension_key][item_id] += weight

# 排序并输出top N
for dimension_key, items in aggregations:
    output top_n items sorted by weight

维度组合:

  • 单维度: platform, country, customer_type, category_level2, category_level3
  • 组合维度: platform_country, platform_customer, country_customer, platform_country_customer

列表类型:

  • hot: 最近180天高交互
  • cart: 加购行为
  • new: 新品(最近90天上架)
  • global: 全局(所有数据)

输出:

  • interest_aggregation_hot_YYYYMMDD.txt
  • interest_aggregation_cart_YYYYMMDD.txt
  • interest_aggregation_new_YYYYMMDD.txt
  • interest_aggregation_global_YYYYMMDD.txt

4. Redis加载模块

文件: scripts/load_index_to_redis.py

职责: 将生成的索引文件加载到Redis

Redis Key格式:

  • i2i索引: i2i:{algorithm}:{item_id}
  • 兴趣点索引: interest:{list_type}:{dimension_key}

示例:

i2i:swing:123456 -> "234567:0.8523,345678:0.7842,..."
interest:hot:platform:PC -> "12345:98.52,23456:87.34,..."

5. 统一调度模块

文件: run_all.py

职责: 按顺序运行所有离线任务

执行流程:

  1. 运行Swing算法
  2. 运行Session W2V
  3. 运行DeepWalk
  4. 运行兴趣点聚合
  5. 记录日志和统计

使用场景映射

业务场景 使用的索引 Redis Key示例
详情页 - 大家都在看 i2i相似度 i2i:swing:{item_id}
首页 - 猜你喜欢 兴趣点聚合 interest:hot:platform_country:{platform}_{country}
搜索 - 相关推荐 兴趣点聚合 + i2i interest:global:category_level2:{cat_id}
购物车 - 可能喜欢 兴趣点聚合(cart) interest:cart:customer_type:{type}
新品推荐 兴趣点聚合(new) interest:new:platform:{platform}

配置调优参数

时间相关

  • LOOKBACK_DAYS: 730 (2年)
  • RECENT_DAYS: 180 (热门商品统计)
  • NEW_DAYS: 90 (新品定义)
  • decay_factor: 0.95 (时间衰减)

算法相关

  • Swing alpha: 0.5
  • W2V vector_size: 128
  • W2V window_size: 5
  • DeepWalk num_walks: 10
  • DeepWalk walk_length: 40

输出相关

  • i2i top_n: 50
  • 兴趣点 top_n: 1000

性能优化要点

  1. Swing算法: 使用C++版本可提升10倍性能
  2. 并行化: 将不同算法分配到不同机器
  3. 增量更新: 只更新变化的部分
  4. 数据采样: 调试时使用采样数据
  5. 批量加载: Redis使用pipeline批量加载

监控指标

  • 任务执行时间
  • 生成索引数量
  • Redis内存占用
  • 推荐点击率
  • 推荐转化率