如何用另一个模型的词汇表初始化gensim模型?

时间:2019-12-18 18:15:49

标签: python nlp gensim

我正在训练大型语料库上的一些嵌入。我从gensim的文档中了解到,它在开始训练之前就建立了词汇表。以我为例,建立词汇表需要很多小时。我想通过重用第一个模型中的词汇来节省时间。我怎样才能做到这一点? .build_vocab方法不能从另一个模型中获取vocabulary对象。

这是一个虚拟的例子:

from gensim.models import FastText, Word2Vec
sentences = ["where are my goats", "yay i found my goats"]
m1 = Word2Vec(sentences, size  = 3)
m2 = Word2Vec(size = 4)
m2.build_vocab(m1.vocabulary) # doesn't work

2 个答案:

答案 0 :(得分:0)

基于this bug(“不可能重新使用用scan_vocab构建的词汇表”),我认为目前无法实现。

答案 1 :(得分:0)

build_vocab()说,要调查一个文本语料库并从该语料库配置模型的词汇表-这样就不会占用另一个模型的内部状态。

但是您可以:

  • 在词汇发现后保存模型,以供以后重用;或
  • 只需根据需要直接修改任何模型,即可模仿他人的状态

例如,考虑一个初始会话:

vocab_model = Word2Vec(size=3)
vocab_model.build_vocab(sentences)
vocab_model.save('vocab_initialized_but_untrained_model.w2v')

现在,您可以立即继续训练该模型...

vocab_model.train(sentences, total_examples=vocab_model.corpus_count, epochs=10)

...然后也许还可以和.save()一起使用该训练过的模型进行其他工作。

但是随后,您也可以简单地重新加载词汇表初始化的模型并进行其他修补/训练:

prior_model = Word2Vec.load('vocab_initialized_but_untrained_model.w2v')
// more operations on that model

此外,您始终可以按自己的意愿直接修改模型的各个部分–尽管在某些情况下,这可能会破坏现有代码对模型状态的期望。例如:

source_model = Word2Vec.load('original_model.w2v')
new_model = Word2Vec(size=4)
new_model.vocabulary = source_model.vocabulary

(您可能还需要复制其他字段,以模仿第一个模型初始化的所有效果,并可能用新的build_vocab()重新触发size的最终步骤/ modes。请参见源代码,尤其是与_weights(prepare_有关的方法。)