句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。
句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽取、自动问答、机器翻译等其他自然语言处理相关的任务。
语法体系
句法分析需要遵循某一语法体系,根据该体系的语法确定语法树的表示形式,我们看下面这个句子:
西门子将努力参与中国的三峡工程建设。
用可视化的工具 Stanford Parser 来看看句法分析的整个过程:
短语结构树由终节点、非终结点以及短语标记三部分组成。句子分裂的语法规则为若干终结点构成一个短语,作为非终结点参与下一次规约,直至结束。如下图:
句法分析技术
依存句法分析
依存句法
依存句法(Dependency Parsing, DP)通过分析语言单位内成分之间的依存关系揭示其句法结构。
直观来讲,依存句法的目的在于分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。
依存句法的结构没有非终结点,词与词之间直接发生依存关系,构成一个依存对,其中一个是核心词,也叫支配词,另一个叫修饰词,也叫从属词。
依存关系用一个有向弧表示,叫做依存弧。依存弧的方向为由从属词指向支配词,当然反过来也是可以的,按个人习惯统一表示即可。
例如,下面这个句子:
国务院总理李克强调研上海外高桥时提出,支持上海积极探索新机制。
依存句法的分析结果见下(利用哈工大 LTP):
从分析结果中我们可以看到,句子的核心谓词为“提出”,主语是“李克强”,提出的宾语是“支持上海……”,“调研……时”是“提出”的(时间) 状语,“李克强”的修饰语是“国务院总理”,“支持”的宾语是“探索新机制”。
有了上面的依存句法分析结果,我们就可以比较容易的看到,“提出者”是“李克强”,而不是“上海”或“外高桥”,即使它们都是名词,而且距离“提出”更近。
依存关系
依存句法通过分析语言单位内成分之前的依存关系解释其句法结构,主张句子中核心动词是支配其他成分的中心成分。而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配者。
在20世纪70年代,Robinson 提出依存句法中关于依存关系的四条公理,在处理中文信息的研究中,中国学者提出了依存关系的第五条公理,分别如下:
- 一个句子中只有一个成分是独立的;
- 句子的其他成分都从属于某一成分;
- 任何一个成分都不能依存于两个或两个以上的成分;
- 如果成分 A 直接从属成分 B,而成分 C 在句子中位于 A 和 B 之间,那么,成分 C 或者从属于 A,或者从属于 B,或者从属于 A 和 B 之间的某一成分;
- 中心成分左右两边的其他成分相互不发生关系。
句子成分之间相互支配与被支配、依存与被依存的现象,普遍存在于汉语的词汇(合成语)、短语、单句、段落、篇章等能够独立运用和表达的语言之中,这一特点体现了依存关系的普遍性。依存句法分析可以反映出句子各成分之间的语义修饰关系,它可以获得长距离的搭配信息,并与句子成分的物理位置无关。
依存句法分析标注关系(共14种)及含义如下表所示:
语义依存分析
语义依存分析(Semantic Dependency Parsing, SDP),分析句子各个语言单位之间的语义关联,并将语义关联以依存结构呈现。使用语义依存刻画句子语义,好处在于不需要去抽象词汇本身,而是通过词汇所承受的语义框架来描述该词汇,而论元的数目相对词汇来说数量总是少了很多。
语义依存分析目标是跨越句子表层句法结构的束缚,直接获取深层的语义信息。例如以下三个句子,用不同的表达方式表达了同一个语义信息,即张三实施了一个吃的动作,吃的动作是对苹果实施的。
语义依存分析不受句法结构的影响,将具有直接语义关联的语言单元直接连接依存弧并标记上相应的语义关系。这也是语义依存分析与依存句法分析的重要区别。
语义依存关系分为三类,分别是主要语义角色,每一种语义角色对应存在一个嵌套关系和反关系;事件关系,描述两个事件间的关系;语义依附标记,标记说话者语气等依附性信息。
Pyhanlp 实战依存句法
最后,我们通过 Pyhanlp 库实现依存句法的实战练习。这个过程中,我们选用 Dependency Viewer 工具进行可视化展示。可视化时, txt 文档需要采用 UTF-8 编码。
首先,引入包,然后可直接进行分析:
from pyhanlp import *
sentence = "徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"
print(HanLP.parseDependency(sentence))
得到的结果:
然后,我们将结果保存在 txt 文件中:
f = open("D://result.txt",'a+')
print((HanLP.parseDependency(sentence )),file = f)
最后,通过 Dependency Viewer 工具进行可视化,如果出现乱码,记得把 txt 文档保存为 UTF-8 式即可,得到的可视化结果如下图所示:
总结
本文,首先为大家介绍了语法体系,以及如何根据语法体系确定一个句子的语法树,为后面的句法分析奠定基础。
接着,介绍了依存句法,它的目的是通过分析语言单位内成分之间的依存关系揭示其句法结构,随之讲解了依存句法中的五大依存关系。
最后,进一步介绍了区别于依存句法的语义依存,其目的是分析句子各个语言单位之间的语义关联,并将语义关联以依存结构呈现。
文章结尾,通过 Pyhanlp 实战以及可视化,带大家进一步加深对中文依存句法的了解。
参考资料以及推荐阅读:
- 中文依存句法分析概述及应用
- LTP 依存分析模块所使用的依存关系标记含义
- 依存句法解析
- 依存分析:中文依存句法分析简介
- 依存句法分析与语义依存分析的区别
- pyltp:the python extension for LTP
- Dependency Viewer
如有侵权请联系QQ:758230255删除