2.5 WordNet(IV)——语义相似度

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()#entity
0

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:

最低层次的共同上位词集及相似度 right_whale(15) path_similarity()
minke_whale(16) baleen_whale(14) 0.25
  • dis1 = 15-14=1
    dis2 = 16-14=2
    所以path_similarity =1/(dis1+dis2+1)=1/(1+2+1)=0.25

同理,关于right_whale与orca:

最低层次的共同上位词集及相似度 right_whale(15) path_similarity()
orca(16) whale(13) 0.16666666666666666
  • dis1=15-13=2
  • dis2=16-13=3
  • 此时path_similarity=1/((15-13)+(16-13)+1)=1/6=0.16666666666666666

以此类推。

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() 的底层代码的思路分析出来了。(起码笔者是这么想的,哈哈)
  • 如果果真是这样,还挺好玩的,哈哈~~
  • 如有异议或者错误,欢迎提出来,一起学习,共勉~~~

Python自然语言处理(4):语义相似度相关推荐

  1. 自然语言处理NLP之语义相似度、语言模型、doc2vec

    自然语言处理NLP之语义相似度.语言模型.doc2vec 目录 自然语言处理NLP之语义相似度.语言模型.doc2vec 语义相似度

  2. python 语义similarity_GitHub - samelltiger/word_similarity: 基于《知网》的语义相似度计算 python2.7 API...

    基于<知网>的语义相似度计算 python2.7 API 本项目使用python语言实现根据义原树来计算词语之间的语义相似度,并提供对应的 API. 词语距离有两类常见的计算方法,一种是根 ...

  3. 自然语言语义相似度计算方法

    计算机对主观题的自动评阅准确与否,主要取决于其对文本相似度的计算是否准确.由于文本相似度计算在文档复制检查.信息检索和机器翻译等领域都有十分广泛的应用,所以,近年来有越来越多的学者致力于文本相似度算法 ...

  4. Python自然语言处理笔记(一)wordnet相似度计算

    wordnet 参考WordNet Python API (整理总结) wordnet简介 一个synset由lemma.POS.number组成,代表一个语义. 注意synset和synsets 的 ...

  5. python词组语义相似度_【NLP】BERT语义相似度计算

    有一个这样的场景,QA对话系统,希望能够在问答库中找到与用户问题相似的句子对,然后把答案返回给用户.这篇就是要解决这个问题的. 1. BERT 语义相似度 BERT的全称是Bidirectional ...

  6. 自然语言处理(NLP):19 金融领域NLP竞赛——文本语义相似度

    智能客服的本质,就是充分理解用户的意图,在知识体系中精准地找到与之相匹配的内容,回答用户问题或提供解决方案.问题相似度计算,是贯穿智能客服离线.在线和运营等几乎所有环节最核心的技术,广泛应用于搜索.推 ...

  7. Python自然语言处理工具

    Python 自然语言处理(NLP)工具汇总 NLTK 简介: NLTK 在使用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的接口,以及分类.分词 ...

  8. 【Python 自然语言处理 第二版】读书笔记1:语言处理与Python

    文章目录 前言 语言处理与Python 一.语言计算:文本和单词 1.NLTK入门 (1)安装(nltk.nltk.book) (2)搜索文本 (3)词汇计数 2.列表与字符串 (1)列表操作 (2) ...

  9. python自然语言处理库_Python自然语言处理工具库(含中文处理)

    自然语言处理(Natural Language Processing,简称 NLP),是研究计算机处理人类语言的一门技术.随着深度学习在图像识别.语音识别领域的大放异彩,人们对深度学习在 NLP 的价 ...

  10. python自然语言处理书籍_精通Python自然语言处理pdf

    自然语言处理(NLP)是有关计算语言学与人工智能的研究领域之一.NLP主要关注人机交互,它提供了计算机和人类之间的无缝交互,使得计算机在机器学习的帮助下理解人类语言. 本书详细介绍如何使用Python ...

最新文章

  1. Flask上下文管理源码分析
  2. 第 13 章 编码风格
  3. Python 列表(List)操作方法详解
  4. DP【洛谷P2134】 百日旅行
  5. SQL Server R2 地图报表制作(四)
  6. mysql创建外键的表_Mysql表创建外键报错解决方案
  7. 七十一、Springboot整合MyBatis(注解版)
  8. 深入浅出梯度下降法1
  9. Firefly加入OPEN AI LAB生态计划,推出AI开源主板
  10. 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】...
  11. 【生物信息学】——Metagenomics宏基因组学分析流程浅谈
  12. 太强!拿下腾讯公司技术突破奖,腾讯云 RTC 实时音视频技术到底了有多牛?...
  13. 详细图文——AVL树
  14. fleck 客户端_C# Fleck的WebSocket使用
  15. 读书笔记 | 4.1 信用报告及其国际比较
  16. 得力打印机(DL888D型号)Linux对接——Java+C版
  17. 【JZOJ A组】排列
  18. LCD2864 T 串行通信 STM32 MSP430 单片机 显示屏 显示测试程序
  19. 两个不同局域网电脑如何互相访问
  20. Linux 下实现虚拟专用网(PPTP)

热门文章

  1. 安路FPGA烧录程序
  2. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java飞机售票管理系统63z52
  3. 云原生-DevOps-环境搭建
  4. Compaq Visual Fortran生成静态库的方法及使用
  5. 如何组建一个合理的研发团队?
  6. 大家如何批量查询物流,分享最简单的方法
  7. 2022年湖北省工业软件十大优秀应用案例申报条件以及申报的好处
  8. 01-基础入门-概念名词
  9. linux文件发送到ftp服务器上,Windows中的文件上传到Linux的ftp服务器的方法
  10. java xml annotation_java注解XML