gensim word2vec 访问 in/out 个向量

gensim word2vec accessing in/out vectors

在 word2vec 模型中,有两个线性变换,将 vocab space 中的单词带到隐藏层("in" 向量),然后返回到 vocab space("out" 向量)。通常这个输出向量在训练后被丢弃。我想知道是否有一种简单的方法可以访问 gensim python 中的输出向量?等价地,我如何访问输出矩阵?

动机:我想实现这篇论文中提出的想法:A Dual Embedding Space Model for Document Ranking

这里有更多详细信息。从上面的参考我们有以下 word2vec 模型:

这里,输入层的大小为 $V$,词汇表的大小,隐藏层的大小为 $d$,输出层的大小为 $V$。这两个矩阵是 W_{IN} 和 W_{OUT}。 通常,word2vec模型只保留W_IN矩阵。这是返回的内容,在 gensim 中训练 word2vec 模型后,您会得到如下内容:

model['potato']=[-0.2,0.5,2,...]

如何访问或保留 W_{OUT}?这可能在计算上非常昂贵,我真的希望 gensim 中的一些内置方法可以做到这一点,因为我担心如果我从头开始编写代码,它不会提供良好的性能。

以下代码将启用 save/load 模型。它在内部使用 pickle,可选择将模型的内部大型 NumPy 矩阵直接从磁盘文件映射到虚拟内存,以实现进程间内存共享。

model.save('/tmp/mymodel.model')
new_model = gensim.models.Word2Vec.load('/tmp/mymodel')

一些背景信息 Gensim 是一个免费的 Python 库,旨在处理原始的、非结构化的数字文本(“纯文本”)。 gensim 中的算法,例如潜在语义分析、潜在狄利克雷分配和随机投影,通过检查训练文档语料库中单词的统计共现模式来发现文档的语义结构。

一些很好的博客描述了启动项目的使用和示例代码库

安装参考here

希望对您有所帮助!!!

虽然这可能不是一个正确的答案(还不能发表评论)并且没有人指出这一点,但请看一下 here。创作者似乎回答了类似的问题。这也是您更有可能获得有效答案的地方。

深入研究他在 word2vec 源代码中发布的 link,您可以更改 syn1 删除以满足您的需要。请记住在完成后将其删除,因为它被证明是一个内存占用。

在 word2vec.py 文件中您需要进行此更改 在以下函数中,它当前 returns "in" 向量。正如你想要的 "out" 向量。 "in" 保存在 syn0 对象中,"out" 保存在 syn1neg 对象变量中。

def save_word2vec_format(self, fname, fvocab=None, binary=False):
  ....
  ....
  row = self.syn1neg[vocab.index]

要获取任何单词的 syn1,这可能有效。

model.syn1[model.wv.vocab['potato'].point]

其中模型是您训练的 word2vec 模型。