【问题标题】:Gensim: word mover distance with string as input instead of list of stringGensim:以字符串为输入而不是字符串列表的词移动距离
【发布时间】:2021-03-22 10:06:52
【问题描述】:

我试图找出 2 个句子的相似程度。 为此,我使用了 gensim word mover distance,因为我试图找到它的相似性,所以我喜欢它:

sim = 1 - wv.wmdistance(sentence_obama, sentence_president)

我输入的是 2 个字符串:

    sentence_obama = 'Obama speaks to the media in Illinois'
    sentence_president = 'The president greets the press in Chicago'

我使用的模型是您可以在网上找到的模型:word2vec-google-news-300 我用这段代码加载它:

wv = api.load("word2vec-google-news-300")

它给了我合理的结果。 这就是问题开始的地方。 对于我可以从文档here 中读到的内容,似乎 wmd 将字符串列表而不是像我这样的字符串作为输入!

def preprocess(sentence):
   return [w for w in sentence.lower().split() if w not in stop_words]

sentence_obama = preprocess(sentence_obama)
sentence_president = preprocess(sentence_president)
sim = 1 - wv.wmdistance(sentence_obama, sentence_president)

当我遵循文档时,我得到的结果真的不同:

wmd using string as input: 0.5562025871542842
wmd using list of string as input: -0.0174646259300113

我真的很困惑。为什么它使用字符串作为输入并且比我提供文档要求的效果更好?

【问题讨论】:

    标签: python nlp gensim


    【解决方案1】:

    该函数需要一个字符串标记列表来给出正确的结果:如果您对完整字符串的结果看起来不错,那纯属运气和/或评估不佳。

    那么:为什么你认为0.556-0.017 更有价值?

    由于将文本作为纯字符串传递意味着它们被解释为单字符列表,因此值将取决于两个文本中字母的不同程度 - 以及所有英文句子的事实大约相同长度的字母分布非常相似,这意味着在该错误下大多数文本将被评为非常相似。

    此外,与其他句子对相比,相似性或距离值主要具有意义,而不是来自不同过程的两个不同结果(其中一个基本上是随机的)。您不应将超过某个设定阈值或接近1.0 的绝对值视为绝对好。相反,您应该考虑两个相似性/距离值之间的相对差异,这意味着一对比另一对更相似/更远。

    最后:将距离(从0.0 表示最接近到无穷大表示最远)转换为相似度(通常从1.0 表示最相似到-1.00.0 表示最不相似) 不是通过您使用的公式similarity = 1.0 - distance 有用地完成的。因为距离可能大于 2.0,所以您可能与该方法有任意的负面相似性,并被愚弄认为 -0.017 (等)是不好的,因为它是负面的,即使它在所有可能的返回值上都相当好。

    在另一个 SO 问题中给出了一些更典型的距离相似度转换:

    How do I convert between a measure of similarity and a measure of difference (distance)?

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 2018-11-04
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2019-02-13
      • 2016-05-23
      相关资源
      最近更新 更多