如何在新词上训练现有的 word2vec gensim 模型?

数据挖掘 Python word2vec gensim
2021-09-28 03:29:03

根据 gensim docs,您可以采用现有的 word2vec 模型并进一步训练它使用新词。

训练是流式的,这意味着句子可以是一个生成器,动态地从磁盘读取输入数据,而无需将整个语料库加载到 RAM 中。

这也意味着您可以稍后继续训练模型:

>>> model = Word2Vec.load("word2vec.model")
>>> model.train([["hello", "world"]], total_examples=1, epochs=1)

来源:文档

但是当我真正尝试它时,它似乎并没有学习新术语。

from gensim.models import Word2Vec

# initial a model
model = Word2Vec([["cat", "say", "meow"], ["dog", "say", "woof"]], min_count=1)

# count terms in model
print( len(model.wv.vocab) )

=> 5
# train existing model on new terms
model.train([['potoatoes', 'and', 'farmers']], total_examples=model.corpus_count, epochs=model.epochs)

# count terms in model
print( len(model.wv.vocab) )

=> 5

在第二个代码块中添加新术语后,模型仍然只有与以前相同数量的术语。

我怎样才能使这项工作?

4个回答

在使用新术语进行训练之前添加此行。

model.build_vocab([['potoatoes', 'and', 'farmers']], update=True)

训练结束后,

print(len(model.wv.vocab))
=> 8

我认为您无法在模型权重初始化后对词汇进行排序。在您的代码中,您尝试显示词汇的长度“print(len(model.wv.vocab))”它不会改变是正常的,因为您构建了在训练你的模型之前你的词汇量并没有改变。

我认为您的问题在于您赋予参数的价值total_examples

Trying give it: total_examples = 1,这是你打算训练的句子数。

from gensim.models import Word2Vec 

docs = [["cat", "say", "meow"], ["dog", "say", "woof"]]     
model = Word2Vec(common_texts, size = 100, window = 5, min_count = 1, workers = 4)

docs = [['potoatoes', 'and', 'farmers']]    
model.train(docs, total_examples = len(docs), epochs = 10)

今天我遇到了同样的问题,我通过设置来解决它 model.min_count = 1

所以在我的情况下,完整的代码是

   def train_sentences(self, sentences: List[List[str]], epochs: int = 1) -> None:
        self.model.min_count = 1  # so even words that only appears once are used
        self.model.build_vocab(sentences=sentences, update=True)  # update = True ensures that words are added to vocab
        self.model.train(sentences=sentences, epochs=epochs, total_examples=len(sentences))

希望它可以帮助某人节省一些时间。