Python自然语言处理(4):语义相似度
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):语义相似度相关推荐
- 自然语言处理NLP之语义相似度、语言模型、doc2vec
自然语言处理NLP之语义相似度.语言模型.doc2vec 目录 自然语言处理NLP之语义相似度.语言模型.doc2vec 语义相似度
- python 语义similarity_GitHub - samelltiger/word_similarity: 基于《知网》的语义相似度计算 python2.7 API...
基于<知网>的语义相似度计算 python2.7 API 本项目使用python语言实现根据义原树来计算词语之间的语义相似度,并提供对应的 API. 词语距离有两类常见的计算方法,一种是根 ...
- 自然语言语义相似度计算方法
计算机对主观题的自动评阅准确与否,主要取决于其对文本相似度的计算是否准确.由于文本相似度计算在文档复制检查.信息检索和机器翻译等领域都有十分广泛的应用,所以,近年来有越来越多的学者致力于文本相似度算法 ...
- Python自然语言处理笔记(一)wordnet相似度计算
wordnet 参考WordNet Python API (整理总结) wordnet简介 一个synset由lemma.POS.number组成,代表一个语义. 注意synset和synsets 的 ...
- python词组语义相似度_【NLP】BERT语义相似度计算
有一个这样的场景,QA对话系统,希望能够在问答库中找到与用户问题相似的句子对,然后把答案返回给用户.这篇就是要解决这个问题的. 1. BERT 语义相似度 BERT的全称是Bidirectional ...
- 自然语言处理(NLP):19 金融领域NLP竞赛——文本语义相似度
智能客服的本质,就是充分理解用户的意图,在知识体系中精准地找到与之相匹配的内容,回答用户问题或提供解决方案.问题相似度计算,是贯穿智能客服离线.在线和运营等几乎所有环节最核心的技术,广泛应用于搜索.推 ...
- Python自然语言处理工具
Python 自然语言处理(NLP)工具汇总 NLTK 简介: NLTK 在使用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的接口,以及分类.分词 ...
- 【Python 自然语言处理 第二版】读书笔记1:语言处理与Python
文章目录 前言 语言处理与Python 一.语言计算:文本和单词 1.NLTK入门 (1)安装(nltk.nltk.book) (2)搜索文本 (3)词汇计数 2.列表与字符串 (1)列表操作 (2) ...
- python自然语言处理库_Python自然语言处理工具库(含中文处理)
自然语言处理(Natural Language Processing,简称 NLP),是研究计算机处理人类语言的一门技术.随着深度学习在图像识别.语音识别领域的大放异彩,人们对深度学习在 NLP 的价 ...
- python自然语言处理书籍_精通Python自然语言处理pdf
自然语言处理(NLP)是有关计算语言学与人工智能的研究领域之一.NLP主要关注人机交互,它提供了计算机和人类之间的无缝交互,使得计算机在机器学习的帮助下理解人类语言. 本书详细介绍如何使用Python ...
最新文章
- Flask上下文管理源码分析
- 第 13 章 编码风格
- Python 列表(List)操作方法详解
- DP【洛谷P2134】 百日旅行
- SQL Server R2 地图报表制作(四)
- mysql创建外键的表_Mysql表创建外键报错解决方案
- 七十一、Springboot整合MyBatis(注解版)
- 深入浅出梯度下降法1
- Firefly加入OPEN AI LAB生态计划,推出AI开源主板
- 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】...
- 【生物信息学】——Metagenomics宏基因组学分析流程浅谈
- 太强!拿下腾讯公司技术突破奖,腾讯云 RTC 实时音视频技术到底了有多牛?...
- 详细图文——AVL树
- fleck 客户端_C# Fleck的WebSocket使用
- 读书笔记 | 4.1 信用报告及其国际比较
- 得力打印机(DL888D型号)Linux对接——Java+C版
- 【JZOJ A组】排列
- LCD2864 T 串行通信 STM32 MSP430 单片机 显示屏 显示测试程序
- 两个不同局域网电脑如何互相访问
- Linux 下实现虚拟专用网(PPTP)