2017-03-02 137 views
1

我想使用word2vec的输出嵌入,如this paper (Improving document ranking with dual word embeddings)如何在gensim word2vec中访问输出嵌入(输出向量)?

我知道输入矢量在syn0中,输出矢量在syn1和syn1neg如果负采样。

但是,当我计算最相似的输出向量,我得到了一些范围相同的结果,因为删除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模块可以获得输出嵌入。

回答

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”相似性,因为它是有用的。 (这会是最相似的矢量给出一个所述OUT矢量。)

gensim的最新版本引入KeyedVectors类表示一组字的载体,通过串键控的,从特定Word2Vec模型分离或其他训练方法。您可能会创建一个额外的KeyedVectors实例,用syn1neg代替通常的syn0,以获得类似于目标向量的OUT向量列表(并因此计算top-n'IN-OUT'相似度或甚至'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'不同,没有一个地方可以读取这个矢量,意思是一个单词的输出,你可能必须计算/近似一些隐藏 - >输出权重集合,这会将这些多个输出节点驱动到正确的值。)

+0

你的代码奇妙地工作! 非常感谢你给我答案。 –