每天给你送来NLP技术干货!

作者:刘焕勇

来自:老刘说NLP
在上一篇文章
《事件Schema生成必读:一种基于AMR与聚类、映射的事件模式生成框架浅析》
中,我们讲到了AMR以及依存句法分析在分析触发词与论元之间的关系时所发挥的作用。

当前,语义分析正在从浅层分析到深层分析转变,与此对应的语义分析技术也逐步发生变化,从最开始到句子成分分析,到依存句法分析,到语义角色标注再到依存语义分析,再到抽象语义表示,整个过程也是十分有趣。
本文主要就这几种语义分析方式进行介绍,从基本概念、常用标记以及开源实现三个角度进行介绍,供大家一起思考。 本文充分借鉴了LTP以及Hanlp的一些介绍和相关结果图片,对这两个机构的开源精神表示感谢。

一、依存句法分析Dependency Parsing

依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构,通过分析,可以看到词语之间的依存关系,如SBV主语关系,VOB动宾关系,ATT修饰关系,利用该关系可以进行搭配抽取、短语组块识别,事件抽取等任务。
图-LTP依存分析结果
图-hanlP依存分析结果
直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。
1、常用标记
2、开源实现
from ltp import LTP


ltp = LTP()


seg, hidden = ltp.seg([
"他叫汤姆去拿外衣。"
])

dep = ltp.dep(hidden)

 [[
'他'
'叫'
'汤姆'
'去'
'拿'
'外衣'
'。'
]]

 [

     [

         (1, 2, 
'SBV'
),

         (2, 0, 
'HED'
),    
# 叫 --|HED|--> ROOT
         (3, 2, 
'DBL'
),

         (4, 2, 
'VOB'
),

         (5, 4, 
'COO'
),

         (6, 5, 
'VOB'
),

         (7, 2, 
'WP'
)

     ]

 ]

二、语义角色标注 Semantic Role Labeling

语义角色标注(Semantic Role Labeling,简称 SRL)是一种浅层的语义分析,在给定一个句子, SRL 的任务是找出句子中谓词的相应语义角色成分,包括核心语义角色(如施事者、受事者等)和附属语义角色(如地点、时间、方式、原因等)。
图-LTP语义角色分析结果
1、常用标记
2、具体例子
from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg([
"他叫汤姆去拿外衣。"
])

srl = ltp.srl(hidden)

 [[
'他'
'叫'
'汤姆'
'去'
'拿'
'外衣'
'。'
]]

 [

     [

         [],      
# 他
         [(
'ARG0'
, 0, 0), (
'ARG1'
, 2, 2), (
'ARG2'
, 3, 5)], 
# 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 去拿外衣]
         [],      
# 汤姆
         [],      
# 去
         [(
'ARG0'
, 2, 2), (
'ARG1'
, 5, 5)],
# 拿 -> [ARG0: 汤姆, ARG1: 外衣]
         [],   
# 外衣
         []    
# 。
     ]

 ]

