CYK算法详解

在计算机科学领域,CYK算法(也称为Cocke–Younger–Kasami算法)是一种用来对 上下文无关文法(CFG,Context Free Grammar)进行语法分析(parsing)的算法。该算法最早由John Cocke, Daniel Younger and Tadao Kasami分别独立提出,其中John Cocke还是1987年度的图灵奖得主。CYK算法是基于动态规划思想设计的一种自底向上语法分析算法。


Context Free Grammar 和 Parsing 在编译技术和自然语言处理中都有用到,我们这里介绍的内容主要基于后者,因此所举之例子也是自然语言处理中的例子。


1、乔姆斯基范式(CNF,Chomsky Normal Form)

我们首先来谈谈CNF的话题。通常把一门语言定义成一些由单词组成的词串(也就是句子)构成的集合。所以如果问两种语法(或文法)是否等价,其实就是要考察它们能否生成完全一样的词串集合。事实上,两个完全不同的CFG是不可能生成相同语言的。


而谈到两种语法“等价”,我们又可以定义弱等价和强等价两种类型的等价:

  • 如果两种语法能够生成相同的词串集合,且为每个句子都赋与相同的短语结构(phrase structure),也就是说仅允许对non-terminal symbols进行重命名,那么它们就是强等价的。
  • 如果两种语法能够生成相同的词串集合,但不会为每个句子都赋与相同的短语结构,那么它们就是弱等价的。

有时候,让各个语法都拥有一个标准的形式非常有用,也即是语法的规则部分都采用一种特殊的形式。CNF就是这样一种标准形式。如果 一个 CFG 是 ε-free ( ε 表示空串),而且它的rules只有如下两种形式之一:

  • A→B C 
  • A→a

那个这个CFG就是采用CNF形式的,可见CNF语法都是二分叉的。任何语法都可以转化成一个弱等价的CNF形式,具体方法如下:

CYK算法详解_第1张图片

2、CYK 算法

CYK处理的CFG必须是CNF形式的。所以算法首先要把非CNF形式的CFG转化到CNF形式,方法前面刚刚讲过。

接下来就是要填写一个 parse table,如果我们要处理的句子中有n个词,那么这个parse table就是一个(n+1)×(n+1)的矩阵的上三角部分。如下图所示。

CYK算法详解_第2张图片

注意,我们前面说过CYK是一种自底向上的算法,这里的自底向上意思是从单词开始,朝向 S(句子)工作。所以在上图我们填写的大方向是从左到右填写的。S 位于表的右上角,表示成功。算法描述如下:

CYK算法详解_第3张图片


其中,i 和 j 指示的内容如下图所示:

CYK算法详解_第4张图片

到此为止,我们得到的是一个recognizer, 还不是一个 parser,最后我们要根据已经得到的表返回所有可能的语法分析情况,就是大功告成了。

你可能感兴趣的:(CYK算法,NLP)