-2

我试过一个,例如,

“积极”和“消极”它们不是相似的词,而是相反,但 spaCy 仍然给我 81% 的相似度。

这是我的代码,

import spacy

nlp = spacy.load('en_core_web_lg')
word1 = nlp(u'negative')
word2 = nlp(u'positive') 
word1_word2 = word1.similarity(word2)

print(word1_word2)
4

1 回答 1

3

通常,像这样的词相似度是使用它们对应的词向量之间的余弦相似度来计算的。在相同的上下文中经常使用的词最终在向量空间中的相似位置,假设使用相似的词意味着相似的东西。例如,King 和 Queen 可能相似,King 和 Man 可能相似,但 Queen 和 Man 应该不那么相似(尽管它们仍然都指“人”,而且它们都是名词,所以它们可能仍然比例如 Man 和 Combusted 更相似)。

您希望这些词('Positive' 和 'Negative')彼此否定(余弦相似度为 -1),但它们是相似的,因为它们几乎完全相同,除了一个是另一个的否定。全局语义向量空间包含更多的想法,而不仅仅是否定,因此这两个词最终在其他方面非常相似。您可以做的是计算它们的平均向量,然后Positive -> average = - (Negative -> average),并且该差异向量Positive -> average(或更准确地说,"Positive" - ("Positive" - "Negative") / 2)将近似于您特别感兴趣的否定概念。也就是说,您可以将该向量添加到其他情况也否定它们,例如"Yes" + ("Negative" - "Positive") ~= "No"

所有这一切只是说,您观察到的效果不是 Spacy 的错误,您不会通过使用 Gensim 或 Sklearn 来避免它,这是由于“相似性”在这种情况下的含义的性质。如果您想要单词之间更易于理解、人工设计的语义关系,请考虑查看 WordNet,它是手动创建的,并且更有可能在您的两个单词之间明确地具有某种“否定”关系。

于 2018-10-29T16:11:14.757 回答