【问题标题】:How can I access output embedding(output vector) in gensim word2vec?如何访问 gensim word2vec 中的输出嵌入(输出向量)?
【发布时间】:2017-07-22 02:41:22
【问题描述】:

我想使用 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 模块可以获得输出嵌入。

【问题讨论】:

    标签: python numpy gensim word2vec


    【解决方案1】:

    带有否定抽样,syn1neg权重是每字,与syn0的顺序相同。

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

    以更明显的含义选择中频单词,您可能会获得更有意义的结果(如果您的语料库/设置/需求充分地就像“双字嵌入式”纸张)的纸张)。例如,您可能想要比较:

    model.most_similar('cousin')
    

    ... ...

    model.most_similar(positive=[model.syn1neg[model.vocab['cousin'].index])
    
    但是,在所有情况下,现有的most_similar()方法只查找syn0 - “在”纸术语中的类似vectors。因此,我相信上面的代码只会真正计算论文可能呼叫的相似性:其中在向量中的列表与给出的向量最相似。它们似乎似乎扭转了“出于脱离”的相似性,作为有用的东西。 (这是与向量中给出的out vectors。)

    最新版本的gensim介绍了一个KeyedVectors class,用于表示一组字向量,由字符串键入字符串,与特定Word2VEC模型或其他训练方法分开。您可能会在syn1neg中替换syn0,以获取类似于目标向量的syn0的额外syn0,以获取类似于目标向量的向量-out'相似之处)。

    例如,这个可能 em>工作(我没有测试它):

    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不同,没有一个地方来读取载体的一个地方单个单词的输出。您可能必须计算/近似一些隐藏 - >输出权重,将这些多个输出节点驱动到右值。)

    【讨论】:

    • 您的代码饰有奇妙!!非常感谢你给我答案。 span>
    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 2019-10-15
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多