srl = ltp.srl(hidden, keep_empty=False)

 [

     [

         (1, [(
'ARG0'
, 0, 0), (
'ARG1'
, 2, 2), (
'ARG2'
, 3, 5)]), 
# 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 去拿外衣]
         (4, [(
'ARG0'
, 2, 2), (
'ARG1'
, 5, 5)])                  
# 拿 -> [ARG0: 汤姆, ARG1: 外衣]

三、语义依存分析Semantic Dependency Parsing

语义依存分析 (Semantic Dependency Parsing, SDP),旨在分析句子各个语言单位之间的语义关联,并将语义关联以依存结构呈现。与依存句法的SBV等依存标记不同,其更深入的标记出了词语所担任的角色信息。
使用语义依存刻画句子语义,好处在于不需要去抽象词汇本身,而是通过词汇所承受的语义框架来描述该词汇,而论元的数目相对词汇来说数量总是少了很多的。
图-LTP语义依存分析结果
图-hanlP语义依存分析结果
语义依存分析目标是跨越句子表层句法结构的束缚,直接获取深层的语义信息。
1、常用标记
2、开源实现
from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg([
"他叫汤姆去拿外衣。"
])

sdp = ltp.sdp(hidden, mode=
'tree'
)

 [[
'他'
'叫'
'汤姆'
'去'
'拿'
'外衣'
'。'
]]

 [

     [

         (1, 2, 
'Agt'
),

         (2, 0, 
'Root'
),   
# 叫 --|Root|--> ROOT
         (3, 2, 
'Datv'
),

         (4, 2, 
'eEfft'
),

         (5, 4, 
'eEfft'
),

         (6, 5, 
'Pat'
),

         (7, 2, 
'mPunc'
)

     ]

 ]

四、抽象语义表示Abstract Meaning representation

抽象语义表示(abstract meaning representation,AMR)是句子语义的一种表示方法,将一个句子的语义抽象为一个单根有向无环图。
AMR解析旨在将句子解析为对应的AMR图,句子中的实词抽象为概念节点,实词之间的关系抽象为带有语义关系标签的有向弧,同时忽略虚词和形态变化体现的较虚的语义(如the、单复数、时、体等等)
图-hanlP语义依存分析结果
文章《中文抽象意义表示简介》(https://www.hankcs.com/nlp/corpus/introduction-to-chinese-abstract-meaning-representation.html) 中对AMR的优势这么说:
与依存句法树相比,抽象意义表示图中的节点不再是单词而是概念,并且跳出了树的限制;
与语义依存图相比,抽象意义表示图不但跳出了单词的限制,而且还可以自由引入句子表面不存在的概念
与单词颗粒度的句法语义表示形式相比,抽象意义表示既可以将多个单词抽象为一个概念(命名实体),也可以引入句子表面原本不存在的概念(比如省略成分、维基链接等)
与语义角色标注相比,抽象意义表示保留了谓词和论元的概念,但不再依赖短语结构树,并且能够刻画多个谓词之间的层级关系,而语义角色标注只能提供扁平的结构。
1、常用标记
在概念上,AMR一般将句中的实词都抽象为概念,如名词、动词、形容词、副词,而且一般会使用词语本身作为标签来表示这些概念,因此AMR中大部分的概念都是由句中的词语充当的,为方便理解和说明,有时可以直接用词语来指代概念。
在关系上,语义关系分为两种,核心语义角色关系和非核心语义角色关系。用形如 “Argx(x∈[0,4])”的标签来表示核心语义角色关系,用形如“cost(花费)”等的语义标 签来表示非核心的语义角色关系。
核心语义关系,沿用 OntoNotes 的体系,共5个,即:ARG0(原型施事)、ARG1(原 型受事)、ARG2(间接宾语、工具等)、ARG3(出发点、受益者等)、ARG4(终点);
非核心语义关系表示除核心语义之外的关系类型
更详细的标记,可以参考:《中文抽象语义表示标注规范V1.2》,地址:https://www.cs.brandeis.edu/~clp/camr/res/CAMR_GL_v1.2.pdf。
2、开源实现
import hanlp

hanlp.pretrained.amr.ALL 
# 语种见名称最后一个字段或相应语料库

amr = hanlp.load(
'MRP2020_AMR_ENG_ZHO_XLM_BASE'
)

graph = amr([
"男孩"
"希望"
"女孩"
"相信"
"他"
"。"
])

print
(graph)

(x2 / 希望-01

    :arg1 (x4 / 相信-01

              :arg0 (x3 / 女孩)

              :arg1 x1)

    :arg0 (x1 / 男孩))

amr([
"男孩"
"希望"
"女孩"
"相信"
"他"
"。"
], output_amr=False)

Out[6]:

{
'id'
'0'
,

'input'
'男孩 希望 女孩 相信 他 。'
,

'nodes'
: [{
'id'
: 0,

'label'
'男孩'
,

'anchors'
: [{
'from'
: 0, 
'to'
: 2}, {
'from'
: 12, 
'to'
: 13}]},

  {
'id'
: 1, 
'label'
'希望-01'
'anchors'
: [{
'from'
: 3, 
'to'
: 5}]},

  {
'id'
: 2, 
'label'
'女孩'
'anchors'
: [{
'from'
: 6, 
'to'
: 8}]},

  {
'id'
: 3, 
'label'
'相信-01'
'anchors'
: [{
'from'
: 9, 
'to'
: 11}]}],

'edges'
: [{
'source'
: 1, 
'target'
: 3, 
'label'
'arg1'
},

  {
'source'
: 1, 
'target'
: 0, 
'label'
'arg0'
},

  {
'source'
: 3, 
'target'
: 2, 
'label'
'arg0'
},

  {
'source'
: 3, 
'target'
: 0, 
'label'
'arg1'
}],

'tops'
: [1],

'framework'
'amr'
}

总结

本文主要本文从基本概念、常用标记以及开源实现三个角度对依存句法分析Dependency Parsing、语义角色标注 Semantic Role Labeling、语义依存分析Semantic Dependency Parsing以及抽象语义表示Abstract Meaning representation几个句法/语义分析方法进行了介绍。
当前,AMR最为火热,当然批评的声音也不少,大家可以多加实践,并具体的任务和业务相结合,解决更多落地问题。

参考文献

1、https://wap.sciencenet.cn/blog-39714-1069586.html

2、https://amr.isi.edu/download.html

3、https://hanlp.hankcs.com/

4、https://github.com/hankcs/HanLP/tree/doc-zh

5、https://blog.51cto.com/u_11142243/2418415

6、http://ltp.ai
最近文章
继续阅读
阅读原文