我试图了解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。在我看来,这个相似度分数非常高。它是否正确?我在做错什么吗?
答案 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也很相似。