5ab1c29c
tangwang
first commit
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
|
# 项目目录结构
```
/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内存占用
- 推荐点击率
- 推荐转化率
|