复制 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
我想看看我是否可以在没有训练的情况下简单地为 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