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()方法。
该方法同样由一个词集调用,获得该同义词集的深度,来进行更直观上的理解。
用该方法获得其最低共同上位词集的深度,就可以粗略知道两个词集的距离,数字越大,表示词集深度越大,分类越细,则原来两个词集的关系越密切。
>>> wn.synset('vertebrate.n.01').min_depth()
8
>>> wn.synset('entity.n.01').min_depth()#entity
0
right whale 与 tortoise 都属于脊椎动物vertebrate,而vertebrate的深度是8,有一定的关系,但是关系不是很深;
right whale与novel只能都属于entity(实体),深度为0,显然没有什么必然的联系。
但是这只根据一个数值来判断,还是觉得比较笼统,主观因素影响较大,能更更进一步的量化吗?
当然可以,那就是下面要讲的,求相似度方法。
该方法的使用与上述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
>>>
如上所示直接使用该方法便得出相应的相似度,但是该相似度是怎样算出来的呢?它的依据是什么?笔者将相关词集的深度值列成一个表,然后找到了规律,并做了验证,具体分析如下:
>>> 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
>>>
<最低共同上位词集及相似度> | 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. 同时还需要引进归一化的思想,使得不同组的相似度具有对比的意义。
验证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() 的底层代码的思路分析出来了。(起码笔者是这么想的,哈哈)
如果果真是这样,还挺好玩的,哈哈~~
如有异议或者错误,欢迎提出来,一起学习,共勉~~~