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

使用Gensim训练自定义Word2Vec模型时出现KeyError报错咨询

问题产生原因

核心问题是你传入Word2Vec的训练语料格式不符合要求:

  • Gensim的Word2Vec要求输入的训练语料是分词后的嵌套列表结构,第一层是所有句子,第二层是每个句子拆分后的独立词汇列表。你直接传入了每行整句组成的lines列表,每个元素是未拆分的字符串,Word2Vec会默认把字符串按单个字符迭代,将每个字符作为独立token录入词汇表,自然不会存在hello这类完整单词,所以调用时抛出KeyError。
  • 次要问题:你代码中已经做了语句长度过滤的逻辑,但是训练时没有用到清洗后的input_texts、target_texts,反而直接用了原始的lines,也可能引入空行、格式错误行影响训练效果。
  • 附加兼容问题:如果你的Gensim版本是4.0及以上,旧版本的size参数已经被废弃,替换为vector_size,参数不兼容也可能导致训练不符合预期。
修复方案

按如下步骤修改代码即可:

  1. 先对所有有效语句做分词处理,生成符合要求的嵌套列表结构语料
  2. 用清洗后的有效语料训练模型,适配对应版本的参数
  3. 跳过空行、格式错误的异常数据,避免训练异常

修复后的完整代码示例:

from google.colab import files
from gensim.models import Word2Vec

uploaded = files.upload()
data_path = 'chatbot_dataset.txt'
# 此处替换为你自己定义的MAX_SENTENCE_LENGTH数值
MAX_SENTENCE_LENGTH = 20
input_texts = []
target_texts = []
train_corpus = []

with open(data_path, 'r') as f:
    lines = f.read().split('\n')

for line in lines:
    # 跳过空行
    if not line.strip():
        continue
    line_parts = line.split('\t')
    # 跳过没有tab分隔、格式错误的行
    if len(line_parts) < 2:
        continue
    input_text = line_parts[0]
    input_words = input_text.split()
    # 过滤过长语句
    if len(input_words) > MAX_SENTENCE_LENGTH:
        continue
    target_text = '<START> ' + line_parts[1] + ' <END>'
    target_words = target_text.split()
    # 存储处理后的文本
    input_texts.append(input_text)
    target_texts.append(target_text)
    # 把分词后的语句加入训练语料
    train_corpus.append(input_words)
    train_corpus.append(target_words)

# 训练模型,Gensim4.x及以上用vector_size指定向量维度
model = Word2Vec(train_corpus, min_count=1, workers=3, vector_size=100, window=3, sg=1)
# 测试获取词向量
print(model.wv.get_vector('hello'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:03