我想比较两个字符串之间的相似性,我可以用word2vec模型或gensim中的doc2vec模型来计算wmd距离。但我不能理解doc2vec模型的wmd是如何工作的。
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.008121068463511764wmd是否仍然像word2vec模型那样,从doc2vec模型中获取每个单词的单词嵌入?计算wmd距离与word2vec模型或doc2vec模型没有区别吗?在下面的例子中,这两个模型计算出的wmd距离有很大的不同,为什么?我理解wmd通常是如何在两句话中工作的,但我就是不明白它在doc2vec模型中是如何工作的。如果有人能帮我理解一下,我将不胜感激。
发布于 2019-07-19 01:56:12
单词移位器的距离总是基于文本中单词的单个单词向量。
由于历史代码共享的原因,gensim Doc2Vec类包含一个wmdistance()方法,该方法继承自与Word2Vec相同的超类。但是,在最近的gensim版本中,如果使用该方法,您应该会收到一个弃用警告。调用它的正确方式是通过模型的wv属性-这将是KeyedVectors的一个实例-这应该清楚地表明,在任何一种情况下都会发生相同的事情:单个词向量正在被咨询&输入到相同的WMD算法中。
但是,请注意,只有部分Doc2Vec模式(但不是全部!)将训练出有用的词向量。不幸的是,同样由于历史代码共享的原因,不训练字向量(普通的PV-DBOW,dm=0)的Doc2Vec模式仍然会在model.wv属性中留下随机初始化的字向量。
从你显示的结果来看,你正在使用的一个或另一个模型可能缺少相关的单词,或者动力严重不足。如果他们对测试文本中的所有单词都有类似的训练有素的词向量,我预计WMD结果会更相似。
https://stackoverflow.com/questions/57097233
复制相似问题