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