语法解析问题
语法解析问题是比词性标注更高层的问题, 它以一个完整的句子做为输入, 以一棵对应的语法解析树作为输出。语法解析树中不仅反应了各个单词的词性, 也反应出了各个词之间的关系,比如短语(动词短语,名词短语等)甚至句子中的主谓关系等。举个课程中的例子:
语法解析通常都会被表达成监督学习问题,而训练数据集可以是WSJ Treebank(for English);
语法树可以传达的信息:1. POS; 2. Phrase(VP, NP); 3. subject-verb;应用场景可以是机器翻译中,将源语言中单词间的顺序调换成目标语言中的词顺序。
上下文无关语法(Context-free grammer)
上下文无关语法对语言的一种形式化描述,具体表示为四元组\( G = (N, \Sigma, R, S) \),其中N表示非终结符,\(\Sigma\)表示终结符,S为特殊的开始符号,R则表示规则,即\(X \rightarrow Y_1 \dots Y_n, X \in N, Y_i \in (N+\Sigma), n \ge 0\)。例如:
最左推导:最左推导是一个序列\(s_1, ..., s_n\),序列的开头是\(s_1 = S\),其后的每一个元素\(s_i\)都是取前一个元素\(s_{i-1}\)中从左边数第一个非终结符,对其按照R中的某个规则进行展开而得到的结果,序列的结尾是一个全部由终结符构成的字符串,即\(s_n \in \Sigma^{*}\),例如,[S] [NP VP] [D N VP] [the N VP] [the man VP] [the man Vi] [the main sleeps]。
一个推导(derivation)实际就对应着一棵语法解析树,而推导最终的结果(终结符串)就是一个句子。一个CFG对应的所有推导结果的并集就是这个CFG所定义的语言;每个语言中的字符串有可能对应着不同的推导过程,因此一个句子可能对应着多棵语法树,这在一定程度上产生了歧义。比如,he drove down the street in the car这句话就可能有多种解析,in the car这个短语可以修饰drove形成动词短语,也可以修饰the street以形成名语短语,虽然第一种选择看起来更合理一些,但是CFG是无法区分出来的。
下面再给出几个可能出现的歧义情况
- POS歧义:her duck (NN, Vi)
- 介词短语所修饰的内容:比如前面提到的in the car
- 名词定语:the fast car mechanic (fast car -> mechanic, fast -> car mechanic)
PS: 这里本来还有一节是介绍英语语法的,这里先略过,后面如果有用到的话再说明。
概率上下文无法语法(Probabilistic Context-free grammer)
这个语法是为了解决上面提到的一个句子可能有多棵语法解析树的问题,这为每棵语法树赋予一个对应的概率值,而概率值最大的那个就被认为是这个句子的语法解析树。
实现上,它是对规则集R中的每条规则都赋予一个概率p,而一个推导实际就是从开始符S开始应用一系列规则最终生成非终结符串的过程,因此这个推导(或者说这棵对应的语法树)的概率就是在此过程中应用的所有规则概率的乘积,即
这个由部分概率(规则概率)到整体概率(语法树概率)的过程也是使用了独立性假设(与概率的链式规则做对比),即在推导的初始阶段应用的规则不依赖于后面应用到的规则,特别地,不依赖于最终的word。这也是后面提出lexicalized PCFG的动机。
当我们已经使用上面的方法为给定句子所对应的所有语法树都赋予了一个概率之后,下面要做的,就是取那个概率最大的语法树做为输出:
\[ opt\_tree = argmax_{t \in T(s)} p(t)\]
根据上面的流程,我们有两个问题需要解决:1. 如何为每个规则赋予一个概率值;2. 一个句子对应的可能的语法树是指数级别的,如何高效地为一个句子找到概率最大的语法树。
PCFG的参数估计
PCFG的参数就是每个规则的概率,当给定一个treebank之后,我们要做的实际跟N-gram类似:计数+MLE
\[ q_{ML}(\alpha \rightarrow \beta) = \frac{Count(\alpha \rightarrow \beta)}{Count(\alpha)}\]
如果训练数据确实是由PCFG生成的,那么当训练数据足够多时,MLE给出的结果将收敛于true PCFG。
PCFG解析
为了能多项式复杂度解决这个为给定句子找出最佳语法树的任务,还需要对PCFG加一些额外的约束,即要求语法G满足Chomsky Normal Form,简单来说就是要求四元组中的R只能取以下两种形式之一
- \(X \rightarrow Y_1 Y_2, X \in N, Y \in N\)
- \(X \rightarrow Y, X \in N, Y \in \Sigma\)
然后,使用一种称为CKY的算法来做这个解析工作,它的本质也是一种动态规划算法,如下
其中定义\(\pi (i, j, X)\)表示以非终结符X为root的覆盖word[i...j]的最佳语法树所对应的概率是多少。动态规划的过程是从长度最短的子句(单词,长度为1)开始,自底逐步向上,直至开始符S覆盖整个句子作为终结。每一步需要考虑覆盖的字句的长度以及对应的非终结符,计算复杂度为\(O(n^3N^3)\)。