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

时间:2019-07-18 14:44:39

标签: gensim

我想比较两个字符串之间的相似性,我可以用gensim中的word2vec模型或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模型中如何工作。如果有人可以帮助我理解它,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

gensim getName(Object o)类包含一个Doc2Vec方法,该方法继承了wmdistance()的同一超类,这是出于历史代码共享的原因。但是,在最新的gensim版本中,如果使用该方法,则应该收到弃用警告。调用它的正确方法是通过模型的Word2Vec属性(它将是wv的实例),这应该清楚说明在两种情况下都发生了相同的事情:单个单词向量是被咨询并输入相同的WMD算法。

但是,请注意,只有某些KeyedVectors模式(但不是全部!)会训练出有用的词向量。不幸的是,再次出于历史代码共享的原因,不训练单词向量(纯PV-DBOW,Doc2Vec)的Doc2Vec模式仍会在{中保留随机初始化的单词向量{1}}属性。

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