在 gensim 中,word2vec 模型和 doc2vec 模型的 wmdistance 是多少?



我想比较两个字符串之间的相似性,我可以用 word2vec 模型或 gensim 中的 doc2vec 模型计算 wmd 距离。但是我不明白 wmd 如何适用于 doc2vec 模型。

def preprocess(doc):    
return doc.lower().split()
s1 = 'i would like five rooms'
s2 = 'i would like four rooms'
s1 = preprocess(s1)
s2 = preprocess(s2)
model1 = gensim.models.KeyedVectors.load_word2vec_format(word2vec_model, binary = False) 
d1 = model1.wmdistance(s1, s2)
print('wmd distance using a word2vec model:', d1)
model2 = gensim.models.Doc2Vec.load(doc2vec_model)
d2 = model2.wmdistance(s1, s2)
print('wmd distance using a doc2vec model:', d2)
# wmd distance using a word2vec model: 0.502799493163681
# wmd distance using a doc2vec model: 0.008121068463511764

wmd 是否仍然像使用 word2vec 模型一样从 doc2vec 模型中获取每个单词的单词嵌入?与word2vec模型或doc2vec模型计算WMD距离没有区别吗?在下面的示例中,从这两个模型计算出的 wmd 距离非常不同,这是为什么?我了解 wmd 通常如何为两句话工作,但我只是无法弄清楚它如何适用于 doc2vec 模型。如果有人能帮助我理解它,我将不胜感激。

单词移动器的距离始终基于文本中单词的各个单词向量工作。

gensimDoc2Vec类包括一个wmdistance()方法,从与Word2Vec相同的超类继承而来,出于历史代码共享的原因。但是,在最近的 gensim 版本中,如果您使用该方法,您应该会收到弃用警告。调用它的正确方法是通过模型的wv属性 - 这将是KeyedVectors的一个实例 - 这应该清楚地表明在这两种情况下都发生了同样的事情:单个词向量被查询并输入到相同的WMD算法中。

但是,请注意,只有一些Doc2Vec模式(但不是全部!)会训练有用的词向量。不幸的是,同样出于历史代码共享的原因,不训练词向量的Doc2Vec模式(纯PV-DBOW,dm=0)仍将在model.wv属性中留下随机初始化的词向量。

从您显示的结果来看,您使用的一个或另一个模型可能缺少相关单词,或者功效严重不足。如果他们都对你的测试文本中的所有单词都有类似的训练有素的词向量,我希望WMD的结果会更相似。

最新更新