我试过一个,例如
"阳性"one_answers"阴性"它们不是相似的词,相反,它们是相反的,但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)
通常,像这样的单词相似性是使用相应单词向量之间的余弦相似性来计算的。通常在相同上下文中使用的单词最终会在向量空间中的相似位置,前提是使用相似的单词意味着相似的东西。例如,King和Queen可能相似,King和Man可能相似,但Queen和Man应该不那么相似(尽管它们仍然都指"人",而且它们都是名词,所以它们可能仍然比Man和Combusted更相似(。
你希望这些词("正"one_answers"负"(是彼此的负(余弦相似度为-1(,但它们是相似的,因为它们几乎完全是同一个词,除了一个是另一个的否定。全局语义向量空间包含了比否定更多的思想,因此这两个词在其他方面非常相似。你可以做的是计算它们的平均向量,然后是Positive -> average = - (Negative -> average)
,而差向量Positive -> average
(或者更准确地说,"Positive" - ("Positive" - "Negative") / 2
(将近似于你特别感兴趣的否定概念。也就是说,你可以将该向量添加到其他情况中来否定它们,例如"Yes" + ("Negative" - "Positive") ~= "No"
也就是说,你观察到的效果不是Spacy的错,你也不会通过使用Gensim或Sklearn来避免它,这是由于"相似性"在这种情况下的含义。如果你想在单词之间建立更容易理解的、人为设计的语义关系,可以考虑查看WordNet,它是手动创建的,更可能在你的两个单词之间明确地存在一些"否定"关系。