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

Is it possible to set the matrix weights of embeddings before or after training 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)]

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

我在文档中没有找到任何方法来进行此更改。

有可能吗?

在 Python 中,您通常可以篡改对象的内部属性,因为没有 "protection" 使它们在外部代码中不可见或不可修改。

尝试分配给 w2v.wv.vectors(没有下划线 _vectors,就像您原来的问题一样)。

或者,直接指向单个向量:w2v.wv['mujer'] = np.random.rand(100).

这些应该改模型;然而 如果 你已经执行了 most_similar() (和相关功能),模型 缓存一些临时的,单位长度标准化vectors 的版本 – 并且您的直接篡改 不会 更新它。您可以使用以下方式清除此缓存:

del w2v.wv.vectors_norm

我已经找到了解决方案。设置好数组后直接使用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])