Parsing 如何将Earley识别器转换为Earley解析器

Parsing 如何将Earley识别器转换为Earley解析器,parsing,nlp,Parsing,Nlp,我已经实现了一个Earley识别器算法。我不知道如何从图表中获取解析树。我有反向指针指向“生成”添加到图表中的规则,但我从字面上理解了这一点,对于当前规则R1: 1) 如果点后有一个端子,对照输入句子检查端子,将规则R2添加到下一列,其中R2与R1相同,但点已移动。R2的后指针=R1的后指针 2) 如果点后有一个非终端,则向当前列添加新规则,每个新规则的后指针指向R1 3) 如果点后没有任何内容(已完成规则),则R1已完成,因此我们扫描与R1关联的列(小于curr列),找到点后左侧为R1的所有规

我已经实现了一个Earley识别器算法。我不知道如何从图表中获取解析树。我有反向指针指向“生成”添加到图表中的规则,但我从字面上理解了这一点,对于当前规则
R1

1) 如果点后有一个端子,对照输入句子检查端子,将规则
R2
添加到下一列,其中
R2
R1
相同,但点已移动。
R2的后指针
=
R1的后指针

2) 如果点后有一个非终端,则向当前列添加新规则,每个新规则的后指针指向
R1

3) 如果点后没有任何内容(已完成规则),则
R1
已完成,因此我们扫描与
R1
关联的列(小于curr列),找到点后左侧为
R1
的所有规则
Rj
,将
Rj
添加到当前列,但移动点,使
Rj
的反向指针指向
R1

我认为我没有得到正确的输出,所以我想知道这是否是我的逻辑问题。需要对Earley识别器做什么才能将其转换为Earley解析器

我有一个
print\u parse
方法,它在规则的后指针上递归,但我认为它不会产生正确的输出。为了这个句子

爸爸吃了鱼子酱

使用(忽略概率)语法

它产生:

(ROOT ['S'])(S ['NP', 'VP'])(NP ['Papa'])(S ['NP', 'VP'])(VP ['V', 'NP'])(V ['ate'])(VP ['V', 'NP'])(NP ['Det', 'N'])(Det ['the'])(NP ['Det', 'N'])(N ['caviar'])(ROOT ['S'])
我知道解析图是正确的,但是我已经检查了它与手动(手动)解析表的对比。
我知道有人问过关于这个问题的其他问题,但它们都指向文件,坦率地说,它们很难回答。我真的很感谢你的帮助

Elizabeth Scott发表了一篇关于如何在最坏情况下O(n^3)时间内形成解析林的论文。以下是纸质链接:。集成算法见第63页,我在下面简要介绍

我认为她在后指针建议的实现中发现了一个bug,不确定您是否遇到了相同的问题。从第55页开始,第2节和第3节对其进行了概述。基本上,向一个项目添加多个反向指针时可能会失败

我之所以说解析林,是因为earley解析器可以很好地处理歧义,而解析林通过“或”节点表示这种歧义。“或”节点表示解析林中的备用路径

我在这里的earley解析库中用c#实现了它:

基本上可以创建四种类型的节点:
  • 中间节点-仅用作传递节点,以保持树的二进制性。没有它们,树就不会是二进制的,并且会有比O(n^3)更糟糕的时间复杂度
  • 符号节点-是语法中表示非终端的解析林的实际节点
  • 终端节点-是运行解析时在输入字符串中找到的数据
  • 或节点-表示语法中的歧义选择 算法的大致描述: 您需要跟踪在当前earley过程中添加的节点。如果遇到对同一节点的需要,可以从节点集中重用该节点。每次通过后,您都可以清除此集合。最好将其包装在一个“createnode”函数中,并在名为AddOrGetExistingNode的节点集上放置一个方法。Scott在她的论文中有一个“MAKE_NODE”函数

    在扫描过程中,非常简单,只需创建/重用令牌节点并将其附加到扫描早期项目

    在预测过程中,只有当前非终结符在语法中可为空时,才能创建解析节点。这是Aycock和Horspool在他们的论文“实用的Earley解析”中发现的错误修复。在这个位置上,你做的是一个完成和一个预测。我在这里回答了一个问题:并展示了一些例子

    在完成过程中,为新状态创建解析节点,并添加附加到已完成项节点和预测项节点的节点


    当您创建一个节点时,如果虚线规则的位置在生产的中间,则创建一个中间节点。如果位于规则末尾,则创建符号节点

    在组装每个假设时,向前构建解析树可能更容易。为终端或语法规则使用节点。在每个假设中维护一个节点列表,在使用令牌时扩展,在使用规则时减少。完成后,在完成的假设中应该有一个节点。
    (ROOT ['S'])(S ['NP', 'VP'])(NP ['Papa'])(S ['NP', 'VP'])(VP ['V', 'NP'])(V ['ate'])(VP ['V', 'NP'])(NP ['Det', 'N'])(Det ['the'])(NP ['Det', 'N'])(N ['caviar'])(ROOT ['S'])