[英]How to manually change the vector dimensions of a word in Gensim Word2Vec
我有一个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...]
现在我有一个合适的矢量表示,我想用word替换word_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
对象不支持通过其单词索引直接分配新值。
但是,就像在Python中一样,它的所有内部结构都是完全可见/可篡改的,并且由于它是开源的,您可以准确地查看它如何完成所有现有功能,并将其用作如何使用的模型做新事物。
具体来说,原始的单词向量是(在最新版本的gensim中)存储在Word2Vec
对象的一个名为wv
的属性中,而这个wv
属性是KeyedVectors
一个实例。 如果你检查它的源代码,你可以看到通过字符串键(例如'boy'
)访问字向量,包括__getitem__()
方法实现的[]
-indexing,通过它的方法word_vec()
。 您可以在本地安装或Github中查看该方法的来源:
在那里你会看到单词实际上转换为整数索引(通过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']
未来访问将返回您更新的值。
笔记:
•如果您希望更新syn0norm
,以获得正确的单位标准向量(如在most_similar()
和其他操作中使用的most_similar()
),最好先修改syn0
,然后通过以下方式丢弃并重新计算syn0norm
:
word_vectors.wv.syn0norm = None
word_vectors.wv.init_sims()
•添加新单词需要更多涉及对象篡改,因为它需要增加syn0
(用更大的数组替换它),并更新vocab
词典
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.