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

ear*_*dil 5 python nlp word2vec

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

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

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

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

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

提前致谢.

Pey*_*man 2

方法一:

您可以只使用来自 的keyedvectorsgensim.models.keyedvectors。它们非常容易使用。

from gensim.models.keyedvectors import WordEmbeddingsKeyedVectors

w2v = WordEmbeddingsKeyedVectors(50) # 50 = vec length
w2v.add(new_words, their_new_vecs)
Run Code Online (Sandbox Code Playgroud)

方法二:

如果您已经使用它构建了模型,gensim.models.Word2Vec则可以这样做。假设我想添加<UKN>带有随机向量的标记。

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

完整的例子是这样的:

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)
Run Code Online (Sandbox Code Playgroud)