已迁移到我新博客,阅读体验更佳parsing:NLP之chart parser句法分析器

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

一、任务要求

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

二、技术路线

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

  • chart parsing的数据表示:

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

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

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

    • 若agenda为空,则把句子中下一个词的各种词法符号(词)和它们的位置加入进来
    • 从agenda中取一个元素(设为C,位置为:p1-p2)
    • 对下面形式的每个规则增加活动边:
      • X->CX1...Xn,增加一条活动边:X->C º X1...Xn,位置为:p1-p2;
      • X->C,把X加入agenda,位置为:p1-p2
    • 将C作为非活动边加入到chart的位置p1-p2
    • 对已有活动边进行边扩展
      • 对每个形式为:X->X1... º C...Xn的活动边,若它在p0-p1之间,则增加一条活动边:X->X1... C º...Xn,位置:p0-p2
      • 对每个形式为: X->X1... Xn º 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进行句法分析的结果截图如下:

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

  1. 基于CRF序列标注的中文依存句法分析器的Java实现

    这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...

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

    因为Twitter nlp中使用了较老版本的stanford parser,导致不能同时使用 解决方法是使用未集成其它jar包的Twitter nlp,关于这点Stanford FAQ中也有说明(在F ...

  3. C# Parsing 类实现的 PDF 文件分析器

    下载示例 下载源代码 1. 介绍 这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于“PDF指南,第六版,Adob ...

  4. Chart Parser 中 Earley's 算法的应用

    1. 基本概念 1.1 状态 state 上下文无关文法规则 圆点 · (左边是已分析的,右边是未分析的:点在最右端表示完成状态,否则为未完成状态) 状态的起止位置 1.2 基本操作/算子 opera ...

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

    1 安装 前言 Stanford CoreNLP的源代码是使用Java写的,提供了Server方式进行交互.stanfordcorenlp是一个对Stanford CoreNLP进行了封装的Pytho ...

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

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P8 -P11 CIPS2016> 中文信息处理报告下载链接:http://cips-uplo ...

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

    NLP+句法结构(三)︱中文句法结构(CIPS2016.依存句法.文法)转自:https://www.cnblogs.com/maohai/p/6453389.html 摘录自:CIPS2016 中文 ...

  8. 【NLP】依存句法关系符号解释

    今天开始读一篇论文:leveraging linguistic structure for open domain information extraction 于是……重新复习了很多句法分析的内容, ...

  9. pyhanlp 两种依存句法分类器

    依存句法分析器 在HanLP中一共有两种句法分析器 ·依存句法分析 (1)基于神经网络的高性能依存句法分析器 (2)MaxEnt依存句法分析 基于神经网络的高性能依存句法分析器 HanLP中的基于神经 ...

随机推荐

  1. Instrumentation(1)

    Instrumentation介绍: JavaInstrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不限于获取J ...

  2. 【NOI赛前训练】——专项测试1·网络流

    T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1, ...

  3. bzoj 1901 主席树+树状数组

    修改+查询第k小值 单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log 对了,bzoj上不需要读入组数,蜜汁re.. #include<cstdio> #in ...

  4. POJ_1269_Intersecting Lines_求直线交点

    POJ_1269_Intersecting Lines_求直线交点 Description We all know that a pair of distinct points on a plane ...

  5. java集合框架之HashMap

    参考http://how2j.cn/k/collection/collection-hashmap/365.html#nowhere HashMap的键值对 HashMap储存数据的方式是-- 键值对 ...

  6. java代码之美(12)---CollectionUtils工具类

    java代码之美(12)---CollectionUtils工具类 这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUt ...

  7. Actor模型及原理

    1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用 ...

  8. C语言sprintf和sscanf函数用法

    以前刚用C语言的时候,觉得字符串很难处理,后来用多了,发现其实并非如此,C语言也提供了许多函数给程序员使用.今天记录一下两个常用的两个字符串处理函数:sprintf和sscanf 1. sprintf ...

  9. python3的变量作用域规则和nonlocal关键字

    也许你已经觉得自己可以熟练使用python并能胜任许多开发任务,所以这篇文章是在浪费你的时间.不过别着急,我们先从一个例子开始: i = 0 def f(): print(i) i += 1 prin ...

  10. nginx 隐藏版本号与WEB服务器信息

    nginx不仅可以隐藏版本信息,还支持自定义web服务器信息 先看看最终的隐藏结果吧 具体怎么实现呢,其实也很简单,请往下看 1 官网下载最新稳定版 wget http://nginx.org/dow ...