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

news/2024/10/18 7:48:01/

1.先解释何为CFG及PCFG:

一个栗子:

2.CKY算法(或称CYK算法)

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

CYK算法可以在O(n3)的时间内得出结果。

CKY算法:

CYK处理的CFG必须是CNF形式的。所以算法首先要把非CNF形式的CFG转化到(弱等价)CNF形式。CYK是一种自底向上的算法。

乔姆斯基范式:

乔姆斯基范式:CNF

或者,ABC都为非终结符,为终结符。

那个这个CFG就是采用CNF形式的,可见CNF语法都是二分叉的。任何语法都可以转化成一个弱等价的CNF形式,具体方法如下:(之后会有拓展版的,不只二元了,还有空的与一元的。

 

方法:

 

                                                                CKY算法用于PCFG下的句法分析

实现句子fish people fish tanks的句法树分析,实现最可能的统计句法树。

基于概率的上下文无关语法(PCFG) 是一个五元组, 其定义为(T,  N,S,R,P). 可以看到, 这基本上与 CFG 类似, 只是多出来一个元素 p, 表示在语料中规则出现的概率. 使用p 可以定义一棵语法树出现的概率为树中所有规则出现概率之积. 这样, 当一个句子在可选的范围内有多棵可能的语法树时, 我们选择先验概率大的那棵树, 这样能最大程度避免解析错误。其中,

N代表非终结符集合

T代表终结符集合

S代表初始非终结符

R代表产生规则集

P 代表每个产生规则的统计概率

栗子:

拓展版:加入了一元。

CKY:

动态规划:

具体算法(类似填表的方法):

贴一个:

维基百科的CYK算法用于CFG。

https://en.wikipedia.org/wiki/CYK_algorithm#/media/File:CYK_algorithm_animation_showing_every_step_of_a_sentence_parsing.gif

第一部分:

下载stanford-parser-full-2018-10-17.zip

解压:打开eclipse创建一个项目,导入在build path中引入stanford-parser-3.9.2-models.jar,stanford-parser.jar, slf4j-api.jar等相关库.

调参:

主要代码:

结果:

句法树:

GUI界面:

相关教程连接:

http://www.cnblogs.com/Denise-hzf/p/6612574.html

第二部分:

Python3.5,pycharm.

动态规划PCFG+CKY程序:

链接:

http://f.dataguru.cn/thread-693052-1-1.html

 PCFG 的训练

  对于 PCFG 中的 CFG 部分, 一般是由领域相关的专家给出的, 例如英语专家规定英语的 CFG. 而PCFG 中的 p 是从语料中统计而来. 运用最大似然估计, 可以有: P(X -> Y) = count(X->Y)/count(X)

注意到, 规则中包括终端词与非终端词两种元素. 在一个适当规模的语料中, 我们可以认为所有的非终端词都会出现, 但是认为所有的终端词都会出现却是不现实的(想一下我们常听到的那个美国农民日常使用的英语单词只有数千个, 而所有的英语单词却有数万个的情况). 当语料中没有出现, 而在我们的测试样本中却出现了少见的单词时, PCFG 会对所有的语法树都给出概率为0的估计, 这对 PCFG 的模型是一个致命的问题.通常的补救措施是, 对语料中所有单词出现次数进行统计, 然后将出现频率少于 t 的所有单词都换成同一个 symbol. 在进行测试时, 先查找测试句子中的所有单词是否在句子中出现, 若没有出现, 则使用 symbol 代替. 通过这种方法, 可以避免 PCFG 模型给出概率为0 的估计, 同时也不会损失太多的信息.


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

相关文章

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;语文…

iOS - 找出汉字拼音首字母

#import <Foundation/Foundation.h>interface NSString (PinyinInitials)/**获取汉字拼音的首字母, 返回的字母是大写形式, 例如: "俺妹", 返回 "A".*如果字符串开头不是汉字, 而是字母, 则直接返回该字母, 例如: "b彩票", 返回 "B&q…