1. 基本概念

1.1 状态 state

  • 上下文无关文法规则
  • 圆点 · (左边是已分析的,右边是未分析的;点在最右端表示完成状态,否则为未完成状态)
  • 状态的起止位置

1.2 基本操作/算子 operator

  • 预测 Predicator:若圆点右方是一个非终结符,那么以该终结符为左部的规则都有匹配的希望。
  • 扫描 Scanner:若圆点右方是一个终结符,那么圆点向右扫描一个字符。
  • 归约 Completer:若圆点右方没有符号,则表示当前状态所作的预测已经实现,因为可以将当前状态与已有包含当前状态的状态进行归约。

1.3 算子的形式定义

*α,β,γ是终结符或非终结符串 是终结符或非终结符串,其中α,β均 为空字符 可 i <= j <= k

  • Predicator:对于状态 Z -> α·Xβ[j,k](X 是非终结符),对于语法中每条形如 X -> γ 的规则,都可以形成一个新状态:X -> ·γ[k,k]
  • Scanner:对于状态 Z -> α·Xβ[j,k](X 是终结符),如果 X 与输入字符串中的第 k 个字符匹配,就形成一个新状态 Z -> αX·β[j,k+1]
  • Completer:对于一个已经完成的状态 Z -> γ·[j,k],如果已后状态集合中有形如 X -> α·Zβ[i,j]这样的状态,就形成一个新状态:X -> αZ·β[i,k]

2. 算法描述

设输入字符串长度为n, 字符间隔可记做0,1,2,…,n

(1)将文法规则中形如 S -> α 的规则形成状态: <S -> ·α[0,0]> 加入到状态集合中(种子状态/seed state)

(2)对当前分析句子的每个词,依次进行循环:

i)如果当前状态是[未完成状态],且点后不是终结符,则 执行Predicator;

ii)如果当前状态是[未完成状态],且点后是终结符,则 执行Scanner;

iii)如果当前状态是 如果当前状态是[完成状态],则 执行Completer;

(3)如果最后得到形如<S -> α·[0,n]>这样的状态,那么输入字符串被接受为合法的句子,否则分析失败

3. 示例

使用以下文法分析字符串 "I-I-|":

p : e '-|'

e : t

| e '-' t

t : f

| t '/' f

f : I

| '(' e ')'

(0)字符串长度为 4,因此分析表共有 4+1=5 个状态集,将所有种子状态加入状态集 0

(1)此时需要匹配的字符为 'I',首先对状态 e 执行 Scanner 操作后,产生状态 f

由于状态 f 处于完成状态,触发 Completer 操作。由于状态 f 的左部为非终结符 f ,因此对于状态集 0 中所有圆点右方第一个字母为 f 的状态,都可以产生一个新状态。继而由状态 d 得到了状态 g

此时状态 g 也处于完成状态,因为执行 Completer 操作,得到状态 h 和未编号状态 t : t·'/'f,0

状态 h 也处于完成状态,执行 Completer 得到状态 i 和未编号状态 p : e·'-|',0

(2)(3)(4)以此类推,填充每个状态集,最后得到的状态 p : e'-|'·,0 为完成状态,表示分析成功

此时回顾整张分析表,对所有在这次成功分析中有所贡献的状态进行编号。

注:

1. “基本概念”与“算法描述”两个部分参考了 http://ccl.pku.edu.cn/doubtfire/Course/Computational%20Linguistics/contents/Earley_Parsing.pdf

2. 例题取自 http://inst.eecs.berkeley.edu/~cs164/sp19/

Chart Parser 中 Earley's 算法的应用的更多相关文章

  1. parsing:NLP之chart parser句法分析器

    已迁移到我新博客,阅读体验更佳parsing:NLP之chart parser句法分析器 完整代码实现放在我的github上:click me 一.任务要求 实现一个基于简单英语语法的chart句法分 ...

  2. 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

    中点画圆算法        如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...

  3. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  4. 分布式数据库中的Paxos 算法

    分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...

  5. Chart.js中文文档-雷达图

    雷达图或蛛网图(Radar chart) 简介 A radar chart is a way of showing multiple data points and the variation bet ...

  6. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  7. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  8. STL中的查找算法

    STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1 ...

  9. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

随机推荐

  1. 最简单打开三星s8+usb调试模式的步骤

    就在我们使用安卓手机通过数据线链接到PC的时候,如果手机没有开启usb开发者调试模式,PC则没能够成功读到我们的手机,部分app也没能够正常使用,遇到这个情况我们需要找解决方法将手机的usb开发者调试 ...

  2. kibana Dev tool 查询结果与预期不符

      问题描述 项目使用Elasticsearch作为搜索引擎,Kibana用来进行可视化操作,Kibana中有Dev tool可供用户使用REST ful API 访问Elasticsearch,在一 ...

  3. java 中的interface是否继承object

    首先我们从C++说起, c++可以多继承.也就是一个类型 --- class,可以继承自2个以上的父类型.多继承导致一个问题,很多人知道.例如,如果类型B,类型C均继承自类型A.然后类型D继承自类型B ...

  4. .yaml参数文件的编写和使用

    一.在ROS底下使用.yaml文件配置参数 在ROS底下用起来还是非常方便的,首先,写一个读参数的函数getParam(),由于参数类型不止一种,所以要使用模板. 具体语句如下: template&l ...

  5. 2018-2019-2 网络对抗技术 20164313 杜桂鑫 Exp1 PC平台逆向破解

    实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 实践的目标就是运行程序中另一代码片段ge ...

  6. 【C语言基础】什么是数据类型?

    基本数据类型 整数 整型 — — int     ---- 4 字节 短整型 — — short  int     ---- 2 字节 长整型 — — long  int     ---- 8 字节 ...

  7. [UNITY 5.4 UGUI] 模态对话框

    1.建立两个画布 a.背景界面 b.置顶界面(添加一个 panel 控件) 2.修改置顶界面中 panel ,添加属性 [Canvas Group] 3.根据界面设计情况修改透明度,色彩,图片

  8. mysql安装密码策略插件

    https://blog.csdn.net/kk185800961/article/details/79447754 注意linux安装密码策略的插件 validate_password.so

  9. jeecg-boot 简易部署方案

    jeecg-boot采用前后端分离的方案,前后端代码不在一起.想要部署 一般是通过反向代理实现. jeecg-boot目前支持更好更简单的解决方案: jeecg 在配置文件里面指定了 webapp的存 ...

  10. [SF] Symfony 在 console 中结合 Workerman

    在web框架的console中,命令不再是直接指定入口文件,如以往 php test.php start,而是类似 php app/console do 的形式. workerman 对命令的解析是 ...