Earleyパーサーから解析フォレストを回復しますか?


25

私は最近Earleyパーサーを読んでいて、これまで見た中で最もエレガントなアルゴリズムの1つだと思います。ただし、従来の意味でのアルゴリズムは認識機能であり、パーサーではありませんつまり、文字列が特定のCFGに一致するかどうかを検出できますが、解析ツリーは作成できません。私の質問は、解析ツリーではなく、指定された入力文字列のすべての可能な解析の解析フォレストを回復する方法です。

GruneとJacobの「Parsing Techniques:A Practical Guide」では、Earleyレコグナイザーの結果から解析フォレストを回復するために使用できるアルゴリズムを示していますが、実行時間はO(n k + 1)、ここでkは文法の最長の生成の長さです。これは、ランタイムが文法のサイズの多項式ではないことを意味します。さらに、解析フォレストを回復するためのアルゴリズムを示唆するアルゴリズムに関するEarleyの元の論文は間違っています(例えば、富田によるこの記事の 762ページを参照)が、多くのソースはまだ解析フォレストを回復する適切な方法としてそれを引用していますが。

私の質問は、与えられた入力文字列の解析フォレストを多項式時間で回復できるかどうかです。私はここで、PDAのシミュレーションを使用して任意の解析用のキュービックサイズの解析フォレスト表現を生成するアルゴリズムを提供する論文を見つけました。理想的には、入力文法をCNFに変換せずにこれを実行したいです(実際に問題を解決します)。結果の解析フォレストはかなり乱雑になるからです。

あなたが提供できる助けをありがとう!


Earley解析に基づくアルゴリズムである必要がありますか、それとも別の一般的なCFGパーサーを使用してもかまいませんか?
アレックス10ブリンク

1
Earleyパーサーに基づくアルゴリズムを好むでしょう。私はコンパイラーコースを教えてきましたが、この質問への回答を追跡するために数日を費やしましたが、本当に私を悩ませています。
templatetypedef

単語は指数関数的に多くの解析ツリーを持つことができるため、指数ランタイムは驚くことではありません。実際、任意のCFGを許可すると、それらは無限に多くなる可能性さえあります。
ラファエル

3
@Raphael解析フォレストの役割は、有限の構造を持ち、スペースの複雑さを抑えながら、すべてのツリーを無限に表現できる共有メカニズムを持つことです。もちろん、これは木こりのためのいくつかの仕事を残すかもしれません。
babou

あなたはMarpaを見たいかもしれません。Earleyパーサーを実装し、完全な解析フォレストをサポートするPerlモジュールとCライブラリです。
ヒッピートレール14

回答:


14

もちろん、それを行うには、特定の文のすべての解析ツリーを表す「パックされたフォレスト」の正しい表現に依存します。

あなたが探し始めたい場所は、ジョシュア・グッドマンの論文(Inside out、Harvard、1999)です。基本的には、特定のセミリングの下で​​解析アルゴリズムを定義できるという考え方です。セミリングに応じて、裸の解析ツリーではなく、すべての種類の量と構造を(認識エンジンまたはパーサーとして)計算できます。定義できるセミリングの1つ(Goodmanが論文で行っている)は、値が解析のセットであるセミリングです。最終的に文の解析が完了すると、すべての解析ツリーがメイン解析ノードに取得されます。

繰り返しますが、正しい表現を通してそれを可能にすることに注意する必要があります。


参照いただきありがとうございます!これは素晴らしいリソースのように見えるので、少し時間をかけて見ていきます。
templatetypedef

8

その方法を説明した論文があります:

Elisabeth Scottによる Earley RecognisersからのSPPFスタイルの解析

3進法で2値化された解析フォレストを構築する方法について説明します。


2
そのリンクは現在壊れているようです。参考文献(論文のタイトル、出版された場所、著者のリスト)および/または更新されたリンクはありますか?
DW

1
web.archive.org/web/20130508170633/http://thor.info.uaic.ro/…を参照してください。「Earley RecognisersからのSPPFスタイル解析」、エリザベススコット。別のリンク:dinhe.net/~aredridel/.notmine/PDFs/...
a3nm

これは、「Earley認識機能から解析フォレストを取得する方法」という質問に対する正しい答えです。
tjvr

JSにはこれの素晴らしい実装があります:joshuagrams.github.io/pep
tjvr

この文脈で二値化とはどういう意味ですか?
ブルースアダムス

6

CNFは必要ありません。文法構造を変更するという欠点があります。ただし、RHSの長さが複雑さを決定するため、右側が2(2形式)より長くならないように、中間の非端末を導入する必要があります。直感的に説明するための最良の試みは、メモリが役立つ場合、1976年に計算言語学会議で発表されたBeau Shielの論文「Context Free Parsingの観察」です。Earleyのアルゴリズムは暗黙的に2形式を使用します。アルゴリズムに隠されているだけです。解析フォレストの回復と処理については、「交差点フォレストの解析」のWebをご覧ください。実際には非常に簡単です。引用または目次からタイトルまたは著者を取得して直接検索する場合、多くの論文がウェブ上にあります。

