Gensim Word2Vec分文件训练大数据集时min_count规则是否生效?
问题背景
我尝试使用Gensim库训练Word2Vec模型,数据集约50GB,已拆分为50+个文件,采用如下代码分批次训练:首次处理文件时初始化并创建模型,后续文件则更新词汇表并继续训练同一模型。
if file_number == 0: model_domains = Word2Vec(domain_sentences, sg=1, hs=0, negative=5, vector_size=300, window=10, workers=16, min_count=50) else: model_domains.build_vocab(domain_sentences, update=True) model_domains.train(domain_sentences, total_examples=len(domain_sentences), epochs=model_domains.epochs)
我的疑问是:设置min_count=50意味着出现次数不超过50的词不会被纳入词向量训练,但由于数据拆分到多个文件,可能存在某个词在第一个文件出现30次、第二个文件出现25次的情况,此时Gensim是否会将该词纳入词向量训练?是否会考虑之前文件的数据来训练这类此前出现次数不足50的词?
回答
累计词频达标才会被纳入训练
Gensim的min_count参数判断的是全数据集的累计出现次数,而非单个文件的词频。如果某个词在所有已处理文件中的累计出现次数达到50,它就会被纳入词向量训练的词汇表。词汇表更新的时机
当你在后续文件调用build_vocab(domain_sentences, update=True)时,Gensim会统计当前文件的词频,并与模型已记录的全局词频累加。如果累加后的总次数≥min_count,该词会被加入模型的词汇表,之后的train()步骤会将其纳入训练,更新对应的词向量。训练的局限性
需要注意:新增的词(之前累计词频未达标的)在加入词汇表后,只会在后续的训练批次中得到向量更新,之前已经完成的训练轮次不会回溯重新计算它的向量。不过这是分批次训练的正常现象,对最终效果的影响通常在可接受范围内。
另外,你代码中train()时传入total_examples=len(domain_sentences)是正确的——在update=True的模式下,total_examples只需要传入当前批次的样本数量即可。
内容的提问来源于stack exchange,提问作者Gunjan Sarda

