使用Gensim训练自定义Word2Vec模型时出现KeyError报错咨询
问题产生原因
核心问题是你传入Word2Vec的训练语料格式不符合要求:
- Gensim的Word2Vec要求输入的训练语料是分词后的嵌套列表结构,第一层是所有句子,第二层是每个句子拆分后的独立词汇列表。你直接传入了每行整句组成的
lines列表,每个元素是未拆分的字符串,Word2Vec会默认把字符串按单个字符迭代,将每个字符作为独立token录入词汇表,自然不会存在hello这类完整单词,所以调用时抛出KeyError。 - 次要问题:你代码中已经做了语句长度过滤的逻辑,但是训练时没有用到清洗后的
input_texts、target_texts,反而直接用了原始的lines,也可能引入空行、格式错误行影响训练效果。 - 附加兼容问题:如果你的Gensim版本是4.0及以上,旧版本的
size参数已经被废弃,替换为vector_size,参数不兼容也可能导致训练不符合预期。
修复方案
按如下步骤修改代码即可:
- 先对所有有效语句做分词处理,生成符合要求的嵌套列表结构语料
- 用清洗后的有效语料训练模型,适配对应版本的参数
- 跳过空行、格式错误的异常数据,避免训练异常
修复后的完整代码示例:
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
相关产品推荐
相关产品推荐

