最近在做一个聊天机器人,其中一个基础要求是理解用户说的话,而这需要用到语义角色标注,先将资料整理于此。

背景

自然语言分析技术大致分为三个层面:词法分析、句法分析和语义分析。语义角色标注是实现浅层语义分析的一种方式。在一个句子中,谓词是对主语的陈述或说明,指出“做什么”、“是什么”或“怎么样,代表了一个事件的核心,跟谓词搭配的名词称为论元。语义角色是指论元在动词所指事件中担任的角色。主要有:施事者(Agent)、受事者(Patient)、客体(Theme)、经验者(Experiencer)、受益者(Beneficiary)、工具(Instrument)、处所(Location)、目标(Goal)和来源(Source)等。

请看下面的例子,“遇到” 是谓词(Predicate,通常简写为“Pred”),“小明”是施事者(Agent),“小红”是受事者(Patient),“昨天” 是事件发生的时间(Time),“公园”是事情发生的地点(Location)。

概念

语义角色标注 (Semantic Role Labeling, SRL) 是一种浅层的语义分析技术,标注句子中某些短语为给定谓词的论元 (语义角色) ,如施事、受事、时间和地点等。其能够对问答系统、信息抽取和机器翻译等应用产生推动作用。

语义角色标注(Semantic Role Labeling,SRL)以句子的谓词为中心,不对句子所包含的语义信息进行深入分析,只分析句子中各成分与谓词之间的关系,即句子的谓词(Predicate)- 论元(Argument)结构,并用语义角色来描述这些结构关系,是许多自然语言理解任务(如信息抽取,篇章分析,深度问答等)的一个重要中间步骤。在研究中一般都假定谓词是给定的,所要做的就是找出给定谓词的各个论元和它们的语义角色。

例:

其中有三个谓词提出,调研和探索。以探索为例,积极是它的方式(一般用ADV表示),而新机制则是它的受事(一般用A1表示)

语义角色

核心的语义角色A0-5六种,

A0 通常表示动作的施事,

A1 通常表示动作的影响等,

A2-5 根据谓语动词不同会有不同的语义含义。

附加语义角色(15种):

标注流程

传统的SRL系统大多建立在句法分析基础之上,通常包括5个流程:

1.构建一棵句法分析树,例如,图1是对上面例子进行依存句法分析得到的一棵句法树。  2.从句法树上识别出给定谓词的候选论元。  3.候选论元剪除;一个句子中的候选论元可能很多,候选论元剪除就是从大量的候选项中剪除那些最不可能成为论元的候选项。  4.论元识别:这个过程是从上一步剪除之后的候选中判断哪些是真正的论元,通常当做一个二分类问题来解决。  5.对第4步的结果,通过多分类得到论元的语义角色标签。可以看到,句法分析是基础,并且后续步骤常常会构造的一些人工特征,这些特征往往也来自句法分析。

然而,完全句法分析需要确定句子所包含的全部句法信息,并确定句子各成分之间的关系,是一个非常困难的任务,目前技术下的句法分析准确率并不高,句法分析的细微错误都会导致SRL的错误。为了降低问题的复杂度,同时获得一定的句法结构信息,“浅层句法分析”的思想应运而生。浅层句法分析也称为部分句法分析(partial parsing)或语块划分(chunking)。和完全句法分析得到一颗完整的句法树不同,浅层句法分析只需要识别句子中某些结构相对简单的独立成分,例如:动词短语,这些被识别出来的结构称为语块。为了回避 “无法获得准确率较高的句法树” 所带来的困难,一些研究[1]也提出了基于语块(chunk)的SRL方法。基于语块的SRL方法将SRL作为一个序列标注问题来解决。序列标注任务一般都会采用BIO表示方式来定义序列标注的标签集,我们先来介绍这种表示方法。在BIO表示法中,B代表语块的开始,I代表语块的中间,O代表语块结束。通过B、I、O 三种标记将不同的语块赋予不同的标签,例如:对于一个角色为A的论元,将它所包含的第一个语块赋予标签B-A,将它所包含的其它语块赋予标签I-A,不属于任何论元的语块赋予标签O。