実際、CFよりもはるかに多くのことができますが、それでも多項式時間で解析フォレストを取得できます。質問は、時々、それを手に入れたらどうすることができますか?

最後の記事の目的の1つは、複雑なアルゴリズム(GLRなど)が必ずしも時間や空間で何かを購入するわけではなく、解析フォレストを変更する可能性があることを示すことです。

教育についての1つの発言。Earleyは、それ自体が独創的であり、教えるには非常に複雑であり、本質的に同じ教育コンテンツを備えたより単純なアルゴリズムに置き換えることができると思います。教えることは概念や技術についてです。Earleyのアルゴリズムでは、本質的な概念は詳細の複雑さに隠されており、テクノロジーの観点からは時代遅れです。これは素晴らしい論文でしたが、それが最高の教育的アプローチであることを意味するものではありません。

計算言語学の文献には、通常のコンピューターサイエンスチャネルよりも多くの情報が含まれている場合があります。Ceriel-Grune-Jacobsの本はありませんが、適切な参考文献がすべて揃っていないと驚くでしょう(選択基準についてはわかりませんが)。


コメントのリクエストに応じて補完する(2013年7月7日)

これは、Earleyのアルゴリズムよりも単純なアルゴリズムの存在を補足するものです。

先ほど述べたように、「交差点フォレストの解析」でウェブを検索すると、すぐに参照が得られ、そこからさらに掘り下げることができます。

基本的な考え方は、共有フォレストの構築と構文解析するすべてのパスは、有限オートマトンとコンテキストフリー文法を使用した、通常の言語とコンテキストフリー言語のBar Hillel、Perles、Shamirの古い交差点の構築に他ならないということです。CF文法が与えられると、入力文字列のみを認識する簡単なオートマトンに構造を適用します。以上です。共有フォレストは、交差点の単なる文法です。それは準同型写像を介して元の文法に関連し、与えられた文字列のみを認識しますが、その準同型までの元の文法のすべての解析木(すなわち、非終端の単純な名前変更)を持ちます。

結果の文法には、多くの役に立たないもの、非終端記号、ルールが含まれています。これらは、公理から到達できない(初期シンボルから派生した文字列にはありません)か、非生産的です(端末に派生できません)文字列)。

次に、最後に良いブラシで掃除する必要があります(長いかもしれませんが、アルゴリズム的には簡単です)、または最後にブラシをかけられる無駄な毛羽が少なくなるように構造を改善しようとすることができます。

たとえば、CYKの構造はまさにそれですが、作成されたすべてのルールと非ターミナルが生産的であるように編成されていますが、多くは到達不能です。これは、ボトムアップ手法から予想されるものです。

トップダウン手法(LR(k)ベースの手法など)は、到達不能なルールと非ターミナルを回避しますが、非生産的なルールを作成します。

ブラッシングの多くは、実際にはポインターを適切に使用することで達成できると思いますが、私は長い間これを見ていません。

実際、既存のアルゴリズムはすべて、本質的にそのモデルに従います。それが問題の核心であり、非常に簡単です。それではなぜそれを複雑さの中に埋めるのでしょうか?

多くの場合、これらの構造の静的ファクタリングを使用して、LR(k)、LL(k)パーサー構造に基づくリテラチャーで多くの「最適化」が提案されます(Earleyには静的ファクタリングはありません)。実際には、古い優先順位パーサーを含むすべての既知の手法に適用できます。最適化するもの、実際に最適化するのか、あるいは改善の恩恵がパーサーの複雑さを増すだけの価値があるのか​​がわからないため、引用符の間に「最適化」を入れます。これについては、形式的または実験的な客観的データはほとんどありません(いくつかあります)が、さらに多くの主張があります。興味のあることは何も言っていません。いくつかのスマートなアイデアがあります。

さて、基本的な考え方がわかれば、「最適化」または改善は、興味のあるパーサー構築手法に従って、文法からプッシュダウンオートマトンを構築することにより、静的に(場合によっては段階的に)導入できます。そのオートマトン(グラマーに対して行うのとほぼ同じこと)またはそのオートマトンから派生したグラマーへの交差のクロス積構築。

次に、ベルとホイッスルを紹介できますが、それは主に技術的な詳細です。

