更新 gensim word2vec 模型

Posted

技术标签:

【中文标题】更新 gensim word2vec 模型【英文标题】:Update gensim word2vec model 【发布时间】:2014-04-02 23:34:11 【问题描述】:

我在 gensim 中有一个 word2vec 模型,训练了超过 98892 个文档。对于句子数组中不存在的任何给定句子(即我训练模型的集合),我需要使用该句子更新模型,以便下次查询它会给出一些结果。我是这样做的:

new_sentence = ['moscow', 'weather', 'cold']
model.train(new_sentence)

并将其打印为日志:

2014-03-01 16:46:58,061 : INFO : training model with 1 workers on 98892 vocabulary and 100 features
2014-03-01 16:46:58,211 : INFO : reached the end of input; waiting to finish 1 outstanding jobs
2014-03-01 16:46:58,235 : INFO : training on 10 words took 0.1s, 174 words/s

现在,当我用类似的 new_sentence 查询大多数肯定(如model.most_similar(positive=new_sentence))时,它会给出错误:

Traceback (most recent call last):
 File "<pyshell#220>", line 1, in <module>
 model.most_similar(positive=['moscow', 'weather', 'cold'])
 File "/Library/Python/2.7/site-packages/gensim/models/word2vec.py", line 405, in most_similar
 raise KeyError("word '%s' not in vocabulary" % word)
  KeyError: "word 'cold' not in vocabulary"

这表明“冷”这个词不是我训练事物的词汇的一部分(我是对的)吗?

所以问题是:如何更新模型,以便给出给定新句子的所有可能相似性?

【问题讨论】:

有人将 genism 的 Word2Vec 更新为 online Word2Vec。您可以在其中更新词汇表并使用在线学习学习新词汇。虽然我还没有尝试过,但请查看:rutumulkar.com/blog/2015/word2vec 【参考方案1】:

如果您的模型是使用 C 工具 load_word2vec_format 生成的,则无法更新该模型。请参阅在线培训Word2Vec Tutorial的word2vec教程部分:

请注意,无法使用生成的模型恢复训练 通过 C 工具 load_word2vec_format()。您仍然可以将它们用于 查询/相似性,但对培训至关重要的信息(词汇 树)在那里不见了。

【讨论】:

【参考方案2】:

    train() 期望输入的句子是序列,而不是一个句子。

    train() 仅限 updates weights 用于基于现有词汇表的现有特征向量。您不能使用train() 添加新词汇(=新特征向量)。

【讨论】:

那么如何添加新词汇呢?绝对不可能吗?谢谢 @Nacho, "The word2vec algorithm doesn’t support adding new words dynamically." 所以,不,除非您使用新词汇重新训练整个模型,否则这是不可能的。 警告:过时的答案,所以我不赞成这个答案,以允许***.com/a/40936428/1019952 的答案上升。或者请更新您的答案。【参考方案3】:

首先,您不能在预训练模型中添加新词。

但是,2014 年发布的“新”doc2vec 模型可以满足您的所有要求。您可以使用它来训练文档向量,而不是获取一组词向量然后将它们组合起来。 最好的部分是 doc2vec 可以在训练后推断出看不见的句子。虽然模型还是不能改变的,但是根据我的实验,你可以得到一个相当不错的推理结果。

【讨论】:

【参考方案4】:

问题是你不能用新的句子重新训练 word2vec 模型。只有 doc2vec 允许。试试 doc2vec 模型。

【讨论】:

【参考方案5】:

从gensim 0.13.3 开始,可以使用 gensim 进行 Word2Vec 的在线培训。

model.build_vocab(new_sentences, update=True)
model.train(new_sentences)

【讨论】:

由于某种原因,这实际上不起作用。 ***.com/questions/42357678/… 我没有遇到问题。这个周末我会试着看看你的 SO 帖子。 @chase 我回答了你的 SO 帖子【参考方案6】:

您可以添加到模型词汇表中,并使用 FastText 添加到嵌入中。

from gensim.models import FastText

Here 你可以看到一些 FastText 的例子。 Here 你可以看到如何使用 FastText 对 Out-of-vocabulary (OOV) 实例进行评分。

【讨论】:

以上是关于更新 gensim word2vec 模型的主要内容,如果未能解决你的问题,请参考以下文章

确保 gensim 为相同数据的不同运行生成相同的 Word2Vec 模型

用gensim学习word2vec

Gensim Word2Vec 从预训练模型中选择少量词向量

[Pytorch系列-57]:循环神经网络 - gensim.models.word2vec参数详解与构建词向量模型

Python gensim库word2vec的使用

Word2Vec模型参数 详解