从上面的例子可以看到,根据序列标注结果可以直接得到论元的语义角色标注结果,是一个相对简单的过程。这种简单性体现在:  (1)依赖浅层句法分析,降低了句法分析的要求和难度;  (2)没有了候选论元剪除这一步骤;  (3)论元的识别和论元标注是同时实现的。 这种一体化处理论元识别和论元标注的方法,简化了流程,降低了错误累积的风险,往往能够取得更好的结果。

pyltp语义角色标注

pyltp(https://github.com/HIT-SCIR/pyltp) 是 语言技术平台(Language Technology Platform, LTP)的 Python 封装。语言技术平台(Language Technology Platform,LTP)是 哈工大社会计算与信息检索研究中心 历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口,可视化工具,并且能够以网络服务(Web Service)的形式进行使用。

pyltp可用的自然语言处理功能包括:

下面给出测试代码:# -*- coding: utf-8 -*-

from pyltp import SentenceSplitter as ss

import os

from pyltp import Segmentor

from pyltp import NamedEntityRecognizer

from pyltp import Postagger

from pyltp import Parser

from pyltp import SementicRoleLabeller

text='我今天摔了一跤,很生气。'

DIR_LTP_DATA_PATH=r'D:\AI\NLP\pyltp'

#分句

sents=ss.split(text)

sents=[s for s in sents]

print(sents)

#分词

path=os.path.join(DIR_LTP_DATA_PATH,'cws.model')

segmentor=Segmentor()

segmentor.load(path)

words=segmentor.segment(text)

words=[w for w in words]

print(words)

#词性标注

postagger=Postagger()

postagger.load(os.path.join(DIR_LTP_DATA_PATH,'pos.model'))

postags=postagger.postag(words)

postags=[p for p in postags]

print(postags)

#命名实体标注

recognizer=NamedEntityRecognizer()

recognizer.load(os.path.join(DIR_LTP_DATA_PATH,'ner.model'))

netags=recognizer.recognize(words,postags)

netags=[n for n in netags]

print(netags)

#依存句法分析

parser=Parser()

parser.load(os.path.join(DIR_LTP_DATA_PATH,'parser.model'))

arcs=parser.parse(words,postags)

i=0

for arc in arcs:

print(words[i]+':'+str(arc.head)+' '+arc.relation)

i=i+1

#语义角色标注

labeller=SementicRoleLabeller()

labeller.load(os.path.join(DIR_LTP_DATA_PATH,'pisrl_win.model'))

roles=labeller.label(words,postags,arcs)

for role in roles:

print(str(role.index)+str([" %s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))

segmentor.release()

postagger.release()

recognizer.release()

parser.release()

labeller.release()

程序运行结果如下:['我今天摔了一跤,很生气。']

['我', '今天', '摔', '了', '一', '跤', ',', '很', '生气', '。']

['r', 'nt', 'v', 'u', 'm', 'n', 'wp', 'd', 'a', 'wp']

['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']

我:3 SBV

今天:3 ADV

摔:0 HED

了:3 RAD

一:6 ATT

跤:3 VOB

,:3 WP

很:9 ADV

生气:3 COO

。:3 WP

[dynet] random seed: 1227180928

[dynet] allocating memory: 2000MB

[dynet] memory allocation done.

2[' A0:(0,0)', ' TMP:(1,1)', ' A1:(4,5)']

8[' A0:(0,0)', ' ADV:(7,7)']

运行结果的最后两行便是语义角色标注的结果,分析:

第一个谓词的语义角色分析:2表示谓词第3个单词,即摔'摔',施事者A0是'我',受事A1是'一跤',时间TMP在'今天'。

第二个谓词的语义角色分析:谓词为生气,施事者是'我',形容词ADV是'很'。可以看到,其结果还是很准确的。

参考文献

[1]OnlyChristmas.语义角色标注 Semantic Role Labeling(SRL) 初探(整理英文tutorial).https://blog.csdn.net/huhehaotechangsha/article/details/80463118.2018-05-26

python语言语块句的标记_个人学习记录相关推荐

  1. python语言语块句的标记_《自然语言处理理论与实战》

    编辑推荐 1.讲解自然语言处理的理论 2.案例丰富,实战性强 3.适合自然语言处理学习的入门者 内容提要 自然语言处理是什么?谁需要学习自然语言处理?自然语言处理在哪些地方应用?相关问题一直困扰着不少 ...

  2. python语言语块句的标记_Python的选择语句

    Python的选择语句和C的选择语句差不多,但是又有很多不一样的细节,下面我们一起来学习一下吧! 1.最简单的if语句 Python中使用if保留字来组成选择语句,其最简单的语法形式如下: if 表达 ...

  3. python语言语块句的标记_NLTK基础教程学习笔记(十一)

    语块分解例子: from nltk.chunk.regexp import * import nltk test_sent="The prime minister announced he ...

  4. 网页编程(满屋花、金山打字、打地鼠)——张渣渣_的学习记录(4)

    张渣渣_的学习记录(4)--网页编程(满屋花.金山打字.打地鼠) 满屋花 金山打字 打地鼠 满屋花 效果图如下: (需要素材的话可以dd我) <!DOCTYPE HTML> <htm ...

  5. 在python语言中ipo模式不包括_下面不是IPO模式的一部分的是()_学小易找答案

    [单选题]对于某个导体电阻的大小,以下说法正确的是 (6.0分) [单选题]下面不是IPO模式的一部分的是() [单选题]对如图 所示的电路,下列说法正确的是 (6.0分) [填空题]Python语言 ...

  6. python -- 计算 平方、乘方、平方根_从零开始学习PYTHON3讲义(二)把Python当做计算器...

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  7. python套接字socket的作用_【学习笔记】python实现的套接字socket

    #############2014.5.13 update############## #更新了多进程服务端的bug:客户端强行关闭会出错# ############################# ...

  8. python n个list如何组成矩阵_通过学习在processing中操作图片,掌握python 列表操作...

    这次的教学非常简单,只需要安装了python模式的processing就可以(安装教程见专栏目录).我从网上找了一个比100*100稍微大一点的图片,你可以也找一个.然后我们就可以一起开始今天的学习啦 ...

  9. python bp神经网络分类预测结果图_深度学习入门(四)BP神经网络——数字分类...

    采用的是python中机器学习库sklearn图片数据 sklearn简要介绍: #sklearn是Python中的一个机器学习包 from sklearn.datasets import load_ ...

最新文章

  1. untitled与前端——初学
  2. c语言指针的相关运算,C语言指针的运算
  3. mysql外连接插座_深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接...
  4. 蒙特利尔大学发布2021年最新自监督小样本检测综述
  5. 让人生成功的49个细节
  6. 开源纯C#工控网关+组态软件(五)从网关到人机界面
  7. hibernate中报错could not initialize proxy - no Session的解决方法
  8. oracle 序列验证脚本,oracle 生成序列脚本
  9. 杂项-EMS:CRM
  10. 结构体内存对齐的原则及原理
  11. java 欧拉_项目欧拉#6 Java协助
  12. windows server 2008下载及序列号
  13. 云专网和云专线的区别_云专线网络接入解决方案
  14. Android 兼容Android 7拍摄照片/打开相册/选择照片/剪裁照片/显示照片 带demo
  15. 【学习周报9.26 ~ 10.1】Hierarchical Modular Network for Video Captioning(CVPR2022)
  16. 信号检测与估计理论 pdf_目标检测的性能上界讨论
  17. 单点登录-基于JWT机制的单点登录
  18. 谷歌翻译 网页嵌入代码_在网页上嵌入Google地图
  19. c语言成绩查询系统大作业,C语言 · 成绩查询系统(示例代码)
  20. 「收藏」关于机器学习的知识点,全在这篇文章里了

热门文章

  1. 小白也能看懂的 DFS 算法本质详解
  2. python--元组tuple
  3. word如何快速统一图片大小
  4. 【CE】Mac下的CE教程Tutorial:基础篇(1-4关)
  5. 【转】PC机安装MAC虚拟机
  6. 杭电ACM基础题(2075、2076、2078、2081、2083、2088、2090、2092、2093、2095)
  7. 全套PR资源--含RAR解压密码
  8. 为什么CMS两次标记时要 stop the world(阿里面试)
  9. Eigen关于稀疏矩阵
  10. python权限管理设置_python权限管理框架