使用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
相关产品推荐
相关产品推荐

