Spacy,两个句子之间的奇怪相似性

新手上路,请多包涵

我已经下载 en_core_web_lg 模型并试图找到两个句子之间的相似性:

 nlp = spacy.load('en_core_web_lg')

search_doc = nlp("This was very strange argument between american and british person")

main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

print(main_doc.similarity(search_doc))

返回非常奇怪的值:

 0.9066019751888448

这两个句子不应该有 90% 的相似度,它们的含义截然不同。

为什么会这样?我是否需要添加某种额外的词汇以使相似度结果更合理?

原文由 Mr.D 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 804
2 个回答

向量相似性的 Spacy 文档 解释了它的基本思想:

每个单词都有一个向量表示,通过上下文嵌入 ( Word2Vec ) 学习,上下文嵌入是在语料库上训练的,如文档中所述。

现在,一个 完整句子 的词嵌入只是所有不同词的平均值。如果你现在有很多词在语义上位于同一区域(例如填充词,如“he”、“was”、“this”……),并且额外的词汇“抵消”了,那么你最终可能会与您的情况相似。

问题是你能做些什么:从我的角度来看,你可以想出一个更复杂的相似性度量。由于 search_docmain_doc 有额外的信息,就像原始句子一样,您可以通过长度差异惩罚修改向量,或者尝试比较较短的句子片段,并计算成对相似性(话又说回来,问题是要比较哪些部分)。

遗憾的是,目前还没有简单的方法来简单地解决这个问题。

原文由 dennlinger 发布,翻译遵循 CC BY-SA 4.0 许可协议

Spacy 通过平均单词嵌入来构建句子嵌入。因为在一个普通的句子中,有很多无意义的词(称为 停用词),所以你得到的结果很差。您可以像这样删除它们:

 search_doc = nlp("This was very strange argument between american and british person")
main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

search_doc_no_stop_words = nlp(' '.join([str(t) for t in search_doc if not t.is_stop]))
main_doc_no_stop_words = nlp(' '.join([str(t) for t in main_doc if not t.is_stop]))

print(search_doc_no_stop_words.similarity(main_doc_no_stop_words))

或者只保留名词,因为它们拥有最多的信息:

 doc_nouns = nlp(' '.join([str(t) for t in doc if t.pos_ in ['NOUN', 'PROPN']]))

原文由 Johannes Filter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题