2016-11-07 171 views
12

在word2vec模型中,有两个线性转换将词汇空间中的一个词带到一个隐藏层(“in”向量),然后返回vocab空间(“out “矢量)。通常在训练后丢弃这个向量。我想知道在gensim python中访问out矢量有没有简单的方法?等同地,我如何访问out矩阵?gensim word2vec存取/导出向量

动机:我想实现这个最近的一篇文章中提出的观点:A Dual Embedding Space Model for Document Ranking

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

enter image description here

这里,输入层是尺寸$ V $,词汇大小,隐藏层是尺寸$ d $的,和一个输出层大小为$ V $。这两个矩阵是W_ {IN}和W_ {OUT}。 通常,word2vec模型只保留W_IN矩阵。这就是,在gensim训练word2vec模式后,你会得到什么返回东西,如:

模型[ '土豆'] = [ - 0.2,0.5,2,...]

如何访问或保留W_ {OUT}?这可能相当昂贵,我真的希望gensim中的一些内置方法能够做到这一点,因为我害怕如果我从头开始编写代码,它不会提供良好的性能。

+0

到目前为止您是否有任何代码? – rebeling

回答

5

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

link中挖掘他发布在word2vec源代码中,您可以更改syn1删除以满足您的需求。请记住在完成后删除它,因为它证明是一个记忆猪。

+2

谢谢!这看起来像我在找什么。为了解释答案,输入/输出嵌入如下: 输入:model.syn0, 输出:model.syn1,model.syn1neg –

0

下面的代码将启用保存/加载模型。它在内部使用pickle,可选地将模型的内部大型NumPy矩阵直接从磁盘文件映射到虚拟内存中,以进行进程间内存共享。

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

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

一些好的博客,讲述关于使用和示例代码库来启动该项目

安装参考here

希望这有助于!

+2

感谢您的回答。然而,这与我的问题完全没有关系。具体来说,在word2vec中有两个不同的单词向量(“in”和“out”),而word2vec只保留其中的一个(“in”)。我在问另一个。 –

0

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

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