赞
踩
句法分析是自然语言处理中的关键技术之一。其基本任务是确定句子的句法结构(syntatic structure)或句子中词汇之间的依存关系。形式语法理论的目的是试图用精确的数学模型(形式语言)来刻划自然语言。句法分析根据形式语法的不同可以分为基于短语结构语法的句法分析和基于依存关系语法的依存句法分析。本篇文章将介绍使用CYK(一种自底向上的动态规划算法)+PCFG(概率上下文无关文法)的基于短语结构语法的句法分析。
形式语法G = < V N V_N VN, V T V_T VT,R,S>
句子:由语法 G 0 G_0 G0从起始符S可派生出来的终端语符列构成由 G 0 G_0 G0生成的句子。
语言:所有由语法 G 0 G_0 G0从起始符S可派生出来的终端语符列构成 G 0 G_0 G0生成的语言。
PGFG在GFG的基础上引入了P,加上了每个规则的概率。
PCFG中定义一棵句法树的概率为所有用到的规则概率的乘积 ,一般来说,概率值大的更可能是正确的句法树 。
我们可以利用句子S的所有可能的句法分析树来统计句子的概率:
P ( S ) = ∑ t = 1 T P ( S , T ) P(S)=\sum_{t=1}^{T}P(S,T) P(S)=∑t=1TP(S,T)
如果一个上下文无关文法的每个产生式的形式为:
A → BC或A → a,
即规则的右部或者是两个非终结符或者是一个终结符,则它是具有Chomsky范式的CFG。
任何CFG都可以转变成一个弱等价的 Chomsky范式语法。
给定一个句子s = w 1 w_1 w1, w 2 w_2 w2, …, w n w_n wn, 和一个上下文无关文法PCFG,G=(T, N, S, R, P);
定义一个跨越单词 i到j的概率最大的语法成分π:
π ( i , j , X ) π (i , j , X) π(i,j,X) (i , j ∈ 1…n , X ∈N),
目标是找到一个属于 π [1 , n , S]的所有树中概率最大的那棵。
CYK算法用于PCFG下的句法分析:
基本定义:for all i=1,…,n, X ∈N
π ( i , i , X ) = q ( X → w i ) π(i , i , X) = q(X→wi) π(i,i,X)=q(X→wi) (if X → wi 没有出现在语法中,则定义q(X → wi )=0)
递归定义:for all i=1,…,n, j=(i+1),…,n, X ∈N
π ( i , j , X ) = m a x ( q ( X → Y Z ) × π ( i , k , Y ) × π ( k + 1 , j , Z ) ) π(i, j, X ) = max (q(X→YZ)×π(i, k, Y)×π(k +1, j, Z)) π(i,j,X)=max(q(X→YZ)×π(i,k,Y)×π(k+1,j,Z)) (i≤k≤j−1)
给定以下PCFG,实现句子“fish people fish tanks”最可能的统计句法树。
第一步:构造4*4矩阵。
根据CYK算法,每格Cell[i, j]包含了跨越单词i+1, j+1的所有语法成分(实际计算中下标是从0开始的)。
以Cell[1, 3]为例,Cell[1, 3]格中的成分分别为:(1,1)和(2,3)组成,(1,2)和(3,3)组成,包含了people fish tanks
所有语法成分。
第二步:处理叶子节点中的单词。
第三步:根据叶子节点中单词的词性递归地找一元匹配规则。
以 [ 0 ] [ 0 ] [0][0] [0][0]中NP → N 0.14为例,0.14 = 0.7(规则集中NP→N) * 0.2( [ 0 ] [ 0 ] [0][0] [0][0]中的N→fish)。
第四步:处理非叶子节点。
根据PCYK算法π(i, j, X ) =max (q(X→YZ) × π(i, k, Y) × π(k+1, j, Z) )。
例如 s c o r e [ 0 ] [ 1 ] = s c o r e [ 0 ] [ 0 ] × s c o r e [ 0 + 1 ] [ 1 ] score[0][1]=score[0][0]×score[0+1][1] score[0][1]=score[0][0]×score[0+1][1],我们可以从规则集中找所有能够满足 [ 0 ] [ 0 ] [0][0] [0][0]和 [ 1 ] [ 1 ] [1][1] [1][1]的规则(NP → NP NP/ VP → V NP/ S → NP VP),并再递归地找满足 [ 0 ] [ 1 ] [0][1] [0][1]的规则(S → VP)。
因为此时S→有两条规则,我们比较其大小,仅保留其对大概率的一条规则即可。
概率计算方法以 [ 0 ] [ 1 ] [0][1] [0][1]中的S → NP VP 0.00126为例,0.0126 = 0.9(规则集中的S → NP VP)* 0.14( [ 0 ] [ 0 ] [0][0] [0][0]中的NP → N 0.14) * 0.01( [ 1 ] [ 1 ] [1][1] [1][1]中的NP → N 0.14)。
[ 1 ] [ 2 ] [1][2] [1][2], [ 2 ] [ 3 ] [2][3] [2][3]同理。
第五步:处理再上一层非叶子节点。
根据PCYK算法 s c o r e [ 0 ] [ 2 ] = q ( X → Y Z ) × m a x ( s c o r e [ 0 ] [ 0 ] × s c o r e [ 0 + 1 ] [ 2 ] , s c o r e [ 0 ] [ 1 ] × s c o r e [ 1 + 1 ] [ 2 ] ) score[0][2] = q(X→YZ)×max(score[0][0]×score[0+1][2], score[0][1]×score[1+1][2]) score[0][2]=q(X→YZ)×max(score[0][0]×score[0+1][2],score[0][1]×score[1+1][2])。
我们知道,无论是 [ 0 ] [ 0 ] [0][0] [0][0]+ [ 1 ] [ 2 ] [1][2] [1][2]还是 [ 0 ] [ 1 ] [0][1] [0][1]+ [ 2 ] [ 2 ] [2][2] [2][2]都覆盖了前三个单词的路径,因此我们分别从 [ 0 ] [ 0 ] [0][0] [0][0]和 [ 1 ] [ 2 ] [1][2] [1][2], [ 0 ] [ 1 ] [0][1] [0][1]和 [ 2 ] [ 2 ] [2][2] [2][2]找对应的匹配规则。再对结果找到对应 [ 0 ] [ 2 ] [0][2] [0][2]的一元规则。
当同一个非终端语符有多条规则时,我们仅保留其最大项。
[ 1 ] [ 3 ] [1][3] [1][3]同理。
第六步:处理根节点。
根据PCYK算法我们分别从 [ 0 ] [ 0 ] [0][0] [0][0]+ [ 1 ] [ 3 ] [1][3] [1][3], [ 0 ] [ 1 ] [0][1] [0][1]+ [ 2 ] [ 3 ] [2][3] [2][3], [ 0 ] [ 2 ] [0][2] [0][2]+ [ 3 ] [ 3 ] [3][3] [3][3]找对应的匹配规则,再对结果找对应 [ 0 ] [ 3 ] [0][3] [0][3]的一元规则,这样便可覆盖率所有单词。
当同一个非终端语符有多条规则时,我们仅保留其最大项。
第七步:回溯。
从根节点的开始标志S出发,按照之前保留的路径找出概率最大句法树。
最后,PCFG生成的概率最大句法树结果如图:
普通的回溯法(backtracking)在最坏的情况下需要指数时间才能解决这样的问题,而CYK算法只需要多项式时间就够了。CYK算法采用了动态规划的思想:
上述例子给出的PCFG并不是严格意义上的乔姆斯基范式,如果是CNF的话可以不用对本身格子里的语法再进行一元规则匹配,所以在实际应用中应先对CFG进行一次转换,采用乔姆斯基范式来进行CYK算法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。