我需要在训练后更改在word2vec中嵌入的矩阵。这是示例:
w2v=Word2Vec(sentences,size=100,window=1,min_count=1,negative=15,iter=3)
w2v.save("word2vec.model")
#Getting embedding matrix
embedding_matrix=w2v.wv.vectors
for p in ("mujer", "hombre"):
result=w2v.wv.similar_by_word(p)
print("Similar words from '",p,"': ",result[:3])
#Trying to set wights matrix
w2v.wv.vectors=np.random.rand(w2v.wv.vectors.shape[0],w2v.wv.vectors.shape[1])
print()
for p in ("mujer", "hombre"):
result=w2v.wv.similar_by_word(p)
print("Similar words from '",p,"': ",result[:3])
这是输出:
Similar words from ' mujer ': [('honra', 0.9999152421951294), ('muerte', 0.9998959302902222), ('contento', 0.999891459941864)]
Similar words from ' hombre ': [('valor', 0.9999064207077026), ('nombre', 0.9998984336853027), ('llegar', 0.9998887181282043)]
Similar words from ' mujer ': [('honra', 0.9999152421951294), ('muerte', 0.9998959302902222), ('contento', 0.999891459941864)]
Similar words from ' hombre ': [('valor', 0.9999064207077026), ('nombre', 0.9998984336853027), ('llegar', 0.9998887181282043)]
如您所见,尽管通过随机数更改了嵌入矩阵,但我得到了相同的预测。
我在文档中没有任何方法可以进行此更改。
有可能吗?
答案 0 :(得分:0)
在Python中,您通常可以篡改对象的内部属性,因为没有“保护”使它们在外部代码中不可见或不可修改。
尝试分配给w2v.wv.vectors
(如您的原始问题一样,不要下划线_vectors
)。
或者直接指向单个向量:w2v.wv['mujer'] = np.random.rand(100)
。
这些应该改变模型;但是如果您已经执行过most_similar()
(和相关功能),则模型 还会缓存{{1 }} –您直接篡改不会。您可以使用以下方法清除此缓存:
vectors
答案 1 :(得分:0)
我已经找到了解决方案。设置数组后,只需使用init_sims()函数即可。
w2v=Word2Vec(sentences,size=100,window=1,min_count=1,negative=15,iter=3)
w2v.save("word2vec.model")
#Getting embedding matrix
embedding_matrix=w2v.wv.vectors
for p in ("mujer", "hombre"):
result=w2v.wv.similar_by_word(p)
print("Similar words from '",p,"': ",result[:3])
#Setting new values on wights matrix
w2v.wv.vectors=np.random.rand(w2v.wv.vectors.shape[0],w2v.wv.vectors.shape[1])
#This line create a l2 normalization over the embedding matrix
word_vectors.vectors_norm=word_vectors.init_sims(replace=False)
print()
for p in ("mujer", "hombre"):
result=w2v.wv.similar_by_word(p)
print("Similar words from '",p,"': ",result[:3])