如何访问 gensim word2vec 中的输出嵌入(输出向量)?
How can I access output embedding(output vector) in 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 模块可以获得输出嵌入。
使用负采样,syn1neg
权重是每个单词的,并且与 syn0
的顺序相同。
仅凭您的两个示例得出相似的结果并不一定表明有任何问题。默认情况下,单词按频率排序,因此早期单词(包括位置 0 和 50 的单词)是非常频繁的单词,具有非常通用的基于共现的含义(可能彼此都很接近)。
选择一个含义更明确的中频词,您可能会得到更有意义的结果(如果您的 corpus/settings/needs 与 'dual word embeddings' 论文中的那些足够相似)。例如,您可能想要比较:
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
class 来表示一组词向量,以字符串为键,与特定的 Word2Vec 模型或其他训练方法分开。您可能会创建一个额外的 KeyedVectors
实例,将通常的 syn0
替换为 syn1neg
,以获取类似于目标向量的 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
仅在使用分层抽样时存在,并且不太清楚单个单词的 "output embedding" 会在那里。 (有多个输出节点对应于预测任何一个单词,它们都需要更接近各自正确的 0/1 值才能预测单个单词。所以与 `syn1neg 不同,没有一个地方可以读取一个向量,这意味着单个单词的输出。您可能必须 calculate/approximate 一些隐藏->输出权重集,这些权重将驱动那些多个输出节点到正确的值。)
我想使用 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 模块可以获得输出嵌入。
使用负采样,syn1neg
权重是每个单词的,并且与 syn0
的顺序相同。
仅凭您的两个示例得出相似的结果并不一定表明有任何问题。默认情况下,单词按频率排序,因此早期单词(包括位置 0 和 50 的单词)是非常频繁的单词,具有非常通用的基于共现的含义(可能彼此都很接近)。
选择一个含义更明确的中频词,您可能会得到更有意义的结果(如果您的 corpus/settings/needs 与 'dual word embeddings' 论文中的那些足够相似)。例如,您可能想要比较:
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
class 来表示一组词向量,以字符串为键,与特定的 Word2Vec 模型或其他训练方法分开。您可能会创建一个额外的 KeyedVectors
实例,将通常的 syn0
替换为 syn1neg
,以获取类似于目标向量的 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
仅在使用分层抽样时存在,并且不太清楚单个单词的 "output embedding" 会在那里。 (有多个输出节点对应于预测任何一个单词,它们都需要更接近各自正确的 0/1 值才能预测单个单词。所以与 `syn1neg 不同,没有一个地方可以读取一个向量,这意味着单个单词的输出。您可能必须 calculate/approximate 一些隐藏->输出权重集,这些权重将驱动那些多个输出节点到正确的值。)