两个句子语义相似度的度量

3

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

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 很低!有什么想法吗?

1
那是要写成代码的吗?! - jonrsharpe
我认为你的问题是“为什么‘nice’和‘good’没有被识别为同义词?”。也许你可以这样重新表述,并展示一下你正在使用的真实Python代码,以便我们了解你得到0.09数字的原因。 - Darren Cook
寻找两个句子之间的语义相似性问题似乎比寻找大型文档之间的相似性更加复杂。https://www.hindawi.com/journals/tswj/2014/437162/. - pmuntima
1个回答

3
你可以找到所有“好”的词义集的路径相似度,然后选择最大值:
>>> 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

请注意,一个单词的同义词集包含许多单词形式,如动词、名词、形容词等,因此您需要选择正确的一个!
另外,您还可以使用wup_similarity作为另一种选择:
>>> round(max(i.wup_similarity(n[0]) for i in g), 1)
0.4

吴-帕尔默相似度:返回一个得分,表示两个词义的相似程度,基于它们在分类法中的深度以及它们最近的共同继承者(最具体的祖先节点)的深度。

了解更多关于Synsets的信息,请阅读此处


在WordNet 3.1中,"nice#1"和"good#6"直接通过"similar to" 连接。wup_similarity是否考虑到这一点并认为它的相似度值为0.4,而path_similarity则不使用"similar-to"关系。 - Darren Cook
遗憾的是,NLTK API中用于WordNet的相似度测量仅适用于单个词汇项,而不适用于完整的句子 =( 使用某种组合来形成句子相似度并不是一项容易的任务。 - alvas
@alvas 的确,这个答案将根据单词的相似度给出一个近似的结果。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接