parsing:NLP之chart parser句法分析器

完整代码实现放在我的github上:click me

一、任务要求

  • 实现一个基于简单英语语法的chart句法分析器。

二、技术路线

????????采用自底向上的句法分析方法,简单的自底向上句法分析效率不高,常常会重复尝试相同的匹配操作(回溯之前已匹配过)。一种基于图的句法分析技术(Chart Parsing)被提出,它把已经匹配过的结果保存起来,今后需要时可直接使用它们,不必重新匹配。(动态规划)

  • chart parsing的数据表示:

    • p图(chart)的结点表示句子中词之间的位置数字
    • p非活动边集(chart的核心,常直接就被称为chart
      • n记录分析中规约成功所得到的所有词法/句法符号
    • 活动边集
      • 未完全匹配的产生式,用加小圆圈标记(o)的产生式来表示,如:

        • NP -> ART oADJ N
        • NP -> ART oN
    • 待处理表(agenda)
      • 实际上是一个队列模型,记录等待加入chart的已匹配成功的词法/句法符号
    • 上面的活动边、非活动边以及词法/句法符号都带有“始/终结点”位置信息
  • chart parsing对“~1~ The ~2~ cat ~3~ caught ~4~ a ~5~ mouse ~6~”进行分析的数据示例:

  • chart parsing的句法分析算法步骤描述如下:

    • 若agenda为空,则把句子中下一个词的各种词法符号(词)和它们的位置加入进来
    • 从agenda中取一个元素(设为C,位置为:p1-p2)
    • 对下面形式的每个规则增加活动边:
      • X->CX~1~...X~n~,增加一条活动边:X->C o X~1~...X~n~,位置为:p1-p2;
      • X->C,把X加入agenda,位置为:p1-p2
    • 将C作为非活动边加入到chart的位置p1-p2
    • 对已有活动边进行边扩展
      • 对每个形式为:X->X~1~... o C...X~n~的活动边,若它在p0-p1之间,则增加一条活动边:X->X~1~... C o...X~n~,位置:p0-p2
      • 对每个形式为: X->X~1~... X~n~ o C的活动边,若它在p0-p1之间,则把X加入agenda ,位置为:p0-p2
  • 程序实现的大致流程:输入英文语句,对在词典dic_ec.txt中不存在的英文单词进行形态还原,对还原后的语句执行chart parsing算法并将分析出的所有非活动边输出。由于一个英文单词可能存在多种词性,这种情况下会对每种可能的词性进行递归,对于不符合句法规则的词性会进行回溯尝试以其它的词性进行句法规则的匹配与分析。直到找到符合句法规则的词性组合则结束递归,尝试完所有的词性组合还是没能找到则句法分析失败,输入的句子不符合当前的句法规则。

三、数据说明

  • 由于这个实验中引用了token实验模块,所以需要用到token实验中的三个数据字典dic_ec.txt,irregualr nouns.txt,irregular verbs.txt,关于这三个数据字典的说明在token实验中已给出,此处不再赘述。除此之外,chart parsing算法还需要用到dic_ec.txt词典中英文单词的词性。

四、遇到的问题及解决方案

  • 程序实现过程中受到文件编码和分隔符的困扰,最后用vim把用到的3个数据词典统一设置成gbk编码,以\t进行分隔,方便程序统一读入处理。
  • dic_ec.txt这个数据字典中的数据质量不太好,很多英文单词都被标注成none.词性,由于无法获取词的正确词性从而无法完成句子的句法分析。

五、性能分析

  • 对句法分析部分作一个性能的度量,单句句法分析的结果基本都在毫秒级别,下面给出基于规则S->NP VP,NP->ART N,NP->ART ADJ N,VP->V,VP->V NP对the cat catch a mouse进行句法分析得到的运行结果及耗时截图:

六、运行环境

  • 将执行文件parsing.exe与数据字典dic_ec.txt,irregular nouns.txt,irregualr verbs.txt放在同一个文件夹下,然后点击parsing.exe即可正常运行程序。

七、用户手册

  • 在运行环境下正常运行程序后会出现下图这样的主菜单文字界面:

  • 根据主菜单进行操作,首先选择1来写入规则,可一次写入多个规则,输入q!结束规则写入,如果后期需要增加规则,可以在主菜单界面再次选择1来写入增添的规则,这样就实现了规则的灵活扩展。下面是写入规则模块的截图:

  • 写入规则结束后又回退到主菜单界面,这时候可以选择2来输入句子进行句法分析,程序会输出分析过程中得到的所有非活动边对应的短语及位置范围,下面是在上面所写入规则的基础上对the cat caught a mouse进行句法分析的结果截图,程序会对dic_ec.txt中不存在的单词尝试调用词形还原模块进行还原再分析:

  • 句法分析回退到主菜单界面,可以继续选择1进行规则扩展,也可以选择2进行句法分析,选择q退出程序运行。
  • 基于下面的句法规则给出一个句法分析示例:
NP->ART N
NP->ART
NP->PRON
NP->N
NP->ART ADJ N
VP->V
VP->V NP

对I like her进行句法分析的结果截图如下:

原文地址:https://www.cnblogs.com/brooksj/p/10765635.html

时间: 2024-08-30 06:26:01

parsing:NLP之chart parser句法分析器的相关文章

最大熵依存句法分析器的实现

这是一个判别式汉语句法分析器的Java实现,基于最大熵模型和最大生成树模型,实现了中文依存句法的自动分析,在封闭测试集(取自训练集)上取得了99.20%的准确率(UA),分析速度达到 570.7句/秒.判别式的分析方法该方法采用条件概率模型,将所有依存关系概率的累积作为目标函数的score,取score最大的依存关系树作为输出.最大生成树模型最大生成树模型(maximum spanning trees, MST) 定义整棵句法树的打分是树中各条边打分的加权和:s 表示打分值,y 是句子x 的一棵

生成式依存句法分析器的简单实现

生成式句法分析指的是,生成一系列依存句法树,从它们中用特定算法挑出概率最大那一棵.句法分析中,生成模型的构建主要使用三类信息:词性信息.词汇信息和结构信息.前二类很好理解,而结构信息需要特殊语法标记,不做考虑.本文主要利用了词汇+词性生成联合概率模型,使用最大生成树Prim算法搜索最终结果,得到了一个简单的汉语依存句法分析器.基本思路统计词语WordA与词语WordB构成依存关系DrC的频次,词语WordA与词性TagB构成依存关系DrD的频次,词性TagA与词语WordB构成依存关系DrE的频

同时使用Twitter nlp 和stanford parser的解决方法

因为Twitter nlp中使用了较老版本的stanford parser,导致不能同时使用 解决方法是使用未集成其它jar包的Twitter nlp,关于这点Stanford FAQ中也有说明(在FAQ17),并且还给出了twitter nlp中都用了哪些jar包 大部分的jar包都可以下载到 但有些因为版本原因也不能使用像twitter-text 因此,在这里我整理了一下,供大家下载.

stanfordCorenlp在python3中的安装使用+词性学习

1 安装 前言 Stanford CoreNLP的源代码是使用Java写的,提供了Server方式进行交互.stanfordcorenlp是一个对Stanford CoreNLP进行了封装的Python工具包,GitHub地址,使用非常方便. 安装依赖 1:下载安装JDK 1.8及以上版本. 2:下载Stanford CoreNLP文件,解压. 3:处理中文还需要下载中文的模型jar文件,然后放到stanford-corenlp-full-2018-02-27根目录下即可(注意一定要下载这个文件

转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)

NLP+句法结构(三)︱中文句法结构(CIPS2016.依存句法.文法)转自:https://www.cnblogs.com/maohai/p/6453389.html 摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P8 -P11 CIPS2016> 中文信息处理报告下载链接:http://cips-upload.bj.bcebos.com/cips2016.pdf 一.依存句法分析 依存语法存在一个共同的基本假设:句法结构本质上包含词和词之间的

NLP︱中文分词技术小结、几大分词引擎的介绍与比较

笔者想说:觉得英文与中文分词有很大的区别,毕竟中文的表达方式跟英语有很大区别,而且语言组合形式丰富,如果把国外的内容强行搬过来用,不一样是最好的.所以这边看到有几家大牛都在中文分词以及NLP上越走越远.哈工大以及北大的张华平教授(NLPIR)的研究成果非常棒! 但是商业应用的过程中存在的以下的问题: 1.是否先利用开源的分词平台进行分词后,再自己写一些算法进行未登录词.歧义词的识别? 2.或者直接调用下文介绍的分词引擎来进行分词呢?缴费使用固然很棒,但是是否值得? ---------------

使用Berkeley Parser进行句法分析

一.句法分析 1.定义 句法分析判断输入的单词序列(一般为句子)的构成是否合乎给定的语法,并通过构造句法树来确定句子的结构以及各层次句法成分之间的关系,即确定一个句子中的哪些词构成一个短语,哪些词是动词的主语或宾语等问题. 2.主流技术 基于统计的方法是现阶段句法分析的主流技术.常见的概率句法分析模型包括概率上下文无关模型.基于历史的句法分析模型.层次化渐进式的句法分析模型和中心词驱动的句法分析模型.综合多种模型而实现的句法分析器种类繁多,目前在开源中文句法分析器中比较具有代表性有Stanfor

NLP自然语言处理

NLP组成部分 自然语言理解NLU 将给定的自然语言输入映射为有用的表示. 分析语言的不同方面. 自然语言生成NLG 文字规划 - 这包括从知识库中检索相关内容. 句子规划 - 这包括选择所需的单词,形成有意义的短语,设定句子的语气. 文本实现 - 这是将句子计划映射到句子结构. NLP术语 音韵 - 这是系统地组织声音的研究. 形态 - 这是建设从原始的有意义的单位的话的研究. 语素 - 它是语言中意义的原始单位. 语法 - 它是指安排单词来表达一个句子. 它还涉及确定单词在句子和短语中的结构

4.7.3 Canonical LR(1) Parsing Tables

4.7.3 Canonical LR(1) Parsing Tables We now give the rules for constructing the LR(1) ACTION and GOTO functions from the sets of LR(1) items. These functions are represented by a table, as before. The only difference is in the values of the entries.