可以在训练word2vec之前或之后设置嵌入的矩阵权重吗?

时间:2019-09-01 10:40:58

标签: python-3.x word2vec

我需要在训练后更改在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)]

如您所见,尽管通过随机数更改了嵌入矩阵,但我得到了相同的预测。

我在文档中没有任何方法可以进行此更改。

有可能吗?

2 个答案:

答案 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])