【问题标题】:What is the wmdistance for a word2vec model and for a doc2vec model in gensim?gensim 中 word2vec 模型和 doc2vec 模型的 wmdistance 是多少?
【发布时间】:2019-07-18 14:44:39
【问题描述】:

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

【问题讨论】:

    标签: gensim


    【解决方案1】:

    Word Mover 的距离始终基于文本中单词的单个词向量起作用。

    gensim Doc2Vec 类包含一个 wmdistance() 方法,该方法继承自与 Word2Vec 相同的超类,出于历史代码共享的原因。但是,在最近的 gensim 版本中,如果您使用该方法,您应该会收到弃用警告。调用它的正确方法是通过模型的wv 属性——这将是KeyedVectors 的一个实例——这应该清楚地表明在任何一种情况下都会发生同样的事情:正在咨询和馈送单个词向量进入相同的大规模杀伤性武器算法。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2019-05-26
      • 1970-01-01
      • 2021-03-09
      • 2020-08-01
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多