复制gensim word2vec的嵌入

时间:2019-06-14 03:52:24

标签: gensim word2vec word-embedding

我想看看我是否可以不用培训就简单地为gensim的Word2Vec设置新的权重。我从scikit-learn(从sklearn.datasets导入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上发布了此问题,但未得到任何回复,希望在这里能有更好的运气。

1 个答案:

答案 0 :(得分:1)

通常,您的方法应该有效。

您遇到的特定问题很可能是由于您执行了额外的探测步骤而没有在代码中显示的,因为您没有理由认为它很重要:某种类似most_similar()的操作在model_w2v_new呼叫后{strong>之后,但在以后发生故障的操作之前

传统上,build_vocab()计算对已标准化为单位长度的矢量版本进行操作。第一次需要使用这些单位归一化向量,然后对其进行计算,然后将其缓存在模型中。因此,如果您随后将原始向量替换为其他值,但不丢弃这些缓存的值,则会看到类似报告的结果-本质上是随机的,反映了随机初始化但从未训练过的初始向量值。

如果发生这种情况,仅丢弃缓存的值将导致下一个most_similar()正确地刷新它们,然后您应该获得期望的结果:

most_similar()