Parsing 如何将Earley识别器转换为Earley解析器
我已经实现了一个Earley识别器算法。我不知道如何从图表中获取解析树。我有反向指针指向“生成”添加到图表中的规则,但我从字面上理解了这一点,对于当前规则Parsing 如何将Earley识别器转换为Earley解析器,parsing,nlp,Parsing,Nlp,我已经实现了一个Earley识别器算法。我不知道如何从图表中获取解析树。我有反向指针指向“生成”添加到图表中的规则,但我从字面上理解了这一点,对于当前规则R1: 1) 如果点后有一个端子,对照输入句子检查端子,将规则R2添加到下一列,其中R2与R1相同,但点已移动。R2的后指针=R1的后指针 2) 如果点后有一个非终端,则向当前列添加新规则,每个新规则的后指针指向R1 3) 如果点后没有任何内容(已完成规则),则R1已完成,因此我们扫描与R1关联的列(小于curr列),找到点后左侧为R1的所有规
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#实现了它: 基本上可以创建四种类型的节点:
当您创建一个节点时,如果虚线规则的位置在生产的中间,则创建一个中间节点。如果位于规则末尾,则创建符号节点
在组装每个假设时,向前构建解析树可能更容易。为终端或语法规则使用节点。在每个假设中维护一个节点列表,在使用令牌时扩展,在使用规则时减少。完成后,在完成的假设中应该有一个节点。(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'])