FIX_NAME_MAPPING.md
4.44 KB
商品名称映射问题修复
问题描述
在Debug模式生成的明文文件中,商品名称显示为"Unknown":
[7] i2i:swing:3667845
--------------------------------------------------------------------------------
1. ID:3588590(Unknown) - Score:0.2857
2. ID:3623446(Unknown) - Score:...
根本原因
数据类型不匹配导致名称映射失败:
fetch_name_mappings() 从数据库获取的映射,key是字符串类型:
mappings['item'] = dict(zip(df['id'].astype(str), df['name'])) # 结果: {'12345': '香蕉干', '67890': '芒果干', ...}item_name_map 从DataFrame创建的映射,key是整数类型:
item_name_map = dict(zip(df['item_id'].unique(), ...)) # 结果: {12345: '香蕉干', 67890: '芒果干', ...}更新操作失败:
name_mappings['item'].update(item_name_map) # int类型的key和str类型的key不匹配,实际上没有更新成功查询时找不到:
name = name_mappings.get('item', {}).get(str(item_id), 'Unknown') # 将int的item_id转为str查询,但dict中只有int类型的key,所以返回'Unknown'
修复方案
方法1:统一转为字符串(已采用)
# 修改前
item_name_map = dict(zip(df['item_id'].unique(), df.groupby('item_id')['item_name'].first()))
# 修改后(key转为字符串)
item_name_map = dict(zip(df['item_id'].unique().astype(str), df.groupby('item_id')['item_name'].first()))
方法2:update时转换(备选)
# 转换key类型后再更新
name_mappings['item'].update({str(k): v for k, v in item_name_map.items()})
验证修复
修复后运行debug模式:
cd /home/tw/recommendation/offline_tasks
python3 scripts/i2i_swing.py --lookback_days 7 --top_n 10 --debug
检查明文文件:
more output/debug/i2i_swing_*_readable.txt
应该看到:
[7] i2i:swing:3667845(商品名称)
--------------------------------------------------------------------------------
1. ID:3588590(香蕉干) - Score:0.2857
2. ID:3623446(芒果干) - Score:0.2143
数据库字段确认
正确的查询关系:
SELECT
pgs.id as 'sku_id',
pgs.name as '商品名称',
ss.name as '供应商名称',
pc_1.name as '一级类目',
pc_2.name as '二级类目'
FROM prd_goods_sku pgs
LEFT JOIN sup_supplier ss ON pgs.supplier_id = ss.id
LEFT JOIN prd_category pc_1 ON ...
其他脚本
这个问题也可能存在于其他脚本,需要同样修复:
- ✅ i2i_swing.py (已修复)
- ⚠️ i2i_session_w2v.py (如果有debug功能需要检查)
- ⚠️ i2i_deepwalk.py (如果有debug功能需要检查)
- ⚠️ i2i_content_similar.py (如果有debug功能需要检查)
- ⚠️ interest_aggregation.py (如果有debug功能需要检查)
预防措施
为避免类似问题,建议:
统一数据类型约定:
- 所有ID映射的key统一使用字符串类型
- 在debug_utils.py中明确文档说明
添加类型检查:
def safe_update_mapping(target_dict, source_dict): """安全更新映射,自动转换key类型""" for k, v in source_dict.items(): target_dict[str(k)] = v添加调试日志:
if debug: logger.debug(f"更新前: {len(name_mappings['item'])} 个名称") name_mappings['item'].update(item_name_map) logger.debug(f"更新后: {len(name_mappings['item'])} 个名称")
状态: ✅ 已修复
影响范围: i2i_swing.py
修复时间: 2025-10-16
补充修复 - 主输出文件
问题同样存在于主输出文件中:
1070176 Unknown 2786217:0.4000
2786217 Unknown 1070176:0.4000
原因
主输出代码中使用整数item_id作为key查询:
for item_id, sims in result.items():
item_name = item_name_map.get(item_id, 'Unknown') # item_id是int,但map的key是str
修复
统一转换为字符串:
for item_id, sims in result.items():
item_name = item_name_map.get(str(item_id), 'Unknown') # 转换为字符串查询
验证
# 重新运行
python3 scripts/i2i_swing.py --lookback_days 7 --top_n 10
# 检查输出
more output/i2i_swing_20251016.txt
应该看到:
1070176 商品名称A 2786217:0.4000
2786217 商品名称B 1070176:0.4000
更新时间: 2025-10-16 20:30
状态: ✅ 完全修复