CYK算法详解

news/2024/10/18 7:53:09/

在计算机科学领域,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形式,具体方法如下:


2、CYK 算法

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

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

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



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

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


http://www.ppmy.cn/news/802416.html

相关文章

自然语言处理(NLP)-统计句法分析(CKY算法用于PCFG下的句法分析)

1.先解释何为CFG及PCFG: 一个栗子: 2.CKY算法(或称CYK算法) “在计算机科学领域,CYK算法(也称为Cocke–Younger–Kasami算法)是一种用来对 上下文无关文法(CFG,Context F…

LeetCode-每日一题【2095.删除链表的中间节点】

题目 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。 对于 n 1、…

从Vue快速上手React

前言 还没使用过React 的 vue同学可以通过这篇博客快速上手React。 1、数据读写 Vue 数据读写&#xff1a; import { ref, reactive } from vueconst str ref<string>(Aos) const obj reactive<Record<string, string>>({name: vue,version: 3.2.x }) …

汉字拼音首字母

http://hi.baidu.com/stavevai/blog/item/9c76bea574baabff9052ee84.html 为方便拼音用户输入一些汉字&#xff0c;有时候我们需要提供一些拼音首字母的输入方法&#xff0c;这时候需要把相关的汉字的首字母提取出来。 下面这个例子用空间换时间&#xff0c;用查表的方法实现了…

Pinyin4j 汉字转拼音使用教程

目录 Pinyin4j 概述与下载 Pinyin4j 使用快速入门 Pinyin4j 概述与下载 1、pinyin4j 是一个开源的流行 java 库&#xff0c;用来处理中文转换成拼音&#xff0c;拼音输出格式可定制。 官网&#xff1a;http://pinyin4j.sourceforge.net 在线文档&#xff1a;http://pinyin4j…

如何用搜狗拼音输入法输入希腊字母

https://jingyan.baidu.com/article/48b37f8d09d18c1a6464882c.html 方法一&#xff1a;软键盘 右击输入法悬浮窗打开菜单-选择软键盘 这里有很多软键盘&#xff0c;其中第二个就是希腊字母软键盘&#xff0c;点击打开 第二次使用可以点击输入法悬浮窗上的软键盘快捷键来快速…

[转]粤语拼音方案

本文转自&#xff1a;http://inzoi.bokee.com/6981163.html 这里使用的粤语拼音方案的目的是:让所有会普通话拼音与英语的人一看就会,所以排除了引起歧义的写法对于难发的音,就使用两个音相拼的方法,让读音自己连读就可以模仿出近似的音. (如果还是看不懂,最简单的方法就是:下载…

搜狗输入法 VS 拼音加加

用了16年计算机&#xff0c;一共用过四个输入法&#xff1a;五笔&#xff08;牌子忘记了&#xff09;&#xff0c;智能ABC&#xff0c;拼音加加&#xff0c;搜狗。 放弃五笔的原因很简单&#xff1a;我要学拼音&#xff01; 一说到高考&#xff0c;北方人全笑了&#xff0c;语文…