调用Gensim Word2Vec的model.train()时训练词数为0的问题排查
解决Gensim Word2Vec训练时显示0有效词的问题
出现EPOCH 0: training on 0 raw words (0 effective words)提示,排除迭代器问题后,可按以下方向排查:
检查预处理后的输出是否为空
你的MyCorpus类里的正则替换可能把所有内容过滤掉了,导致分词后无有效词汇。在__iter__方法中添加打印语句,验证每一步的处理结果:def __iter__(self): for line in self.corpus: x = re.sub("(<br ?/?>)|([,.'])|([^ A-Za-z']+)", '', line.lower()) processed = utils.simple_preprocess(x) # 打印验证 print(f"原句片段: {line[:50]}... | 处理后文本: {x[:50]}... | 分词结果: {processed}") yield processed运行后如果所有
processed都是空列表,说明预处理规则有误。调整正则表达式
当前正则的第三个分组[^ A-Za-z']+会删除所有非英文、非空格、非单引号的字符,如果你的语料包含非英文内容(比如中文、数字),会被全部过滤。可以先简化预处理逻辑,直接测试:def __iter__(self): for line in self.corpus: yield utils.simple_preprocess(line.lower())如果这样能得到有效分词,再逐步调整正则保留必要字符。
检查min_count参数设置
如果w2v_min_freq值过高(比如设为5,但所有词汇出现次数都低于5),Gensim会过滤掉所有词汇,导致词汇表为空。先将min_count设为1,测试是否能正常训练:w2v_model = Word2Vec( sentences = sentences, vector_size = w2v_size, window = w2v_window, min_count = 1, # 临时设为1 workers = -1 )验证语料本身的有效性
确认corpus列表中的元素不是空字符串或全空白字符:# 检查前10条语料的非空白长度 print([len(line.strip()) for line in corpus[:10]])如果输出全为0,说明语料本身无有效内容。
手动构建词汇表排查
拆分初始化和训练步骤,先构建词汇表并查看大小:w2v_model = Word2Vec( vector_size = w2v_size, window = w2v_window, min_count = w2v_min_freq, workers = -1 ) w2v_model.build_vocab(sentences) print(f"词汇表大小: {len(w2v_model.wv)}") # 词汇表非空再训练 if len(w2v_model.wv) > 0: w2v_model.train(sentences, total_examples=w2v_model.corpus_count, epochs=w2v_model.epochs)若词汇表大小为0,问题出在语料或预处理;若大小正常,再执行训练即可。
内容的提问来源于stack exchange,提问作者Renan Klehm
相关产品推荐
相关产品推荐

