1. 依存句法的理论
1.1 依存关系
在依存句法分析中,句子中词与词之间存在一种二元不等价关系: 主从关系
。在句子中,如果一个词修饰另一个词,则称修饰词为从属词(dependent)
,被修饰词成为支配词(head)
,两者之间的语法关系就是依存关系(dependency relation)
。
如句子“小目标”中的形容词“小”与名次“梦想”之间的关系如下图所示:
在图中,箭头的方向由支配词指向从属词。将句子中所有的词语的依存关系以有向边的形式表示出来,就会得到一颗树,该树即是依存句法树(dependency parse tree)
。
1.2 依存句法的约束公理
现代依存语法中,语言学家Robinson对依存句法树提出了一下4条约束性公理:
- 有且只有一个词语(root,虚拟根节点,简称虚根)不依存于其他词语;
- 除此之外所有词语必须依存于其他词语;
- 每个词语不能依存于多个词语;
- 如果词语A依存于B,那么位置处于A和B之间的词语C只能依存于A、B或AB之间的词语;
这四条公理分别约束了依存句法树的根节点的唯一性
、连通
、无环
、投射性
。
2. 基于转移的依存句法分析
依存句法分析
是一种中高级NLP任务,用来分析句子的依存语法。通常根据句子的词语和词性,生成一颗依存句法树。
目前常用的依存句法分析方法是:基于转移的依存句法分析
。基于转移的依存句法分析属于监督学习的范畴,其涉及许多组件。我们先定义一台虚拟的机器,这台机器会根据自身的状态和输入的词语预测下一步要执行的转移动作,然后根据转移动作拼装句法树。该类算法中比较经典的是:Arc-Eager
。
2.1 Arc-Eager转移系统
一个转移系统(Transition System)
S由4个部件构成:
其中:
- C是系统状态集合;
- T是所有可执行的转移动作的集合,每个转移动作可视作为输入输出都为系统状态的函数;
- c_s是一个初始化函数,将句子转换为一个初始的系统状态;
- C_t是C的一个子集,表示一系列终止状态,系统进入这些状态之后即可停止,并输出最终的动作序列。
系统状态由3元组组成:c = (s, b, A),其中:
- s是一个栈,用来存储单词,这些单词可视作子树的根节点;
- b是一个队列,用来存储单词,初始状态是整个句子;
- A是一个集合,表示已经确定的依存弧。
Arc-Eager转移系统的转移动作集合和响应的执行条件如下表所示:
动作名称 | 动作 | 条件 | 备注 |
Shift | (s, i|b,A) => (s|i, b, A) | 队列b非空 | 将队首单词i压栈 |
LeftArc | (s|i, j|b, A) => (b, j|b, AU{(i <-- j)}) | 栈顶单词i没有支配词 | 将栈顶单词i的支配词设置为队首单词j,即i作为j的子节点; |
RightArc | (s|i, j|b, A) => (s|i|j, b, AU{(i–>j)} ) | 队首单词就没有支配词 | 将队首单词j的支配词设置为栈顶单词i,集j作为i的子节点; |
Reduce | (s|i, b, A) => (s, b, A) | 栈顶单词i已有支配词 | 将栈顶单词i出栈; |
备注:转移系统的终止状态为:栈为空,且队列仅剩下虚根(root)时的状态。
Demo
以“我爱自然语言处理”为例,使用Arc-Eager
转移系统进行依存分析时系统状态如下:
编号 | 转移动作 | s | b | A |
0 | init | [] | [我,爱,自然语言处理,root] | {} |
1 | Shift | [我] | [爱,自然语言处理,root] | {} |
2 | LeftArc(主谓) | [] | [爱,自然语言处理,root] | {我 <-- 爱} |
3 | shift | [爱] | [自然语言处理,root] | {我 <-- 爱} |
4 | RightArc(动宾) | [爱,自然语言处理] | [root] | {我 <-- 爱, 爱 --> 自然语言处理} |
5 | Reduce | [爱] | [root] | {我 <-- 爱, 爱 --> 自然语言处理} |
6 | LeftArc(核心) | [] | [root] | {我 <-- 爱, 爱 --> 自然语言处理, 爱 <-- root} |
3. 依存句法分析的工具
常用的依存句法分析工具如下: