DFAと実行時に入力された単語のLevenshtein Automataを実行して、あいまいな解析を実行する方法があります(タイプミスがある場合でも文字列を受け入れます)。Earleyパーサーでも同様のことができますか?アルゴリズムを理解するのは難しいと思います。この質問に答えることは言うまでもありません。
DFAと実行時に入力された単語のLevenshtein Automataを実行して、あいまいな解析を実行する方法があります(タイプミスがある場合でも文字列を受け入れます)。Earleyパーサーでも同様のことができますか?アルゴリズムを理解するのは難しいと思います。この質問に答えることは言うまでもありません。
回答:
答えはイエスです。ただし、同じ機能を持つ単純なものがあるため、Earleyパーサーではそれを行いません。
基本的に、Earleyパーサーは、文法が曖昧な場合に、特定の文字列に対して可能なすべての解析を生成する一般的なコンテキストフリーパーサーのファミリーに属します。
これらのパーサーを理解するには、少なくとも2つの方法があります。
入力文字列の文法に対応するプッシュダウンオートマトンの動的プログラミング解釈として;
文法と有限状態オートマトンの交差の構築として。
単一の文字列を解析する場合、考慮される有限状態オートマトンは、 解析される文字列のみを一度に1シンボルずつ認識する線形オートマトンです(状態の数は| w | + 1)。あなたがFAのクロス製品構造に適用した場合AとCF garmmar G(バーヒレル、ペルリス、シャミール1961)は、新しい文法で新しいCF文法取得Fを生成L(A )∩ L(Gを)。通常見過ごされている興味深い点は、FがGによって使用される解析ツリーを保持することです。、非ターミナルの名前変更まで(クロス積による)。
したがってFA場合、あなたの入力文字列を生成し、文法Fは、 (それが中である場合にのみ、その文字列を生成しますL(G )、それ以外の場合は空の言語を生成∅)。さらに、Gがそれを生成するために使用できるすべての解析ツリーを使用して生成します。
この文法は通常「共有解析フォレスト」と呼ばれるものであり、すべての一般的なCF解析アルゴリズムは、CYK、Earley、一般化されたLRまたはLLなどに関係なく、クロス積構成の多かれ少なかれ最適化されたバージョンです。だから私が言っていることはすべて彼らにも当てはまる。
しかし、ご覧のように、これは、誰かが興味を持っている場合は、通常のセット全体を解析することに一般化されます。
必要に応じて、これを使用して最小限の距離で弦のみを維持できます。
ただし、有限状態機械との合成は結合的であるため、これは少し改善できます。
以前と同じ結果を得るためにその構造を枝刈りするのは簡単ですが、最善の方法は、Earleyを含む文献のほとんどのパーサーで使用されている動的プログラミング組織など、より制御された交差構造であり、生成を回避するために使用します距離を計算し、目的のしきい値を超えたときに計算パスを中止することによる無用のルール。動的プログラミングを使用して、入力までの距離が最も短い文字列の解析フォレスト(または解析ツリー)を直接計算することもできます。