基于CYK+PCFG的短语结构句法分析

1 概述

句法分析是自然语言处理中的关键技术之一。其基本任务是确定句子的句法结构(syntatic structure)或句子中词汇之间的依存关系。形式语法理论的目的是试图用精确的数学模型(形式语言)来刻划自然语言。句法分析根据形式语法的不同可以分为基于短语结构语法的句法分析和基于依存关系语法的依存句法分析。本篇文章将介绍使用CYK(一种自底向上的动态规划算法)+PCFG(概率上下文无关文法)的基于短语结构语法的句法分析。

2 理论描述

2.1 CFG(上下文无关文法)

形式语法G = < V N V_N VN, V T V_T VT,R,S>

  • V N V_N VN 非终端语符集(辅助词汇的有限集合) ,如{S, NP, VP, ART, N, V}
  • V T V_T VT 终端语符集(基本词汇的有限集合) ,如{the, a, boy ,sees , cat, dirty}
  • R 一组由有限个重写规则组成的规则集,如{ VP→V NP, ART → the|a, …}
  • S 表示起始符

句子:由语法 G 0 G_0 G0从起始符S可派生出来的终端语符列构成由 G 0 G_0 G0生成的句子。

语言:所有由语法 G 0 G_0 G0从起始符S可派生出来的终端语符列构成 G 0 G_0 G0生成的语言。

2.2 PCFG(概率上下文无关文法)

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)

2.3 CNF(Chomsky Normal Form)

如果一个上下文无关文法的每个产生式的形式为:

A → BC或A → a,

即规则的右部或者是两个非终结符或者是一个终结符,则它是具有Chomsky范式的CFG。

任何CFG都可以转变成一个弱等价的 Chomsky范式语法。

2.4 CYK算法

给定一个句子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(Xwi) (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(XYZ)×π(i,k,Y)×π(k+1,j,Z)) (i≤k≤j−1)

3 详例描述

给定以下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(XYZ)×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生成的概率最大句法树结果如图:

在这里插入图片描述

4 总结

普通的回溯法(backtracking)在最坏的情况下需要指数时间才能解决这样的问题,而CYK算法只需要多项式时间就够了。CYK算法采用了动态规划的思想:

  • 有 ( n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)) = O( n 2 n_2 n2) 格子
  • 有 O( n n n) 个可能的分裂点
  • 总的时间复杂度为 O( n 3 n_3 n3)

上述例子给出的PCFG并不是严格意义上的乔姆斯基范式,如果是CNF的话可以不用对本身格子里的语法再进行一元规则匹配,所以在实际应用中应先对CFG进行一次转换,采用乔姆斯基范式来进行CYK算法。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值