复制 gensim word2vec 的嵌入

Copying embeddings for gensim word2vec

我想看看我是否可以在没有训练的情况下简单地为 gensim 的 Word2Vec 设置新的权重。我从 scikit-learn (from sklearn.datasets import fetch_20newsgroups) 获取了 20 News Group 数据集,并在其上训练了一个 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 after 它的 build_vocab() 调用上的操作一样,但在 before 之后,操作出现故障。

传统上,most_similar() 计算在已归一化为 unit-length 的向量版本上运行。第一次需要这些 unit-normed 向量时,会计算它们,然后将它们缓存在模型中。因此,如果您随后将原始向量替换为其他值,但不丢弃那些缓存值,您将看到与您报告的结果类似的结果——本质上是随机的,反映了 randomly-initialized-but-never-trained 起始向量值。

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

model_w2v_new.wv.vectors_norm = None