You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Word2Vec做商品推荐出现KeyError词汇不存在报错如何解决

问题根源

你的报错核心原因是训练Word2Vec的输入数据不符合预期,词表中根本不存在商品ID的向量:
你当前构造的purchases_train里存储的是每款商品对应的评论文本内容列表,Word2Vec训练后学习到的是评论里的单词的向量,而非商品ID的向量,你直接传入商品ID1077去模型中查询向量,自然会触发词表不存在的报错。

修复方案

分两种常见的商品推荐实现方向,可根据需求选择:

方案1:实现基于用户购买序列的Item2Vec推荐(符合原生Word2Vec做商品推荐的逻辑)

这种方案是把每个用户的购买商品ID序列作为训练语料,让Word2Vec学习商品ID的向量,相似ID对应的就是相似商品。
需要修改训练语料的构造逻辑,假设你的原始数据里有User ID字段标识用户:

purchases_train = []
# 按用户分组,取每个用户购买过的商品ID序列
for user_id, group in train_df.groupby('User ID'):
    # 可根据需求调整:按购买时间排序、去重等
    user_purchase_ids = group['Clothing ID'].astype(str).unique().tolist()
    if len(user_purchase_ids) >= 2: # 过滤只有单次购买的无效序列
        purchases_train.append(user_purchase_ids)

后续模型训练逻辑不需要修改,训练完成后就可以直接查询商品ID对应的向量。注意如果使用gensim 4.x版本,查询语法需要从model['1077']改为model.wv['1077']。

方案2:实现基于评论内容的相似商品推荐

如果你是想根据商品的评论内容相似度做推荐,不需要调整训练逻辑,只需要调整向量查询逻辑,将每个商品的所有评论词向量的平均值作为商品的整体向量:

def get_product_vec(product_id):
    # 取出该商品对应的所有评论内容
    reviews = products_dict.get(product_id, [])
    if not reviews:
        return None
    vecs = []
    for review in reviews:
        # 中文场景下这里替换为对应分词工具的调用
        words = review.split()
        for word in words:
            if word in model.wv:
                vecs.append(model[word])
    if not vecs:
        return None
    # 取所有词向量的平均值作为商品向量
    return sum(vecs) / len(vecs)

# 调用方式改为
product_vec = get_product_vec(1077)
if product_vec is not None:
    print(similar_products(product_vec))
额外注意事项
  • 所有商品ID统一转成字符串类型,避免数值型ID和字符串型ID不匹配的问题
  • 排查词表问题可以打印model.wv.index_to_key(gensim 4.x版本)或者model.wv.vocab.keys()(gensim 3.x版本),确认目标ID是否存在于词表中

内容的提问来源于stack exchange,提问作者Ghofi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 23:24:04