使用Earley向量作为识别器非常简单:到达字符串的末尾时,您只需检查从位置0开始的已完成的公理化生产。如果您至少有一个,则接受该字符串。
使用Earley向量重建解析树不太明显。实际上,我无法弄清楚算法程序的工作方式,而且我发现的唯一参考文献要么含糊不清,要么含糊不清。有人可以阐明吗?
使用Earley向量作为识别器非常简单:到达字符串的末尾时,您只需检查从位置0开始的已完成的公理化生产。如果您至少有一个,则接受该字符串。
使用Earley向量重建解析树不太明显。实际上,我无法弄清楚算法程序的工作方式,而且我发现的唯一参考文献要么含糊不清,要么含糊不清。有人可以阐明吗?
Answers:
我使用的是Earley论文中的术语和符号。您阅读的说明可能会有所不同。
通常,通常以识别器的形式介绍常规CF解析算法,然后再添加一些实际构建解析树和解析森林所需的信息管理。一个原因可能是,保留构造共享林所需的信息需要立方空间 ,其中n是要解析的输入字符串的长度,但是当识别时,空间需求仅为平方O (n 2)即可识别。此信息未保留。空间复杂度增加的原因非常简单:解析森林的大小可以是立方的。
众所周知,最坏情况下的时间复杂度是。
当然,Earley算法的最佳参考是Earley的论文,但是对于构建解析森林并不是很明确。实际上这可能是一件麻烦的事,远不止第101页第7节的快速讨论。确实,Earley并不是在谈论解析森林或森林,而是谈论“ 所有可能解析树的分解表示 ”。这是有充分的理由的:如果他尝试根据自己的语法来制作一片森林,那么他的空间(因此,时间)的复杂性范围将攀升至,其中s是右侧最长规则的大小。这就是为什么其他算法使用二进制形式的语法(不一定是Chomsky普通形式(CNF))的原因。
实际上,Earley隐式使用二进制形式,因为这对于立方时间复杂性是必需的。这是状态中规则点的主要角色之一。但是这种隐式二进制形式是根据二进制语法而不是原始语法生成语法和森林的,我担心这是晦涩的主要来源。这将在下面进一步详细说明。
理解森林是如何获得的一种好方法可能是在更简单的情况下使用CYK算法。通常也将其描述为识别器,并在最后添加解析器方面。您可以查看维基百科中的描述。建立林所需的信息是它们存储在“ backpointers”表中的信息。 反向指针本质上是指向子字符串(相关符号)的指针,这些子字符串根据某些规则构成字符串的组成部分。它们提供了解析子字符串的所有可能方式。回想一下CYK使用二进制形式,通常是CNF,这样事情就更简单了。CYK解析器在本质上与Earley具有相同的动态编程结构,但是要简单得多。因此,很好地理解它可以提供很大的帮助。
回到Earley的算法,我认为您不需要Earley向量来确定可接受性或构建解析树和森林。Earley在他的论文中所谓的向量仅出现在实施的第三段的第97页中。它只是一种加速指向某个给定字符串位置k的状态搜索的设备,以便获得更好的复杂性。但是所有信息都在状态集中,以状态列表的形式实现。但是,此信息不足以构建解析树林,因为该算法无法跟踪获取状态的方式。实际上,向量甚至被用来有效地丢弃已经找到的状态,而与如何发现无关。
在Earley的文章的第7节中,他解释说,为了“使识别器成为解析器”,即能够恢复解析树,必须跟踪完成的方式。
我们每次执行完成者操作添加状态 (忽略先行)我们构建从实例的指针 d在该状态到状态 d →交通γ 。导致我们进行了操作。这表明 D被解析为 γ。如果d是暧昧会有一组从它的指针,一个用于每个完成者操作造成的 ë →交通α d 。β被添加到特定状态集。γ中的每个符号 也将有指向它的指针(除非它是末尾的),依此类推,从而表示 D的派生树。
请注意,在本文中,和g是已解析字符串中的索引,指向规则左侧开始识别的位置(因为已经预测了右侧符号。因此f是字符串左侧识别的位置)D → γ开始,并在索引g处结束。这些“完成指针”与CYK解析器版本描述的反向指针(在Wikipedia中不太好)等效。
从这样的指针(如在帖中描述),我们知道 在规则实例ê →交通α d 。β本身可以被开发成一棵树(或森林),该树解析输入字符串 w从索引 f + 1到索引 g,我们注意到 w f + 1 :g。紧靠 D的节点由规则 D → γ给出。通过寻找导致 D → γ的完成。然后我们可以找到其他这样的指针,这些指针指示如何获得 D的最后一个符号,从而获得有关可能的解析树的更多信息。同样,通过查看在耳环状态设置中识别出前一个符号之后的完成,您可以找到如何获得符号,依此类推。
假设您按照本文中的指示保留了所有必需的指针,则可以从解析器识别的最后一个符号开始获取所有共享树表示形式,后者当然是语法的初始符号。
但是我也跳过了混乱的部分。假设您有一个规则,我选择的规则 右手边长于2个符号,而另一个规则W → U V则表示语法不明确。
很可能发生的是,解析器将解析到X, 瓦特克+ 1 :ħ成ÿ并且两个瓦特ħ + 1 :我和瓦特ħ + 1 :Ĵ成 ž。因此,随治ü → X Ÿ ž,这两个W¯¯ ˚F + 1 :我和 w ^ ˚F + 1 :Ĵ解析成。
然后,它也可以是,这两个和瓦特Ĵ + 1 :ķ两个解析成V。然后,该规则W¯¯ → ù V,字符串 瓦特˚F + 1 :ķ解析成W¯¯以两种不同的方式,其对应于所述语法的模糊性。
当然,为了避免重复计算,Earley的算法将尝试尽可能多地共享两个解析计算。它实际上占有率什么明显的识别(和解析)和w ^ g ^ + 1 :^ h成X和Y ^。但是它实际上会做得更多:它还将使用规则U → X Y Z共享识别U的两个不同解析的开始。我的意思是,国家ü → X ÿ 。ž在状态集 S h中仅被发现一次(关于我所描述的)。这将是两个解析的共同部分。当然,由于 Z对应于离散子字符串,因此在解析 Z时事物会暂时发散,直到当状态 W → U V一切都解析为W时它们再次收敛。在状态集 S k中产生两次。
因此语法树森林可能是一个非常奇怪的森林,其中有一种暹罗双子树可以共享某个节点的前两个边缘,但不共享第三个边缘。换句话说,它可能是一个非常尴尬的结构。这可能可以解释为什么Earley 无需更具体地将其称为“ 所有可能的解析树的分解表示 ”。
任何通过手术将暹罗双胞胎分开而不改变语法的方法都会导致复杂性的增加。正确的方法是对语法进行二值化处理。
我希望这能帮到您。让我知道。但是我坚持认为,对CYK解析有一个很好的了解会有所帮助。还有其他比Earley算法更简单的算法,可以有效地解析所有CF语言。
您可能会在我给出的另外两个答案中找到有关此解析林问题的更多常规信息:https : //cstheory.stackexchange.com/questions/7374#18006和https://linguistics.stackexchange.com/questions/4619#6120。但是,它们没有涉及Earley算法的具体细节。