大模型时代下回顾NLP的常见语义技术方案:从DP依存句法到SDP依存语义再到AMR抽象语义分析概述与开源实现

今天是2024年5月13日,北京,天气晴。

昨天看到一个有趣的工作。

关于语言学抽象语义表示与大模型结合。这个有趣,《Analyzing the Role of Semantic Representations in the Era of Large Language Models》:https://arxiv.org/pdf/2405.01502,使用抽象语义表示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

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

就职于360人工智能研究院、曾就职于中国科学院软件研究所。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

相关推荐

  • 一文详解RAG应用中的路由模式
  • Spring Boot集成@Async快速入门Demo
  • 手部动作识别相关开源数据集汇总
  • 【Python】pyquery,一个非常实用的 Python 库!
  • 答辩神级现场:我的“水货”导师,和他的院长父亲
  • JavaScript 可视化:Promise执行彻底搞懂
  • Windows 11悲剧了?微软汗流浃背,用户按兵不动,Windows 10稳稳的幸福
  • 璩静后续:百度称丢弃大厂病;苹果领导班子换血在即;阿里北京总部搬家;拜登政府“狂征”中国电车四倍关税;OpenAI凌晨发布新产品
  • 计算机视觉领域经久不衰的热点论文大盘点
  • Kaggle Solo第一!
  • 用于时间序列概率预测的蒙特卡罗模拟
  • DPO作者新作|From r to Q*
  • 如何优雅的实现在线人数统计功能?
  • 8 个关于 Promise 高级用途的技巧
  • ICLR2024杰出论文——Never Train from Scratch!
  • 60*16K,大厂高端岗位卷爆了!
  • 手把手教大家实现OAuth2第三方登录
  • Node 之父新作:一个全新的 NPM 下载源工具!!!
  • 摸鱼网站精选分享第一番
  • 三个实用开源项目工具:无代码编辑器