# 项目目录结构 ``` /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) **核心逻辑**: ```python # 对于物品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` **输入**: 用户行为数据 + 用户特征 **核心逻辑**: ```python # 按维度聚合 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内存占用 - 推荐点击率 - 推荐转化率