Earleyベクトルを認識エンジンとして使用するのは非常に簡単です。文字列の最後に達したとき、位置0で開始された公理生成が完了したかどうかを確認するだけです。少なくとも1つある場合、文字列は受け入れられます。
Earleyベクトルを使用して解析ツリーを再構築することは、それほど明白ではありません。実際、私はアルゴリズムの手順がどのように機能するかを理解することはできません。さらに、私が見つけた唯一の参照はあいまいまたは超技術的なものでした。誰かがそれに光を当てることができますか?
Earleyベクトルを認識エンジンとして使用するのは非常に簡単です。文字列の最後に達したとき、位置0で開始された公理生成が完了したかどうかを確認するだけです。少なくとも1つある場合、文字列は受け入れられます。
Earleyベクトルを使用して解析ツリーを再構築することは、それほど明白ではありません。実際、私はアルゴリズムの手順がどのように機能するかを理解することはできません。さらに、私が見つけた唯一の参照はあいまいまたは超技術的なものでした。誰かがそれに光を当てることができますか?
回答:
Earleyの論文の用語と表記を使用しています。読んだ説明が異なる可能性があります。
右側の最も長いルールのサイズです。これが、他のアルゴリズムがバイナリ形式の文法を使用する理由です(必ずしもチョムスキー正規形(CNF)ではありません)。
実際、Earleyはバイナリ形式を暗黙的に使用します。これは、3次時間の複雑性のために必要なためです。これは、州におけるルールドットの主要な役割の1つです。しかし、この暗黙のバイナリ形式は、元の構文ではなく、2値化された文法に従って構文解析とフォレストを生成します。これは、不明瞭さの主な原因であると私は思います。これについては、以下で詳しく説明します。
フォレストがどのように取得されるかを理解する1つの良い方法は、より単純なケースであるCYKアルゴリズムでフォレストを調べることです。認識エンジンとも呼ばれ、最後にパーサーアスペクトが追加されます。ウィキペディアで説明を見ることができます。フォレストを構築するために必要な情報は、「バックポインタ」のテーブルに格納されるものです。 バックポインタは基本的に、ある規則に従って文字列の構成要素を形成する部分文字列(関連付けられたシンボル)へのポインタです。これらは、部分文字列を解析するすべての可能な方法を提供します。CYKはバイナリ形式(通常はCNF)を使用するため、物事がより簡単になることを思い出してください。CYKパーサーは、基本的にEarleyと同じ動的プログラミング構造を持っていますが、はるかに単純です。ですから、それをよく理解することは大きな助けになるでしょう。
Earleyのアルゴリズムに戻ると、受け入れを決定するため、または解析ツリーとフォレストを構築するためにEarleyベクトルが必要だとは思いません。アーリーが彼の論文でベクトルと呼ぶものは、実装の3番目の段落の97ページにのみ現れます。複雑さを増すために、特定の文字列位置kを指す状態の検索を高速化するためのデバイスにすぎません。ただし、すべての情報は状態セットに含まれ、状態のリストとして実装されます。ただし、アルゴリズムは状態を取得する方法を追跡しないため、この情報は解析ツリーのフォレストを構築するには不十分です。実際、ベクターは、どのようにして見つかったかに関係なく、すでに見つかった状態を効率的に破棄するためにも使用されます。
Earleyの記事のセクション7では、「レコグナイザをパーサーにするには」、つまりパースツリーを回復できるようにするためには、完了が行われた方法を追跡する必要があると説明しています。
ペーパーに示されているように必要なポインターをすべて保持していると仮定すると、パーサーによって認識された最後のシンボル(もちろん文法の最初のシンボル)から始まるすべての共有ツリー表現を取得できます。
したがって、構文ツリーのフォレストは非常に奇妙なものになる可能性があり、あるノードの最初の2つのエッジを共有し、3番目のエッジは共有しないシャムツインサブツリーのようなものがあります。言い換えれば、それは非常に厄介な構造かもしれません。これにより、Earleyが「可能なすべての解析ツリーの因数分解表現」と呼んでいる理由を、具体的ではなく説明できます。
文法を変更せずにシャム双生児を外科的に分離しようとすると、複雑さが増します。それを行う正しい方法は、文法を二値化することです。
これがお役に立てば幸いです。お知らせ下さい。しかし、私はCYK解析の十分な理解が役立つことを主張します。Earleyよりも単純な、他のアルゴリズムがあり、すべてのCF言語を効率的に解析できます。
この解析フォレストの問題に関するより一般的な情報は、他の2つの回答、https://cstheory.stackexchange.com/questions/7374#18006およびhttps://linguistics.stackexchange.com/questions/4619#6120にあります。ただし、Earleyのアルゴリズムの具体的な詳細については触れません。