Spacy的相似性

the*_*gen 1 nlp similarity spacy

我试图了解Spacy中的相似性是如何工作的。我尝试使用梅拉尼娅·特朗普的讲话和米歇尔·奥巴马的讲话来看看它们有多相似。

这是我的代码。

import spacy
nlp = spacy.load('en_core_web_lg')

file1 = open("melania.txt").read().decode('ascii', 'ignore')
file2 = open("michelle.txt").read().decode('ascii', 'ignore')

doc1 = nlp(unicode(file1))
doc2 = nlp(unicode(file2))
print doc1.similarity(doc2)
Run Code Online (Sandbox Code Playgroud)

我得到的相似分数是0.9951584208511974。在我看来,这个相似度分数非常高。它是否正确?难道我做错了什么?

Src*_*Cde 6

默认情况下,spaCy计算余弦相似度。通过比较单词向量或单词嵌入(单词的多维含义表示)来确定相似性

返回 return (numpy.dot(self.vector, other.vector) / (self_norm * other_norm))

text1 = 'How can I end violence?'
text2 = 'What should I do to be a peaceful?'
doc1 = nlp(text1)
doc2 = nlp(text2)
print("spaCy :", doc1.similarity(doc2))

print(np.dot(doc1.vector, doc2.vector) / (np.linalg.norm(doc1.vector) * np.linalg.norm(doc2.vector)))
Run Code Online (Sandbox Code Playgroud)

输出:

spaCy : 0.916553147896471
0.9165532
Run Code Online (Sandbox Code Playgroud)

似乎spaCy的.vector方法创建了向量。文档说,spaCy的模型是根据GloVe的向量进行训练的。


小智 5

SpaCy 对于句子或文档的相似度只是构成它们的所有词向量的平均值。因此,如果有 2 次演讲(这些将是多个句子)

  • 有很多积极的话语
  • 是在类似情况下产生的
  • 使用常用词

那么每个语音的相关词向量之间的相似度可能会很高。但如果你只用单个短句子做同样的事情,那么它在语义上就会失败。

例如,考虑下面的两个句子:

第 1 句:“这是关于飞机和航空公司的”

第 2 句:“这与飞机和航空公司无关”

0.989662尽管含义相反,这两个句子在 SpaCy 中都会给出很高的相似度分数 ( )。看起来not的向量与句子中的其余单词没有太大不同,而且vector_norm也很相似。