如何从Earley向量重建语法树森林?


9

使用Earley向量作为识别器非常简单:到达字符串的末尾时,您只需检查从位置0开始的已完成的公理化生产。如果您至少有一个,则接受该字符串。

使用Earley向量重建解析树不太明显。实际上,我无法弄清楚算法程序的工作方式,而且我发现的唯一参考文献要么含糊不清,要么含糊不清。有人可以阐明吗?


2
如果您列出了找到的参考文献,认为模糊的参考文献和过于技术性的参考文献,将会很有帮助。否则,答案很可能是指向您已经找到的参考的指针。
Wandering Logic

1
您所谓的向量可能不是Earley在他的原始论文中所说的向量。或者它可能不扮演完全相同的角色。作者确实介绍了算法的变体。由于您没有给您一直在使用的文档提供任何参考,因此无法知道...而且我们可能也无法访问它们。可能会有所帮助的是更明确地定义。回答时,我只是假设您使用了与Earley相同的定义。
2014年

@babou,我所谓的“ Earley向量”是解析器构建的数据结构的表格表示形式。这是我的形式语言教授在提及该词时使用的术语。应当指出,我的主要语言不是英语,因此这可能是翻译术语的错误尝试。我提到的技术参考是Earley的论文本身。我接近了它,但是对于像我这样的真正初学者来说有点吓人。
Stefano Sanfilippo

您可能需要检查教授是否使用了“ Earley向量”来表示与Earley论文中所称的“向量”相同的结构。可能对交流很有用。对于其余的部分,如您所见,您必须保留额外的信息才能恢复解析树,但是Earley并没有真正涉及细节。现在还有其他算法,恐怕Earley算法的复杂性在某种程度上掩盖了这类技术的关键思想。祝好运。
2014年

我的解释是否有帮助,或者您需要对技术部分进行更详细的描述?
babou 2014年

Answers:


9

我使用的是Earley论文中的术语和符号。您阅读的说明可能会有所不同。

通常,通常以识别器的形式介绍常规CF解析算法,然后再添加一些实际构建解析树和解析森林所需的信息管理。一个原因可能是,保留构造共享林所需的信息需要立方空间 ,其中n是要解析的输入字符串的长度,但是当识别时,空间需求仅为平方O n 2)即可识别。此信息未保留。空间复杂度增加的原因非常简单:解析森林的大小可以是立方的。Øñ3ñØñ2

众所周知,最坏情况下的时间复杂度是Øñ3

当然,Earley算法的最佳参考是Earley的论文,但是对于构建解析森林并不是很明确。实际上这可能是一件麻烦的事,远不止第101页第7节的快速讨论。确实,Earley并不是在谈论解析森林或森林,而是谈论“ 所有可能解析树的分解表示 ”。这是有充分的理由的:如果他尝试根据自己的语法来制作一片森林,那么他的空间(因此,时间)的复杂性范围将攀升至,其中sØñs+1个s是右侧最长规则的大小。这就是为什么其他算法使用二进制形式的语法(不一定是Chomsky普通形式(CNF))的原因。

实际上,Earley隐式使用二进制形式,因为这对于立方时间复杂性是必需的。这是状态中规则点的主要角色之一。但是这种隐式二进制形式是根据二进制语法而不是原始语法生成语法和森林的,我担心这是晦涩的主要来源。这将在下面进一步详细说明。

理解森林是如何获得的一种好方法可能是在更简单的情况下使用CYK算法。通常也将其描述为识别器,并在最后添加解析器方面。您可以查看维基百科中的描述。建立林所需的信息是它们存储在“ backpointers”表中的信息。 反向指针本质上是指向子字符串(相关符号)的指针,这些子字符串根据某些规则构成字符串的组成部分。它们提供了解析子字符串的所有可能方式。回想一下CYK使用二进制形式,通常是CNF,这样事情就更简单了。CYK解析器在本质上与Earley具有相同的动态编程结构,但是要简单得多。因此,很好地理解它可以提供很大的帮助。

回到Earley的算法,我认为您不需要Earley向量来确定可接受性或构建解析树和森林。Earley在他的论文中所谓的向量仅出现在实施的第三段的第97页中。它只是一种加速指向某个给定字符串位置k的状态搜索的设备,以便获得更好的复杂性。但是所有信息都在状态集中,以状态列表的形式实现。但是,此信息不足以构建解析树林,因为该算法无法跟踪获取状态的方式。实际上,向量甚至被用来有效地丢弃已经找到的状态,而与如何发现无关。

在Earley的文章的第7节中,他解释说,为了“使识别器成为解析器”,即能够恢复解析树,必须跟踪完成的方式。

