Python 如何手动更改Gensim Word2Vec中单词的向量维度
我有一个Word2Vec模型,其中包含很多单词向量。我可以访问一个单词向量Python 如何手动更改Gensim Word2Vec中单词的向量维度,python,vector,gensim,word2vec,vector-space,Python,Vector,Gensim,Word2vec,Vector Space,我有一个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...] 现在我有了一个合适的向量表示,我想用它来替换单词_vectors['boy'] word_vec
word_vectors = gensim.models.Word2Vec.load(wordspace_path)
print(word_vectors['boy'])
输出
[ -5.48055351e-01 1.08748421e-01 -3.50534245e-02 -9.02988110e-03...]
现在我有了一个合适的向量表示,我想用它来替换单词_vectors['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之外,在其他平台上也可以吗 由于word2vec向量通常仅通过迭代训练过程创建,然后访问,因此gensim
word2vec
对象不支持通过其word索引直接分配新值
然而,正如在Python中一样,它的所有内部结构都可以被您完全查看/篡改,并且由于它是开源的,您可以准确地查看它如何实现所有现有功能,并将其用作如何实现新功能的模型
具体地说,原始字向量(在gensim的最新版本中)存储在名为wv
的Word2Vec
对象的属性中,并且该wv
属性是KeyedVectors
的实例。如果您检查它的源代码,您可以看到通过字符串键(例如'boy'
)访问单词向量,包括通过[]
-通过\uu getitem\uuuuuuuuuuuu()
方法实现的索引来访问的单词向量,通过它的方法单词向量()
。您可以在本地安装或Github上查看该方法的源代码:
在这里,您将看到单词实际上被转换为整数索引(通过self.vocab[word].index
),然后用于访问内部syn0
或syn0norm
数组(取决于用户是访问原始向量还是单位规范化向量)。如果您在其他地方查看这些设置,或者只是在您自己的控制台/代码中检查它们(就像通过word\u 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\u vectors.wv['boy']
将返回您的更新值
注:
•如果您希望更新syn0norm
,以获得适当的单位赋范向量(如most\u similable()
和其他操作中所使用的),最好先修改syn0
,然后通过以下方式放弃并重新计算syn0norm
:
word_vectors.wv.syn0norm = None
word_vectors.wv.init_sims()
•添加新词需要更复杂的对象篡改,因为这需要增加syn0
(用更大的数组替换),并更新vocab
dict