Python 如何手动更改Gensim 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

我有一个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_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