我想看看我是否可以在没有训练的情况下简单地为 gensim 的 Word2Vec 设置新的权重。我从 scikit-learn(来自 sklearn.datasets import fetch_20newsgroups)获得了 20 个新闻组数据集,并在其上训练了一个 Word2Vec 实例:
model_w2v = models.Word2Vec(sg = 1, size=300)
model_w2v.build_vocab(all_tokens)
model_w2v.train(all_tokens, total_examples=model_w2v.corpus_count, epochs = 30)
这里 all_tokens 是标记化的数据集。然后我创建了一个新的 Word2Vec 实例,无需训练
model_w2v_new = models.Word2Vec(sg = 1, size=300)
model_w2v_new.build_vocab(all_tokens)
并将新 Word2Vec 的嵌入设置为第一个
model_w2v_new.wv.vectors = model_w2v.wv.vectors
大多数功能按预期工作,例如
model_w2v.wv.similarity( w1='religion', w2 = 'religions')
> 0.4796233
model_w2v_new.wv.similarity( w1='religion', w2 = 'religions')
> 0.4796233
和
model_w2v.wv.words_closer_than(w1='religion', w2 = 'judaism')
> ['religions']
model_w2v_new.wv.words_closer_than(w1='religion', w2 = 'judaism')
> ['religions']
和
entities_list = list(model_w2v.wv.vocab.keys()).remove('religion')
model_w2v.wv.most_similar_to_given(entity1='religion',entities_list = entities_list)
> 'religions'
model_w2v_new.wv.most_similar_to_given(entity1='religion',entities_list = entities_list)
> 'religions'
但是, most_similar 不起作用:
model_w2v.wv.most_similar(positive=['religion'], topn=3)
[('religions', 0.4796232581138611),
('judaism', 0.4426296651363373),
('theists', 0.43141329288482666)]
model_w2v_new.wv.most_similar(positive=['religion'], topn=3)
>[('roderick', 0.22643062472343445),
> ('nci', 0.21744996309280396),
> ('soviet', 0.20012077689170837)]
我错过了什么?
免责声明。我在datascience.stackexchange上发布了这个问题,但没有得到回应,希望在这里有更好的运气。
一般来说,你的方法应该有效。
很可能你遇到被你拿了并在代码中未示出的额外的探测步引起了特定的问题,因为你没有理由认为它显著:某种most_similar()
样操作上model_w2v_new
后,它的build_vocab()
电话,但前后期,故障操作。
传统上,most_similar()
计算对已归一化为单位长度的向量版本进行操作。第一次需要这些单位归一向量时,它们会被计算,然后缓存在模型中。因此,如果您随后将原始向量替换为其他值,但不丢弃这些缓存值,您将看到类似报告的结果——本质上是随机的,反映了随机初始化但从未训练过的起始向量值.
如果发生这种情况,只需丢弃缓存的值应该会导致下一个most_similar()
正确刷新它们,然后您应该得到您期望的结果:
model_w2v_new.wv.vectors_norm = None
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句