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:...

根本原因

数据类型不匹配导致名称映射失败:

  1. fetch_name_mappings() 从数据库获取的映射,key是字符串类型

    mappings['item'] = dict(zip(df['id'].astype(str), df['name']))
    # 结果: {'12345': '香蕉干', '67890': '芒果干', ...}
    
  2. item_name_map 从DataFrame创建的映射,key是整数类型

    item_name_map = dict(zip(df['item_id'].unique(), ...))
    # 结果: {12345: '香蕉干', 67890: '芒果干', ...}
    
  3. 更新操作失败

    name_mappings['item'].update(item_name_map)
    # int类型的key和str类型的key不匹配,实际上没有更新成功
    
  4. 查询时找不到

    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功能需要检查)

预防措施

为避免类似问题,建议:

  1. 统一数据类型约定

    • 所有ID映射的key统一使用字符串类型
    • 在debug_utils.py中明确文档说明
  2. 添加类型检查

    def safe_update_mapping(target_dict, source_dict):
       """安全更新映射,自动转换key类型"""
       for k, v in source_dict.items():
           target_dict[str(k)] = v
    
  3. 添加调试日志

    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
状态: ✅ 完全修复