Spacy的相似性

时间:2018-11-23 22:35:30

标签: nlp similarity spacy

我试图了解Spacy中的相似性是如何工作的。我尝试使用Melania Trump的speech和Michelle Obama的speech来看看它们有多相似。

这是我的代码。

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)

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

2 个答案:

答案 0 :(得分:3)

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

returns 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)))

输出:

spaCy : 0.916553147896471
0.9165532

似乎spaCy的.vector方法创建了向量。 Documentation说spaCy的模型是根据GloVe的向量训练的。

答案 1 :(得分:0)

Spacy对句子或文档的相似性只是构成它们的所有单词向量的平均值。因此,如果两个语音有很多肯定的词,并且在相似的情况下产生并且使用常用词,则相似性可能很高。但是,如果只用单个短句子执行相同操作,则它在语义上会失败。 例如: sent1:“这是关于飞机和航空公司的” sent2:“这与飞机和航空公司无关”

尽管含义相反,两者在spacy方面将具有非常高的相似性(0.989662)。看来'not'的向量与句子中其余单词没有什么不同,它的vector_norm也很相似。