Python自然语言处理第二章-2.5WordNet(IV)——语义相似度

来源:互联网 发布:瑞典隆德大学知乎 编辑:程序博客网 时间:2024/05/10 10:34

WordNet——语义相似度

0. 本节内容

  • lowesr_common_hypernyms() 获取最低共同上位词集
  • min_depth() 词集深度
  • path_similarity() 词集相似度

1. lowesr_common_hypernyms() 获取最低共同上位词集

lowest_common_hypernyms( )方法,注意是由一个词集调用的,其参数也是一个词集。感觉这个方法就是在找两个词集的“最小公倍数”,当然这不是数字上的逻辑关系,而是语言内部本身的逻辑关系。

结合例子来理解:
right_whale 露脊鲸、脊美鲸
orca 逆戟鲸
minke whale 小须鲸
baleen whale 须鲸
tortoise 海龟
vertebrate 脊椎动物

>>> right=wn.synset('right_whale.n.01')>>> orca=wn.synset('orca.n.01')>>> minke=wn.synset('minke_whale.n.01')>>> tortoise = wn.synset('tortoise.n.01')>>> novel =wn.synset('novel.n.01')>>> right.lowest_common_hypernyms(minke)#说明right whale与minke whale都属于baleen whale(须鲸)[Synset('baleen_whale.n.01')]>>> right.lowest_common_hypernyms(tortoise)#说明right whale 与 tortoise 都属于脊椎动物vertebrate[Synset('vertebrate.n.01')]>>> right.lowest_common_hypernyms(novel)#right whale与novel没有什么必然的联系,只能都属于entity(实体)[Synset('entity.n.01')]>>>

那么如何量化这些词集之间的“远近”、“距离”呢——下面学习min_paths()与path_similarity()方法。

2. min_paths() 获得词集的深度

该方法同样由一个词集调用,获得该同义词集的深度,来进行更直观上的理解。

用该方法获得其最低共同上位词集的深度,就可以粗略知道两个词集的距离,数字越大,表示词集深度越大,分类越细,则原来两个词集的关系越密切。

>>> wn.synset('vertebrate.n.01').min_depth()8>>> wn.synset('entity.n.01').min_depth()#entity0

right whale 与 tortoise 都属于脊椎动物vertebrate,而vertebrate的深度是8,有一定的关系,但是关系不是很深;
right whale与novel只能都属于entity(实体),深度为0,显然没有什么必然的联系。

但是这只根据一个数值来判断,还是觉得比较笼统,主观因素影响较大,能更更进一步的量化吗?
当然可以,那就是下面要讲的,求相似度方法。

3. path_similarity() 词集相似度

A. 直接使用该方法

该方法的使用与上述lowest_common_hypernyms( )相同,由一个词集调用,参数也是一个词集,输出两个词集之间的相似度,该相似度可以这样理解的:

  • 相似度取值范围为0~1以及-1
  • 两个词集之间没有路径返回 -1
  • 同义词集与自身比较返回1
  • 基于上位词层次结构概念中相互关联的最短路径下,进行计算的
  • 还未提到返回0的情况
>>> right.path_similarity(minke)0.25>>> right.path_similarity(orca)0.16666666666666666>>> right.path_similarity(tortoise)0.07692307692307693>>>

如上所示直接使用该方法便得出相应的相似度,但是该相似度是怎样算出来的呢?它的依据是什么?笔者将相关词集的深度值列成一个表,然后找到了规律,并做了验证,具体分析如下:

B. 首先,用min_depth()方法获取每个词集的深度值:

>>> wn.synset('right_whale.n.01').min_depth()15>>> wn.synset('minke_whale.n.01').min_depth()16>>> wn.synset('orca.n.01').min_depth()16>>> wn.synset('whale.n.02').min_depth()13>>> wn.synset('tortoise.n.01').min_depth()13>>> wn.synset('novel.n.01').min_depth()7>>> wn.synset('baleen_whale.n.01').min_depth()14>>> wn.synset('whale.n.02').min_depth()13>>> wn.synset('vertebrate.n.01').min_depth()8>>> wn.synset('entity.n.01').min_depth()0>>>

C. 接着以right_whale作为第一个词集,列出其与其他词集的最低共同上位词集及相似度,括号中的数字表示相应的词集深度:

<最低共同上位词集及相似度> right_whale(15) path_similarity() minke_whale(16) baleen_whale(14) 0.25 orca(16) whale(13) 0.16666666666666666 tortoise(13) vertebrate(8) 0.07692307692307693 novel(7) entity(0) 0.07692307692307693

即:
这里写图片描述

a. 提到距离,远近这些概念,不免想起坐标系上两点之间的距离是怎样计算的,笔者观察这组数据,曾使用绝对值、平方和等等思路试图找到这组数据的规律;
b. 此外,距离是一个相对的概念,而两个词集最近的关系(联系)就是他们的最低层次的共同上位词集,所以,两个词集与其最低共同上位词集的深度之差(分别表示为dis1,dis2)是很重要的参考值;
c. 同时还需要引进归一化的思想,使得不同组的相似度具有对比的意义。

最终发现如下规律:>####path_similarity = 1/(dis1+dis2+1)####- 其中path_similarity是两个词集的相似度;- dis1与dis2分别表示两个词集与其最低共同上位词集的深度之差;- 两个1是为了归一化而使用的参数>**比如对于right_whale与minke_whale:**>|

D. 验证如下

验证1——同义词与自身比较:这时最低共同上位词集也是自身,dis1与dis2均为0,符合“同义词集与自身比较将返回1”的情况。

>>> right.lowest_common_hypernyms(right)[Synset('right_whale.n.01')]>>> right.path_similarity(right)1.0

验证2——tortoise与orca之间:

<最低层次的共同上位词集及相似度> orca(16) path_similarity() tortoise(13) vertebrate(8) 0.07142857142857142


按照公式:
此时dis1=16-8=8,dis2=13-8=5,
path_similarity=1/(8+5+1)=0.07142857142857142

>>> tortoise.lowest_common_hypernyms(orca)[Synset('vertebrate.n.01')]>>> orca.path_similarity(tortoise)0.07142857142857142

验证正确!


上述的3.B~3.D讲了什么呢?
它将方法path_similarity() 的底层代码的思路分析出来了。(起码笔者是这么想的,哈哈)
如果果真是这样,还挺好玩的,哈哈~~
如有异议或者错误,欢迎提出来,一起学习,共勉~~~

阅读全文
0 0
原创粉丝点击