Die Antwort ist ja. Mit einem Earley-Parser würde ich das jedoch nicht tun, da es einfachere mit denselben Funktionen gibt.
Grundsätzlich gehört der Earley-Parser zu einer Familie allgemeiner kontextfreier Parser, die alle möglichen Parses für eine bestimmte Zeichenfolge erzeugen, wenn die Grammatik nicht eindeutig ist.
Es gibt (zumindest) zwei Möglichkeiten, diese Parser zu verstehen:
als dynamische Programmierinterpretation eines Pushdown-Automaten entsprechend der Grammatik auf der Eingabezeichenfolge;
als die Konstruktion des Schnittpunkts der Grammatik mit einem endlichen Automaten.
Beim Parsen einer einzelnen Zeichenfolge ist der zu berücksichtigende endliche Zustandsautomat ein linearer Automat, der nur die
zu analysierende Zeichenfolge symbolweise erkennt (Anzahl der Zustände ist ). Wenn Sie die produktübergreifende Konstruktion eines FA und eines CF-Garmmar anwenden
(Bar Hillel, Perlis, Shamir 1961), erhalten Sie eine neue CF-Grammatik, die eine neue Grammatik , die . Der interessante Punkt, der normalerweise übersehen wird, ist, dass die von verwendeten bis zur Umbenennung ohne Terminals (aufgrund des Kreuzprodukts) beibehält.w|w|+1AGFL(A)∩L(G)FG
Wenn also FA nur Ihre Eingabezeichenfolge
generiert, generiert die Grammatik nur diese Zeichenfolge (wenn sie sich in , andernfalls wird die leere Sprache generiert ). Außerdem generiert es es mit allen Analysebäumen, mit denen es generieren könnte.AFL(G)∅G
Diese Grammatik wird normalerweise als Shared Parse Forest bezeichnet , und alle allgemeinen CF-Parsing-Algorithmen sind eine mehr oder weniger optimierte Version der produktübergreifenden Konstruktion, unabhängig davon, ob es sich um CYK, Earley, generalisierte LR oder LL oder andere handelt. Alles, was ich sage, gilt also auch für sie.F
Wie Sie sehen, verallgemeinert sich dies jedoch auf das Parsen eines ganzen regulären Satzes, wenn jemand daran interessiert ist.
Das ist genau deine Frage. Sie haben eine Zeichenfolge . Sie möchten es bis zu einigen Variationen analysieren, die von einem Wandler mit endlichem Zustand definiert werden. In Ihrem Fall handelt es sich um einen Wandler, der alle Zeichenfolgen innerhalb eines bestimmten Levenshtein-Editierabstands von (der Ursprung des Wandlers ist jedoch unerheblich). Die Menge dieser Zeichenfolgen ist eine reguläre Menge, die von einem FA definiert werden kann, mit einem gewichteten Übergang, der den Bearbeitungsabstand jeder Zeichenfolge berechnen kann.ww
Wenn Sie das Kreuzprodukt mit Ihrer Grammatik ausführen, erhalten Sie eine gemeinsame Analysewald-Grammatik , die alle Zeichenfolgen in der Schnittmenge generiert. Darüber hinaus erhalten Sie die Gewichte für einige der Regeln, sodass Sie den Bearbeitungsabstand für jede der akzeptierten Zeichenfolgen berechnen können.GF
Falls gewünscht, kann dies verwendet werden, um nur die Saiten mit minimalem Abstand zu halten.
Dies kann jedoch ein wenig verbessert werden, da die Zusammensetzung mit endlichen Zustandsmaschinen assoziativ ist.
Wenn Sie immer denselben Finite-State-Wandler verwenden, wie dies in Ihrer Frage der Fall ist, besteht der richtige Weg darin, die Grammatik
und den Wandler (hier den Levenshtein-Automaten) unabhängig von der Eingabezeichenfolge zu komponieren . Dies gibt Ihnen eine gewichtete Grammatik, mit der Sie die Eingabezeichenfolge analysieren können . Das Problem ist, dass das Parsen mit der brutalen Kreuzungskonstruktion Zeichenfolgen in jeder Levenshtein-Entfernung ergibt, dh .GwΣ∗
Es wäre leicht, diese Konstruktion zu beschneiden, um das gleiche Ergebnis wie zuvor zu erzielen, aber der beste Weg ist eine kontrollierte Kreuzungskonstruktion, wie die dynamische Programmierorganisation, die von den meisten Parsern in der Literatur verwendet wird, einschließlich Earleys, und sie zu verwenden, um das Generieren zu vermeiden nutzlose Regel durch Berechnen von Entfernungen und Abbrechen eines Rechenpfads, wenn dieser den gewünschten Schwellenwert überschreitet. Dynamische Programmierung kann auch verwendet werden, um die Analyse-Gesamtstruktur (oder den Analyse-Baum) für die Zeichenfolge, die den kürzesten Abstand zur Eingabe hat, direkt zu berechnen.