相关文章:
句法模式识别/结构模式识别(一)—概述
句法模式识别/结构模式识别(二)—形式语言
句法模式识别/结构模式识别(三)—文法推断
句法模式识别/结构模式识别(五)—自动机
一、 句法分析概念
利用文法对未知类别的句法模式进行识别或分类的过程
设有M类模式, ω i \boldsymbol{\omega }_{\boldsymbol{i}} ωi类模式即第i种语言 L ( G i ) \boldsymbol{L}\left( \boldsymbol{G}_{\boldsymbol{i}} \right) L(Gi)。对一个未知类别的句子x(句法模式):
- 若x是文法 G i \boldsymbol{G}_{\boldsymbol{i}} Gi的一个合法句子,则 x ∈ L ( G i ) \boldsymbol{x}\in \boldsymbol{L}\left( \boldsymbol{G}_{\boldsymbol{i}} \right) x∈L(Gi),即 x ∈ ω i \boldsymbol{x}\in \boldsymbol{\omega }_{\boldsymbol{i}} x∈ωi
- 若x不是M种文法中任何一种文法的合法句子,则拒识
二、句法分析的方法
2.1 参考链匹配法
设有M类模式
- 对每一类模式给出一组样本链(参考链)
- 将输入链x与每一类的参考链进行比较,并规定一个比较容限。x被识别为与其匹配“最好”的参考链所属的模式类
2.2 状态图法:适用于有限状态文法
2.3 填充树图法(适用于上下文无关文法)
若已知某语言的文法
G
i
\boldsymbol{G}_{\boldsymbol{i}}
Gi,给定某待识别的链x,建立一个以x为底,以起始符S为顶的三角形,如下图所示:
用文法
G
i
\boldsymbol{G}_{\boldsymbol{i}}
Gi的生成式填充这个三角形,使之成为一个分析树,若填充成功,表示x可以由文法
G
i
\boldsymbol{G}_{\boldsymbol{i}}
Gi导出。
因此
x
∈
L
(
G
i
)
\boldsymbol{x}\in \boldsymbol{L}\left( \boldsymbol{G}_{\boldsymbol{i}} \right)
x∈L(Gi),即
x
∈
ω
i
\boldsymbol{x}\in \boldsymbol{\omega }_{\boldsymbol{i}}
x∈ωi,否则x不属于该类。
填充三角形的方法:自顶向下、自底向上
-
自顶向下法
-
自底向上法
2.4 CYK分析法
库克(cocke)-杨格(younger)-卡塞米(kasami)分析法
用于上下文无关文法(CFG,Context Free Grammar)的分析
要求:生成式必须表示为乔姆斯基范式
- 乔姆斯基范式(CNF,Chomsky Normal Form)
A → B C 或 A → a \boldsymbol{A}\rightarrow \boldsymbol{BC}\,\,\text{或}\boldsymbol{A}\rightarrow \boldsymbol{a} A→BC或A→a
其中A,B,C为非终止符,a为终止符。
方法:将一个一般的上下文无关文法(CFG,以下都用CFG代替)构造一个乔姆斯基范式(CNF,以下都用CNF代替)的过程如下:
(1)为每个出现在长度大于等于2的产生式中的终结符a创建一个新的变元A,该变元只有一个产生式A→a。接着,可以用A来替代所有产生式中出现的a。现在,所有产生式或者是单个终结符,或者是至少两个以上的变元并且没有终结符。
(2)把所有形式为 A → B 1 B 2 B 3 ⋯ B k ( k ⩾ 3 ) \boldsymbol{A}\rightarrow \boldsymbol{B}_1\boldsymbol{B}_2\boldsymbol{B}_3\cdots \boldsymbol{B}_{\boldsymbol{k}}\text{(}\boldsymbol{k}\geqslant 3\text{)} A→B1B2B3⋯Bk(k⩾3)的产生式打断为以下一组产生式: A → B 1 C 1 , C 1 → B 2 C 2 , ⋯ , C k − 3 → B k − 2 C k − 2 , C k − 2 → B k − 1 B k \boldsymbol{A}\rightarrow \boldsymbol{B}_1\boldsymbol{C}_1\text{,}\boldsymbol{C}_1\rightarrow \boldsymbol{B}_2\boldsymbol{C}_2\text{,}\cdots \text{,}\boldsymbol{C}_{\boldsymbol{k}-3}\rightarrow \boldsymbol{B}_{\boldsymbol{k}-2}\boldsymbol{C}_{\boldsymbol{k}-2}\text{,}\boldsymbol{C}_{\boldsymbol{k}-2}\rightarrow \boldsymbol{B}_{\boldsymbol{k}-1}\boldsymbol{B}_{\boldsymbol{k}} A→B1C1,C1→B2C2,⋯,Ck−3→Bk−2Ck−2,Ck−2→Bk−1Bk
现在,所有的产生式都符合CNF的定义。
例如:
S → a A B , A → b B , B → c \boldsymbol{S}\rightarrow \boldsymbol{aAB}\text{,}\boldsymbol{A}\rightarrow \boldsymbol{bB}, \boldsymbol{B}\rightarrow \boldsymbol{c} S→aAB,A→bB,B→c
其乔姆斯基范式为:
S → D E , D → a , E → A B , A → F B , F → b , B → c \boldsymbol{S}\rightarrow \boldsymbol{DE}\text{,}\boldsymbol{D}\rightarrow \boldsymbol{a}\text{,}\boldsymbol{E}\rightarrow \boldsymbol{AB}\text{,}\boldsymbol{A}\rightarrow \boldsymbol{FB}\text{,}\boldsymbol{F}\rightarrow \boldsymbol{b}\text{,}\boldsymbol{B}\rightarrow \boldsymbol{c} S→DE,D→a,E→AB,A→FB,F→b,B→c - CYK算法
CYK处理的上下文无关文法必须是乔姆斯基范式形式的。所以算法首先要把非CNF形式的CFG转化到CNF形式,方法如上。
接下来需要构造一个识别矩阵,如果我们要处理的句子中有n个词,那么这个矩阵就是一个(n+1)×(n+1)的矩阵的上三角部分。这里假如要分析的句子是“The girl studies hard”,其给定的文法如下:
S → P V P V P → V V V P → V P N P → 他 V → 喜 欢 V → 读 N → 书 \boldsymbol{S}\,\,\rightarrow \boldsymbol{P}\,\,\,\,\,\,\boldsymbol{VP} \\ \boldsymbol{VP}\rightarrow \boldsymbol{V}\,\,\,\,\,\, \boldsymbol{V} \\ \boldsymbol{VP}\rightarrow \boldsymbol{VP}\,\,\,\,\,\,\boldsymbol{N} \\ \text{P}\rightarrow \boldsymbol{他} \\ \text{V}\rightarrow \boldsymbol{喜欢} \\ \text{V}\rightarrow \boldsymbol{读} \\ \text{N}\rightarrow \boldsymbol{书} S→PVPVP→VVVP→VPNP→他V→喜欢V→读N→书
步骤如下:
(1)首先构造主对角线,令 t 0 , 0 = 0 \boldsymbol{t}_{0,0}=0 t0,0=0.然后从 t 1 , 1 \boldsymbol{t}_{1,1} t1,1到 t n , n \boldsymbol{t}_{n,n} tn,n在主对角线的位置上依次放入句子的单词 ω i \boldsymbol{\omega }_{\boldsymbol{i}} ωi,如下图:
2.构造主对角线以上紧靠主对角线的元素 t i . i + 1 \boldsymbol{t}_{\boldsymbol{i}.\boldsymbol{i}+1} ti.i+1,其中i=0,1,2,⋯,n−1。对于输入句子 x = ω 1 ω 2 ⋯ ω n \boldsymbol{x}=\boldsymbol{\omega }_1\boldsymbol{\omega }_2\cdots \boldsymbol{\omega }_{\boldsymbol{n}} x=ω1ω2⋯ωn,从 ω 1 \boldsymbol{\omega }_1 ω1开始分析:
如果在文法G的产生式集中有一条规则 A → ω 1 \boldsymbol{A}\rightarrow \boldsymbol{\omega }_1 A→ω1,则填充 t 0 , 1 = A \boldsymbol{t}_{0,1}=\boldsymbol{A} t0,1=A,依此类推,如果有 A → ω i + 1 \boldsymbol{A}\rightarrow \boldsymbol{\omega }_{\boldsymbol{i}+1} A→ωi+1,则 t i , i + 1 = A \boldsymbol{t}_{\boldsymbol{i},\boldsymbol{i}+1}=\boldsymbol{A} ti,i+1=A。即,对于主对角线上的每一个终结符 ω i \boldsymbol{\omega }_{\boldsymbol{i}} ωi,所有可能推导出它的非终结符写在它的右边主对角线上方的位置上。如下图所示:
3.按平行于主对角线的方向,一层一层地向上填写矩阵的各个元素 t i , j \boldsymbol{t}_{\boldsymbol{i},\boldsymbol{j}} ti,j,其中 i = 0 , 1 , ⋯ , n − d j = d + i d = 2 , 3 , ⋯ , n \boldsymbol{i}=0,1,\cdots ,\boldsymbol{n}-\boldsymbol{d} \\ \boldsymbol{j}=\boldsymbol{d}+\boldsymbol{i} \\ \boldsymbol{d}=2,3,\cdots ,\boldsymbol{n} i=0,1,⋯,n−dj=d+id=2,3,⋯,n
如果存在一个正整数k(i+1≤k≤j−1)k(i+1≤k≤j−1),在文法G的规则集中有产生式A→BC,并且 B ∈ t i , k , C ∈ t k , j \boldsymbol{B}\in \boldsymbol{t}_{\boldsymbol{i},\boldsymbol{k}},\boldsymbol{C}\in \boldsymbol{t}_{\boldsymbol{k},\boldsymbol{j}} B∈ti,k,C∈tk,j,那么将A写到矩阵 t i . j \boldsymbol{t}_{\boldsymbol{i}.\boldsymbol{j}} ti.j位置上。
判断句子x由文法G所产生的充要条件是: t 0 , n = S \boldsymbol{t}_{0,\boldsymbol{n}}=\boldsymbol{S} t0,n=S
注意这里出错了,因为S最终的位置不在最右上角的地方,所以返回到上一步重新来:
这里S出现在了矩阵的最右上角,所以正确。
得到的分析树如下:
2.5 厄利分析法