Isaac NewtonのPhilosophiæNaturalis Principia Mathematicaは、物理学と数学のすばらしい作品であると伝えられています。多くの学生の読書リストに載っているとは思いません。他のすべての条件が同じであれば、アーリーのアルゴリズムを教えることは非常に有用ではないと思いますが、重要な歴史的作品です。学生はそのまま学ぶのに十分です。多くの人に撃ち落とされる危険があるので、Knuth LR(k)の論文についてもほぼ同じだと思います。これは素晴らしい理論的分析であり、おそらく理論家にとって重要な読み物です。ハードウェアとソフトウェアの両方の技術の現状を考えると、パーサーを構築するのにこれが非常に重要であることを強く疑います。解析がコンパイル時間の重要な部分であった時代は過ぎ去り、または、コンパイラの速度が重要な問題であったとき(私は、約30年前にコストをコンパイルして亡くなったある会社を知っていました)。解析の専門家はある時点でその専門知識を学びたいかもしれませんが、コンピューターサイエンス、プログラミング、またはエンジニアリングの平均的な学生はそれを必要としません。

学生が構文解析により多くの時間を費やさなければならない場合、計算言語学で使用される拡張機能など、より有用で形成的な拡張機能があります。教育の最初の役割は、科学知識を構築する単純なアイデアを抽出することであり、研究科学者が受けなければならなかったものを学生に強制することではありません(博士課程の学生を除く:通過儀礼です:-)。

著者からのライセンスCC BY-SA 3.0


2
「Earley ...は教えるにはあまりにも複雑で、より単純なアルゴリズムに置き換えることができます...」。そのような単純なアルゴリズムの例を提供していただけますか?
wjl

@wjl上記の回答の補遺に返信します。特定のアルゴリズムを指すわけではありませんが、私が推奨するように検索を行うと、リテラチャーにいくつかのアルゴリズムが見つかる場合があります。単純でありながら効率的なアルゴリズムを作成するのが非常に簡単な理由を説明しようとしました。Earley'sはおそらく最も複雑です。バー・ヒレルらの説明。建設は、教科書の約半分のページ、例えば、証拠のあるページです。
babou

@wjlリクエストに答えるのに時間がかかりました。それはあなたを助けましたか?。。。。。実際のアルゴリズムが必要な場合は、最初の質問の最後のリンクにアルゴリズムがあります。
babou

はい、ありがとうございます; 私は余分な詳細に感謝します。私はいくつかの仕事のために汎用パーサーライブラリに取り組んでおり、さまざまなアルゴリズムについて多くの研究を行っています。私にとって、それは非常に理解しやすいアルゴリズムであるように思われ、連接文法と「ブラックボックス」(場合によってはコンテキスト依存)端末に拡張するのが簡単だからです。あなたが指摘した論文のいくつかをざっと読んで印刷した。しかし、私はまだ本格的にそれらを読んでいません。
wjl

@wjlそれがあなたがしていることなら、次のトピックを見る必要があります:軽度の文脈依存言語、線形文脈自由書き換えシステム(LCFRS)、および範囲連結文法。「ブラックボックス」端末とは何かを理解していない。--メール:babox in inbox.com。- -
babou

5

二値化された解析フォレストをキュービック時間で構築する方法を説明する論文(アンジェロボルソッティによる投稿で言及)は、エリザベススコットによる「SPPFスタイルのEarley Recognizersからの解析」です。ここで見つけることができます:http : //dx.doi.org/10.1016/j.entcs.2008.03.044

このホワイトペーパーでは、可能なすべての解析ツリーを表す共有パック解析フォレスト(SPPF)の構築について説明します。サブツリーは可能な限り共有され、同じ非ターミナルからの同じサブストリングの異なる派生に対応するノードが結合されます。


ポインターをありがとう。3進法の時間で2値化された解析フォレストを構築するのが標準です。二値化は3次時間を取得する唯一の方法であるため、OPの文法サイズに関する複雑性に関するコメントは無関係です。別の問題は、解析フォレストがどのように二値化されるかを理解することです。これはアルゴリズムに依存する場合があります。その他の問題は、共有フォレストでの共有の量、および解析戦略の実際的な効率です(Earleyは悪い考えかもしれません)。これらはすべて、OPの最後のリファレンスで開発されています。私の答えには、問題の一般的な公式見解が描かれています。
babou 14

1

この論文を読むことを提案することで、上記の答えをエコーし​​たいと思います。

http://dx.doi.org/10.1016/j.entcs.2008.03.044

ただし、このホワイトペーパーでアルゴリズムを実装し、エラーがあると考えていると言って資格を得たいと思います。特に、セクション4の2番目の段落の最初の文。Earleyが「スキャン」フェーズと呼ぶものに対して作成する先行ラベルは、pからqを指し、逆ではありません。

特に、次の行:

E0をアイテム(S :: =・α、0)に設定します。i> 0の場合、各q =(A :: =α・aiβ、j)∈Ei-1に対してアイテムp =(A :: =αai・β、j)を追加してEiを初期化し、α=の場合、 qからpまでのi − 1とラベル付けされた先行ポインタ

「qからp」ではなく「pからq」と読む必要があります

最初に述べたとおりにアルゴリズムを実装しましたが、いくつかの手作りのテストケースでエラーが発生しましたが、ここでポインターの方向を変更すると修正されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.