【问题标题】:gensim word2vec accessing in/out vectorsgensim word2vec 访问输入/输出向量
【发布时间】:2017-03-20 09:59:52
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 目前有代码吗?

标签: python gensim


【解决方案1】:

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

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

【讨论】:

  • 谢谢!这看起来像我正在寻找的东西。套用答案,输入/输出嵌入是:输入:model.syn0,输出:model.syn1,model.syn1neg
  • 嘿@themistoklik 我有同样的问题,但我无法使用 syn1 访问较新的版本,如果有人可以指导我,那将非常有帮助。我在做 model.syn1[model.wv['word']]。我得到的错误是“Word2Vec 对象没有属性‘syn1’”
【解决方案2】:

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

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

model 是你训练好的 word2vec 模型。

【讨论】:

  • 这似乎不适用于最新版本的 word2vec
【解决方案3】:

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

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

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

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

安装参考here

希望对你有帮助!!!

【讨论】:

  • 感谢您的回答。然而,这与我的问题完全无关。特别是在 word2vec 中有两个不同的词向量(“in”和“out”),而 word2vec 只保留其中一个(“in”)。我在问另一个。
【解决方案4】:

在word2vec.py文件中,您需要进行此更改 在以下功能中,它目前返回“在”向量中。你想要“出来”矢量。 “IN”在SYN0对象中保存,并在SYN1NEG对象变量中保存“OUT”。

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

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2019-10-15
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多