在word2vec gensim模型中添加单词嵌入

时间:2017-04-24 21:43:50

标签: python nlp word2vec

我正在寻找一种方法来将预先训练过的单词向量添加到word2vec gensim模型中。

我在txt(单词及其嵌入)中有一个预先训练过的word2vec模型,我需要在特定语料库中的文档之间获取Word Mover的距离(例如通过gensim.models.Word2Vec.wmdistance)新文件。

为了防止需要加载整个词汇表,我想只加载在语料库中找到的预训练模型的单词的子集。但是,如果新文档中的单词在语料库中找不到,但它们在原始模型中,则将它们添加到模型中,以便在计算中考虑它们。

我想要的是节省内存,以及可能对我有帮助的事情:

  • 有没有办法直接将单词向量添加到模型中?
  • 有没有办法从矩阵或其他对象加载到gensim?我可以在RAM中使用该对象,并在将它们加载到模型中之前将其附加到新的单词
  • 我不需要它在gensim上,所以如果你知道一个不同的WMD实现,它可以将向量作为输入来工作(虽然我确实需要用Python)

提前致谢。

1 个答案:

答案 0 :(得分:2)

方法1:

您可以只使用gensim.models.keyedvectors中的keyedvectors。它们非常易于使用。

from gensim.models.keyedvectors import WordEmbeddingsKeyedVectors

w2v = WordEmbeddingsKeyedVectors(50) # 50 = vec length
w2v.add(new_words, their_new_vecs)

方法2:

AND (如果您已经使用gensim.models.Word2Vec建立了模型,则可以执行此操作。假设我想添加带有随机向量的令牌<UKN>

model.wv["<UNK>"] = np.random.rand(100) # 100 is the vectors length

完整的示例如下:

import numpy as np
import gensim.downloader as api
from gensim.models import Word2Vec

dataset = api.load("text8")  # load dataset as iterable
model = Word2Vec(dataset)

model.wv["<UNK>"] = np.random.rand(100)