为何Gensim fastText模型无法在新语料上继续训练?
Gensim续训fastText模型未新增词汇问题的解决方法
问题根源
有两个关键环节被遗漏:
1. 文本预处理未清理标点
原语料中的"Wagagamagga,"带有逗号,直接split后得到的是"Wagagamagga,"而非"Wagagamagga",你检查的是不带逗号的单词,自然找不到匹配项。
2. 续训时未指定新词汇的最小出现次数
Gensim的fastText在更新词汇表(update=True)时,新词汇的min_count默认继承原模型的设置。如果原模型的min_count大于1(比如很多预训练模型默认值为5),仅出现1次的"Wagagamagga"会被过滤,无法加入词汇表。
修正后的代码
步骤1:正确预处理语料(清理标点)
import re from gensim.models.fasttext import load_facebook_model from gensim.test.utils import datapath # 创建并预处理语料:去除标点后分词 corpus = [ "The brown dog jumps over the kangaroo", "I want to ride my bicycle to Mount Everest", "What a lovely day it is", "When I Wagagamagga, everybody stops to listen" ] # 移除所有非字母数字、非空格的字符 corpus = [re.sub(r'[^\w\s]', '', sentence).split() for sentence in corpus]
步骤2:加载模型并续训(指定min_count=1)
# 加载预训练模型 model = load_facebook_model(datapath("crime-and-punishment.bin")) # 更新词汇表时指定min_count=1,确保单次出现的新词被保留 model.build_vocab(corpus, update=True, min_count=1) # 执行续训 model.train(corpus, total_examples=len(corpus), epochs=model.epochs)
验证结果
此时执行'Wagagamagga' in model.wv.key_to_index会返回True。
补充说明
- 如果你的语料中有更多复杂的标点或特殊字符,建议使用更专业的分词工具(如nltk的WordPunctTokenizer)进行预处理,确保词汇的准确性。
- 续训时的
epochs参数可以根据需求调整,原模型的epochs可能较小,适当增加可以让新词的嵌入更稳定。
内容的提问来源于stack exchange,提问作者Data
相关产品推荐
相关产品推荐

