依存句法分析
依存句法分析(dependency grammar)理论的创立者 是法国语言学家吕西安·泰尼埃(其姓氏也被译作:特 思尼耶尔、特尼耶尔等)(Lucien Tesnière , 1893-1954)。 他的主要思想反映在1953年出版的专著《结构句法概 要》(Esquisse dune syntaxe structu-rale)中。
在依存语法理论中,“依存”就是指词与词之间支配与被支配的关系,这种关系不是对等的,而是有方 向的。处于支配地位的成分称为支配者(governor, regent, head),而处于被支配地位的成分称为从属者 (modifier, subordinate, dependency)。
可以这么理解:
把句子里的每个词想象成 一个个小圆点(节点),然后不管有没有关系,先给 每两个圆点之间都连一条线(边)。
接下来,给每条线 贴个 “靠谱分”(根据词的关系、语法规则等打分)—— 比如 “打断” 和 “声” 的连线,比 “打断” 和 “我” 的连线更靠谱,分数就更高。
现在的任务是:从这堆线里,选出 一组线,满足两个条件:
- 所有圆点都被连起来(不能漏词);
- 这组线的 “靠谱分总和” 最高;
- 还不能绕圈(不然就不是树状结构了,而是乱麻)。
这就像 给一群人配对关系:先把所有人两两之间的 “亲密度” 打分,再挑一组关系,既把所有人连起来,又让亲密度总和最高,还不能绕圈(比如 A→B、B→C、C→A 就绕圈了,不行)。
最后选出的这组线,就是句子里 词和词的依存关系(比如 “打断” 是核心,连着眼 “声”“了”“沉思”,“脚步” 跟着 “声”,“我” 跟着 “的” 再跟着 “沉思”)。
简单说:把所有可能的关系都列出来,打分后挑出 “最合理且连得通” 的组合 ~
Arc - eager 算法可以理解成 “给词找‘老大’的动态过程” ,通过 4 种动作(Shift、Left - Arc、Right - Arc、Reduce),让每个词要么找到自己的 “老大”(支配它的词),要么成为别人的 “老大”,最终拼出句子的依存关系。下面结合 “小猫吃鱼” 的例子,通俗拆解每个动作:
1. 核心设定
把句子的分析状态想象成 “三元组”:
-
栈(S):类似 “候选区”,存放正在找老大或已经当老大的词(临时停留点)。
-
输入(I):类似 “排队区”,按句子顺序,还没处理的词排在这里。
-
依存弧(A):类似 “关系证明”,记录谁是老大(头)、谁是小弟(子),格式为 “老大→小弟”(比如 “猫→小” 表示 “小” 的老大是 “猫”)。
2. 4 种动作详解
① Shift(移进)
-
时机:候选区(栈)和排队区(输入)的词,暂时没法确定老大小弟关系时,先把排队区的第一个词拉进候选区。
-
操作:把输入的第一个词 推进栈。
-
例子:
初始状态:栈[nil]
(nil 是栈底标记,不算实际词),输入[小,猫,吃,鱼]
,弧∅
。
第一步只能做 Shift:把 “小” 推进栈,状态变成S=[nil,小]
,I=[猫,吃,鱼]
,A=∅
。
② Left - Arc(左弧)
- 时机:栈顶的词(小弟候选,
w_i
),发现输入的第一个词(w_j
)更适合当老大,且w_i
还没认过老大(没弧指向它)。 - 操作:让
w_j
当w_i
的老大(添加弧w_j→w_i
),然后把w_i
弹出栈(因为小弟已经找到老大,离开候选区)。 - 例子:
状态:S=[nil,小]
,I=[猫,吃,鱼]
,A=∅
(“小” 还没老大)。
做 Left - Arc:让 “猫” 当 “小” 的老大(添加弧猫→小
),弹出 “小”,状态变成S=[nil]
,I=[猫,吃,鱼]
,A={猫→小}
。
③ Right - Arc(右弧)
-
时机:栈顶的词(老大候选,
w_i
),想收输入的第一个词(w_j
)当小弟,且w_j
还没认过老大(没弧指向它)。 -
操作:让
w_i
当w_j
的老大(添加弧w_i→w_j
),然后把w_j
推进栈(小弟加入候选区,继续跟着老大混)。
④ Reduce(归约)
-
时机:栈顶的词(
w_i
)已经认过老大了(存在弧w_k→w_i
,即有老大)。 -
操作:把
w_i
弹出栈(小弟已经找到老大,不需要再待在候选区)。 -
例子:
状态:S=[nil,吃,鱼]
,I=[]
,A={吃→鱼}
(“鱼” 的老大是 “吃”)。
做 Reduce:弹出 “鱼”,状态变成S=[nil,吃]
,I=[]
,A={吃→猫, 吃→鱼}
。
性能评价
解题时
先描述依存关系
UA(无标记依存正确率):只看 父节点是否正确占总数
LA(带标记依存正确率):既看 父节点正确,又看关系正确占总数
DA(依存正确率,通常同 LA 逻辑)每条依存弧的两头正确占总弧