如何在gensim word2vec中访问输出嵌入(输出向量)?

时间:2017-03-02 11:31:08

标签: python numpy gensim word2vec

我想使用word2vec的输出嵌入,例如this paper (Improving document ranking with dual word embeddings)

我知道输入向量在syn0中,输出向量在syn1中,如果是负采样则是syn1neg。

但是当我用输出向量计算most_similar时,由于删除了syn1或syn1neg,我在某些范围内得到了相同的结果。

这是我得到的。

IN[1]: model = Word2Vec.load('test_model.model')

IN[2]: model.most_similar([model.syn1neg[0]])

OUT[2]: [('of', -0.04402521997690201),
('has', -0.16387106478214264),
('in', -0.16650712490081787),
('is', -0.18117375671863556),
('by', -0.2527652978897095),
('was', -0.254993200302124),
('from', -0.2659570872783661),
('the', -0.26878535747528076),
('on', -0.27521973848342896),
('his', -0.2930959463119507)]

但另一个syn1neg numpy向量已经是类似的输出。

IN[3]: model.most_similar([model.syn1neg[50]])

OUT[3]: [('of', -0.07884830236434937),
('has', -0.16942456364631653),
('the', -0.1771494299173355),
('his', -0.2043554037809372),
('is', -0.23265135288238525),
('in', -0.24725285172462463),
('by', -0.27772971987724304),
('was', -0.2979024648666382),
('time', -0.3547973036766052),
('he', -0.36455872654914856)]

我希望在训练期间保留输出numpy数组(否定或不负)。

让我知道如何访问纯syn1或syn1neg或代码,或者某些word2vec模块可以获取输出嵌入。

1 个答案:

答案 0 :(得分:4)

对于负抽样,syn1neg权重为每个字,并且与syn0的顺序相同。

你的两个例子给出类似结果这一事实并不一定表明任何事情都是错误的。默认情况下,这些单词按频率排序,因此早期单词(包括位置0和50中的单词)是非常频繁的单词,具有非常一致的基于共生的含义(可能彼此接近)。

选择具有更明确含义的中频词,您可能会获得更有意义的结果(如果您的语料库/设置/需求与“双字嵌入&#;”论文的内容完全相同)。例如,您可能想要比较:

model.most_similar('cousin')

...与...

model.most_similar(positive=[model.syn1neg[model.vocab['cousin'].index])

但是,在所有情况下,现有most_similar()方法仅在syn0中查找类似向量 - ' IN'论文的术语载体。所以我相信上面的代码只会真正计算论文所称的内容' OUT-IN'相似性:IN向量与给定OUT向量最相似的列表。他们实际上似乎反过来说,' IN-OUT'相似性,有用的东西。 (这是与给定IN向量最相似的OUT向量。)

最新版本的gensim引入了一个KeyedVectors类,用于表示一组字符向量,由字符串键入,与特定的Word2Vec模型或其他训练方法分开。您可以创建一个额外的KeyedVectors实例,用syn0替换通常的syn1neg,以获取类似于目标向量的OUT向量列表(从而计算top-n' IN-OUT&-39;相似之处,甚至是&OUT-OUT'相似之处)。

例如,这个可能有效(我还没有测试过):

outv = KeyedVectors()
outv.vocab = model.wv.vocab  # same
outv.index2word = model.wv.index2word  # same
outv.syn0 = model.syn1neg  # different
inout_similars = outv.most_similar(positive=[model['cousin']])

syn1仅在使用分层抽样时才存在,并且不太清楚什么是"输出嵌入"因为一个单词会在那里。 (有多个输出节点对应于预测任何一个单词,并且它们都需要更接近其正确的0/1值来预测单个单词。因此与`syn1neg不同,没有一个地方可以阅读一个向量,表示单个单词的输出。您可能必须计算/近似一组隐藏的>输出权重,这些权重会将这些多个输出节点驱动到正确的值。)