代码之家  ›  专栏  ›  技术社区  ›  Saurav Mukherjee

如何手动更改Gensim Word2Vec中单词的向量维数

  •  4
  • Saurav Mukherjee  · 技术社区  · 8 年前

    我有一个Word2Vec模型,其中有很多词向量。我也可以访问文字向量。

    word_vectors = gensim.models.Word2Vec.load(wordspace_path)
    print(word_vectors['boy'])
    

    输出

    [ -5.48055351e-01   1.08748421e-01  -3.50534245e-02  -9.02988110e-03...]
    

    现在我有一个合适的向量表示,我想用它来替换单词_向量[boy]。

    word_vectors['boy'] = [ -7.48055351e-01   3.08748421e-01  -2.50534245e-02  -10.02988110e-03...]
    

    但是抛出了以下错误

    TypeError: 'Word2Vec' object does not support item assignment
    

    有什么时尚或变通方法可以做到这一点吗?也就是说,一旦训练了模型,就可以手动操作词向量?除了Gensim,在其他平台上也可以吗?

    1 回复  |  直到 8 年前
        1
  •  10
  •   gojomo    8 年前

    由于word2vec向量通常仅通过迭代训练过程创建,然后访问,因此gensim Word2Vec

    然而,正如在Python中一样,它的所有内部结构都可以被您完全查看/篡改,并且由于它是开源的,您可以确切地查看它如何实现其所有现有功能,并将其用作如何做新事情的模型。

    调用的对象 wv ,还有这个 wv公司 KeyedVectors . 如果您检查它的源代码,您可以看到通过字符串键(例如 'boy' ),包括 [] -索引由 __getitem__() word_vec() . 您可以在本地安装或Github上查看该方法的源代码:

    https://github.com/RaRe-Technologies/gensim/blob/c2201664d5ae03af8d90fb5ff514ffa48a6f305a/gensim/models/keyedvectors.py#L265

    在那里,你会看到单词实际上被转换成整数索引(通过 self.vocab[word].index syn0 syn0norm 数组(取决于用户是访问原始向量还是单位归一化向量)。如果您在其他地方查看这些设置,或者只是在您自己的控制台/代码中检查它们(就像通过 word_vectors.wv.syn0 ),你会看到这些是 numpy 阵列,其中 支持按索引直接分配。

    那么,你 可以 通过整数索引直接篡改其值,就像通过:

    word_vectors.wv.syn0[word_vectors.wv.vocab['boy'].index] = [ -7.48055351e-01   3.08748421e-01  -2.50534245e-02  -10.02988110e-03...]
    

    然后,未来的访问 word_vectors.wv['boy'] 将返回更新后的值。

    笔记:

    如果你想的话 待更新,以获得适当的单位赋范向量(如 most_similar() syn0 首先,然后丢弃并重新计算 Syn0范数 ,通过:

    word_vectors.wv.syn0norm = None
    word_vectors.wv.init_sims()
    

    添加新词将需要更多涉及的对象篡改,因为这将需要增加 syn0 (用更大的阵列替换),并更新 vocab 字典