我们每次执行完成者操作添加状态 (忽略先行)我们构建从实例的指针 d在该状态到状态 d →交通γ ËαdβGd导致我们进行了操作。这表明 D被解析为 γ。如果d是暧昧会有一组从它的指针,一个用于每个完成者操作造成的 ë →交通α d βdγFdγ被添加到特定状态集。γ中的每个符号 也将有指向它的指针(除非它是末尾的),依此类推,从而表示 D的派生树。ËαdβGγd

请注意,在本文中,g是已解析字符串中的索引,指向规则左侧开始识别的位置(因为已经预测了右侧符号。因此f是字符串左侧识别的位置)D γ开始,并在索引g处结束。这些“完成指针”与CYK解析器版本描述的反向指针(在Wikipedia中不太好)等效。FGFdγG

从这样的指针(如在帖中描述),我们知道 在规则实例ê →交通α d βd本身可以被开发成一棵树(或森林),该树解析输入字符串 w从索引 f + 1到索引 g,我们注意到 w f + 1 g。紧靠 D的节点由规则 D γ给出。通过寻找导致 D γ的完成ËαdβGwF+1个GwF+1个Gddγ然后我们可以找到其他这样的指针,这些指针指示如何获得 D的最后一个符号,从而获得有关可能的解析树的更多信息。同样,通过查看在耳环状态设置中识别出前一个符号之后的完成,您可以找到如何获得符号,依此类推。dγFd

假设您按照本文中的指示保留了所有必需的指针,则可以从解析器识别的最后一个符号开始获取所有共享树表示形式,后者当然是语法的初始符号。

但是我也跳过了混乱的部分。假设您有一个规则,我选择的规则 右手边长于2个符号,而另一个规则W U V则表示语法不明确。üXÿžw ^üV

很可能发生的是,解析器将解析X瓦特+ 1 ħÿ并且两个瓦特ħ + 1 瓦特ħ + 1 Ĵž。因此,随治ü X Ÿ ž,这两个W¯¯ ˚F + 1 w ^ ˚F + 1 ĴwF+1个GXwG+1个HÿwH+1个一世wH+1个ĴžüXÿžwF+1个一世wF+1个Ĵ解析成ü

然后,它也可以是,这两个瓦特Ĵ + 1 ķ两个解析成V。然后,该规则W¯¯ ù V,字符串 瓦特˚F + 1 ķ解析成W¯¯以两种不同的方式,其对应于所述语法的模糊性。w一世+1个ķwĴ+1个ķVw ^üVwF+1个ķw ^

当然,为了避免重复计算,Earley的算法将尝试尽可能多地共享两个解析计算。它实际上占有率什么明显的识别(和解析)w ^ g ^ + 1 ^ hXY ^。但是它实际上会做得更多:它还将使用规则U X Y Z共享识别U的两个不同解析的开始。我的意思是,国家ü X ÿ žwF+1个GwG+1个HXÿüüXÿž在状态集 S h中仅被发现一次(关于我所描述的)。这将是两个解析的共同部分。当然,由于 Z对应于离散子字符串,因此在解析 Z时事物会暂时发散,直到当状态 W U V一切都解析为W时它们再次收敛üXÿžF小号Hž在状态集 S k中产生两次。w ^üVF小号ķ

因此语法树森林可能是一个非常奇怪的森林,其中有一种暹罗双子树可以共享某个节点的前两个边缘,但不共享第三个边缘。换句话说,它可能是一个非常尴尬的结构。这可能可以解释为什么Earley 无需更具体地将其称为“ 所有可能的解析树的分解表示 ”。

任何通过手术将暹罗双胞胎分开而不改变语法的方法都会导致复杂性的增加。正确的方法是对语法进行二值化处理。

我希望这能帮到您。让我知道。但是我坚持认为,对CYK解析有一个很好的了解会有所帮助。还有其他比Earley算法更简单的算法,可以有效地解析所有CF语言。

您可能会在我给出的另外两个答案中找到有关此解析林问题的更多常规信息:https : //cstheory.stackexchange.com/questions/7374#18006https://linguistics.stackexchange.com/questions/4619#6120。但是,它们没有涉及Earley算法的具体细节。


除了CYK解析外,还值得研究GLR解析。
化名

1
@Pseudonym知道并理解各种形式的常规CF解析当然不会有任何伤害,我建议在答案末尾使用这两个参考。但是,我选择CYK并非偶然。它与Earley的算法共享直接使用语法的解释性,而不是使用通过将语法编译成下推式自动机生成的表(如GLR,GLL,GPrec)。因此,识别过程与树木/森林生成之间的关系更加清晰可见。CKY也是最简单的算法,只有一个例外。
babou 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.