本文的部分例子来自北京大学计算语言学研究所詹卫东老师开设的研究生课程“计算语言学概论”的课件,在此向詹老师表示感谢。感谢夏雪同学指导作者理清“规则”与“文法”之间的关系。对本文中的可能存在的其他错误由作者本人负责。
由形式语言理论提出,在计算语言学中广泛使用的“上下文无关文法”(Context Free Grammar,缩写为CFG,也被称作2型语法)并不是上下文无关的。之所以被称作“上下文无关文法”,是为了和“上下文有关文法”(Context Sensitive Grammar,缩写为CSG,也被称作1型语法)区别开来。
先简要地介绍一下形式语言中的四种文法:正则文法(3型文法)、上下文无关文法(2型文法)、上下文相关文法(1型文法)和无限制重写文法(0型文法)。
正则文法
正则文法的规则集中的规则只符合如下两种形式其中一种,其中A、B为单个非终端符,A与B可以相同,x为单个终端符。
种类一:左线性正则文法
A → B x
A → x
种类二:右线性正则文法
A → x B
A → x
对于一个文法,如果它的规则集同时具备且仅同时具备A → B x,A → x B和A → x三种形式的规则,那么它就不再是正则文法,而变成了上下文无关文法。
例如,包含下列三条规则的规则集可以识别句子“董永喜欢七仙女”,也就是说这个句子符合包含该规则集的正则文法。
q0 → 董永 q1
q1 → 喜欢 q2
q2 → 七仙女
再例如,句子“未庄的阿Q和他的三本汉语语法书”符合包含以下规则集的正则文法。注意规则“q2 → 的 q0”调用了两次。
q0 → 未庄 q2
q2 → 的 q0
q0 → 阿Q q2
q2 → 和 q3
q3 → 他 q2
q0 → 三 q1
q1 → 本 q4
q4 → 汉语 q5
q5 → 语法 q6
q6 → 书
注意:“文法”与“规则”是不同的。“文法”是一个系统,除了规则集,还包含起始符,终端符集和非终端符集等部件。而“规则”只是一条转写规则,形如“A → B x”,表示箭头左边的内容可以被右边的内容替换。若干条“规则”构成一个规则集,作为某个“文法”的一个组成部分。日常交流中,我们可能会指着一条规则说“这是一条上下文无关文法”,这个说法严格地说是错误的,类似指着一个词说“这是一个词汇”。
另外,文法也有 Token 和 Type 之分。可以给出一个描述英语的上下文无关文法和一个描述汉语的上下文无关文法。这时,我们就有了两个上下文无关文法的 Token,但是作为 Type 只有一种上下文无关文法。
上下文无关文法
上下文无关文法的规则集中的规则符合形式:
A → α
其中 A 为单个非终端符,α 可以由任意个数的终端符或非终端符以任意方式拼接而成,不能是空字符串。例如,现代汉语中的正反疑问短语结构“VP 不 VP”、“V 不 VP”、“Adj 不 Adj”就可以作为 α 出现在上下文无关文法转写规则的右侧,生成或识别各式各样的正反疑问短语,例如“参加不参加”,“吃不吃饭”,“开心不开心”等等。
下列属于上下文无关文法的规则集可以识别句子“great linguists generate green ideas”。
S → NP VP
NP → ADJ NP
NP → NOUN
VP → VERB NP
VP → VERB
NOUN → ideas
NOUN → linguists
VERB → generate
ADJ → great
ADJ → green
上下文相关文法
上下文相关文法的规则集中的规则符合形式:
αAβ→αγβ
其中A为单个非终端符,α、β 和 γ 可以由任意个数的终端符或非终端符以任意方式拼接而成。α 和 β 可以是空字符串,γ 不能是空字符串。
无限制重写文法
无限制重写文法的形式是:
α→β
其中 α 和 β 可以由任意个数的终端符或非终端符以任意方式拼接而成,α 和 β 都可以是空字符串。
从上述例子可以看到,从正则文法到无限制重写文法,对转写规则中符号的限制是逐步削弱的。事实上,四种文法之间存在包含关系:左/右正则文法 ⊆ 上下文无关文法 ⊆ 上下文相关文法 ⊆ 无限制重写文法。
现在回到题目中提出的问题:“上下文无关文法”是否是上下文无关的?答案是否定的。
举个例子:有一个上下文无关文法的规则集如下所示:
A → b C d
E → C f g
C → a b
“上下文无关”意味着 C → a b 这条规则将一个单独的非终端符 C 变换为两个连续的终端符 “a b” ,C 向 “a b” (而不是向“c d”之类的其他串)变换这一条操作是由这条规则本身决定的。然而,纵观整个规则集,“a b” 这个序列只能出现在 “b” 和 “d” 之间,或者 “f g” 之前—— “a b” 只能出现在特定的上下文中,是上下文有关的。在上下文无关文法中,C 能变换成什么样子,箭头左边不是 C 的规则管不了;但是 C 以及 C 的变换结果能出现在什么地方,就得受箭头右边出现 C 的其他规则管着了。“上下文无关”主要指这句话的前半部分。所以说“上下文无关文法”其实是上下文有关的。
如果我们把上述例子中的上下文无关文法的规则集改为上下文相关文法的规则集(蓝字相当于上下文相关文法中的 α 和 γ):
A → b C d
B →C f g
bC d→ ba b d
C f g→ b af g
这样一来,得到一个 C,在不知道 C 左右两边的字符串之前,我们没法知道 C 会被转写成什么字符串。在上下文相关语法的规则集中,不仅 C 和 C 的变换结果能出现的位置受上下文限制,C 的变换过程也受上下文限制了。
综上所述,“上下文无关文法”的“上下文无关”指的是:将某个单独的非终端符转写为什么样的其他的形式,只与规则集中箭头左边为这个非终端符的转写规则有关,与同一个规则集中的其他规则无关。但是,这个非终端符以及它所能生成的字符串在整个字符串中所处的位置,却是同一个规则集中其他在箭头右边包含这个非终端符的规则所决定的。所以说,“上下文无关文法”其实是上下文有关的。
最后贴上一个对“计算语言学”这门学科的界定:
有机会讲讲“计算语言学”、“计量语言学”、“语料库语言学”、“数理语言学”和“自然语言处理”这几个学科之间的联系与区别。
参考文献
[1] 俞士汶, 常宝宝, 詹卫东. 计算语言学概论[M]. 北京: 商务印书馆, 2003
[2] 宗成庆. 统计自然语言处理(第二版)[M]. 北京: 清华大学出版社, 2013
[3] Wikipedia: Chomsky Hierarchy[EB/OL]. https://en.wikipedia.org/wiki/Chomsky_hierarchy, 2017-8-12/2017-10-15