【问题标题】:measure of semantic similarity of 2 sentence [duplicate]2句语义相似度的度量[重复]
【发布时间】:2015-05-17 18:11:50
【问题描述】:

我需要测量两个句子之间的相似度。例如:

s1 = "she is good a dog "
s2 = "she is nice a heel"

我需要证明"good""nice" 相似。对于名词和动词,路径相似性的测量就像这个伪代码一样工作:

def get max :
for loop
(wn.synset ('dog ')).path_similarity(wn.synset ('animal'))

结果:.33,这是一个高值,那么这些词是相关的,我可以说是相似的。但是对于副词("nice""good"),.09 的值很低!

有什么想法吗?

【问题讨论】:

  • 这应该是代码吗?!
  • 我认为您的问题是“为什么 nice 和 good 不被视为同义词?”。也许你可以这样改写它,向我们展示你正在使用的真正的 python 代码,它给你 0.09 数字。
  • 寻找两个句子之间的语义相似度的问题似乎比寻找巨大文档之间的相似度更复杂。 hindawi.com/journals/tswj/2014/437162.

标签: python nlp semantics wordnet


【解决方案1】:

您可以为good 的所有synsets 找到path_similarity,然后选择最大值:

>>> from nltk.corpus import wordnet as wn
>>> n=wn.synsets('nice')
>>> g=wn.synsets('good')
>>> [i.path_similarity(n[0]) for i in g]
[0.0625, 0.06666666666666667, 0.07142857142857142, 0.09090909090909091, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

>>> max(i.path_similarity(n[0]) for i in g)
0.09090909090909091

请注意,一个词的synsets 包含动词、none、adj、...等多种形式的词,因此您需要选择正确的一个!

您也可以使用wup_similarity

>>> round(max(i.wup_similarity(n[0]) for i in g), 1)
0.4

Wu-Palmer Similarity:返回一个分数,表示两个词义的相似程度,基于分类学中两个词义的深度及其最不常见的子类(最具体的祖先节点) .

阅读更多关于 Synsets http://www.nltk.org/howto/wordnet.html

【讨论】:

  • 在 wordnet 3.1 中,nice#1 和 good#6 与“相似”直接相连。 wup_similarity 是否考虑到这一点并认为它值 0.4,而 path_similarity 不使用相似关系? wordnetweb.princeton.edu/perl/…
  • 遗憾的是,NLTK API 与 wordnet 的相似度度量是针对单个词汇项而不是完整的句子 =( 使用某种词汇相似度组合来形成句子相似度并不容易任务。
  • @alvas 确实,这个答案会根据单词的相似性给出一个近似的结果。
猜你喜欢
  • 2011-01-03
  • 2011-03-21
  • 1970-01-01
  • 2015-10-10
  • 2012-05-01
  • 1970-01-01
  • 2011-05-01
  • 2015-12-27
  • 2015-06-13
相关资源
最近更新 更多