Sie brauchen nie CNF. Es hat den Nachteil, die Grammatikstruktur zu ändern. Sie müssen jedoch Zwischenterminals einführen, damit keine rechte Seite länger als 2 (2-Form) ist, da die RHS-Länge die Komplexität bestimmt. Der beste Versuch, dies intuitiv zu erklären, ist ein Artikel von Beau Shiel, "Observations on Context Free Parsing" (Beobachtungen zum kontextfreien Parsen), der 1976 in einer Konferenz zur Computerlingistik veröffentlicht wurde. Earleys Algorithmus verwendet implizit die 2-Form. Es ist nur im Algorithmus versteckt. In Bezug auf die Wiederherstellung und Behandlung von Parsing-Gesamtstrukturen sollten Sie im Web nach "Parsing-Gesamtstrukturen" suchen. Es ist eigentlich sehr einfach. Viele Artikel befinden sich im Web, wenn Sie (aus Zitaten oder Inhaltsverzeichnissen) die Titel oder Autoren erhalten, um sie direkt zu durchsuchen.
Tatsächlich können Sie viel mehr als nur CF-Operationen ausführen und trotzdem in polynomieller Zeit Analysewälder abrufen. Die Frage ist manchmal: Was können Sie damit machen, wenn Sie es haben?
Der letzte Artikel, den Sie erwähnen, soll zeigen, dass komplexe Algorithmen (z. B. GLR) weder zeitlich noch räumlich etwas kosten und möglicherweise Ihren Analysewald ändern.
Eine Bemerkung zum Unterrichten. Ich denke, Earley, so zukunftsweisend es war, ist viel zu kompliziert für den Unterricht und könnte durch einfachere Algorithmen mit im Wesentlichen demselben Bildungsinhalt ersetzt werden. In der Lehre geht es um Konzepte oder Technologie. In Earleys Algorithmus sind die wesentlichen Konzepte in der Komplexität der Details verborgen und aus technologischer Sicht veraltet. Es war eine großartige Arbeit, aber es bedeutet nicht, dass es der beste pädagogische Ansatz ist.
Die Literatur zur Computerlinguistik enthält möglicherweise mehr Informationen als die üblichen Kanäle der Informatik. Ich habe das Ceriel-Grune-Jacobs-Buch nicht, aber ich wäre überrascht, wenn sie nicht alle richtigen Referenzen hätten (obwohl ich nicht sicher bin, welche Auswahlkriterien sie haben).
Ergänzung zu einer Anfrage in einem Kommentar (7. Juli 2013)
Diese Ergänzung steht für die Existenz einfacherer Algorithmen als Earleys.
Wie ich bereits sagte, sollte das Durchsuchen des Webs unter "Parsing Intersection Forest" schnell Hinweise geben, anhand derer Sie weiter graben können.
Die Grundidee ist, dass alle Pfade, die mit der Konstruktion eines gemeinsamen Waldes analysiert werden, nichts anderes als die alte Kreuzungskonstruktion von Bar Hillel, Perles und Shamir für eine reguläre Sprache und eine kontextfreie Sprache unter Verwendung eines endlichen Automaten und einer kontextfreien Grammatik sind. In Anbetracht der CF-Grammatik wenden Sie die Konstruktion auf einen einfachen Automaten an, der nur Ihre Eingabezeichenfolge erkennt. Das ist alles. Der gemeinsame Wald ist nur die Grammatik für die Kreuzung. Es bezieht sich auf die ursprüngliche Grammatik durch einen Homomorphismus, erkennt nur die angegebene Zeichenfolge, aber mit allen Analysebäumen der ursprünglichen Grammatik bis zu diesem Homomorphismus (dh einfaches Umbenennen von Nicht-Terminals).
Die resultierende Grammatik enthält eine Menge nutzloser Dinge, Nicht-Terminals und Regeln, die entweder vom Axiom nicht erreichbar sind (nicht in einer Zeichenfolge zu finden, die vom Anfangssymbol abgeleitet ist) oder die nicht produktiv sind (nicht in ein Terminal abgeleitet werden können) Zeichenfolge).
Dann müssen Sie es entweder am Ende mit einem guten Pinsel reinigen (möglicherweise lang, aber algorithmisch einfach), oder Sie können versuchen, die Konstruktion so zu verbessern, dass am Ende weniger unnütze Flusen gebürstet werden.
Beispielsweise ist die CYK-Konstruktion genau so aufgebaut, jedoch so organisiert, dass alle erstellten Regeln und Nicht-Terminals produktiv sind, obwohl viele davon nicht erreichbar sein können. Dies ist bei einer Bottom-up-Technik zu erwarten.
Top-down-Techniken (wie LR (k) -basierte) vermeiden nicht erreichbare Regeln und Nicht-Terminals, erzeugen jedoch unproduktive Regeln.
Ein Großteil des Putzens kann tatsächlich durch eine angemessene Verwendung von Zeigern erreicht werden, denke ich, aber ich habe mich lange nicht damit befasst.
Alle existierenden Algorithmen folgen im Wesentlichen diesem Modell. Das ist also wirklich der Kern der Sache, und es ist sehr einfach. Warum sollte man es dann in Komplexität begraben?
In der Literatur werden viele "Optimierungen" vorgeschlagen, die häufig auf der LR (k), LL (k) -Familie der Parserkonstruktionen basieren, möglicherweise mit statischem Faktorisieren dieser Konstruktionen (Earley hat kein statisches Faktorisieren). Es könnte tatsächlich auf alle bekannten Techniken angewendet werden, einschließlich der alten Präzedenz-Parser. Ich setze "Optimierung" zwischen Anführungszeichen, weil es normalerweise nicht klar ist, was Sie optimieren oder sogar, ob Sie es tatsächlich optimieren oder ob der Nutzen der Verbesserung die zusätzliche Komplexität Ihres Parsers wert ist. Sie werden wenig objektive, formale oder experimentelle Daten darüber finden (es gibt einige), aber viel mehr Behauptungen. Ich sage nicht, dass es nichts Interessantes gibt. Es gibt einige kluge Ideen.
Sobald Sie die Grundidee kennen, können die "Optimierungen" oder Verbesserungen häufig statisch (möglicherweise inkrementell) eingeführt werden, indem ein Push-Down-Automat aus der Grammatik erstellt wird, der der Art der Parser-Konstruktionstechnik folgt, an der Sie interessiert sind, und dann angewendet wird die produktübergreifende Konstruktion für die Schnittmenge zu diesem Automaten (fast dasselbe wie für die Grammatik) oder zu einer von diesem Automaten abgeleiteten Grammatik.
Dann kann man Schnickschnack einführen, aber das sind meistens technologische Details.
Die Philosophiæ Naturalis Principia Mathematica von Isaac Newton ist angeblich ein großartiges Stück Physik und Mathematik. Ich glaube nicht, dass es auf der Leseliste vieler Studenten steht. Wenn alle anderen Dinge gleich sind, halte ich es nicht für sehr nützlich, Earleys Algorithmus zu lehren, obwohl es sich um ein wichtiges historisches Stück handelt. Die Schüler haben genug zu lernen, wie es ist. Ich bin der Meinung, dass das Knuth LR (k) -Papier ähnlich ist, da das Risiko besteht, von vielen Menschen abgeschossen zu werden. Es ist eine hervorragende theoretische Analyse und wahrscheinlich eine wichtige Lektüre für einen Theoretiker. Ich bezweifle stark, dass es für die Erstellung von Parsern nach dem aktuellen Stand der Technik, sowohl der Hardware als auch der Software, so wichtig ist. Die Zeiten sind vorbei, in denen das Parsen einen wesentlichen Teil der Kompilierungszeit ausmachte. oder als die Geschwindigkeit der Compiler ein kritisches Thema war (ich kannte ein Unternehmen, das vor 30 Jahren an den Kosten für das Compilieren gestorben ist). Der Parsing-Spezialist möchte dieses Fachwissen vielleicht irgendwann erlernen, aber der durchschnittliche Student in Informatik, Programmierung oder Ingenieurwesen benötigt es nicht.
Wenn die Schüler mehr Zeit mit dem Parsen verbringen müssen, gibt es andere Erweiterungen, die möglicherweise nützlicher und formativer sind, z. B. solche, die in der Computerlinguistik verwendet werden. Die erste Aufgabe des Unterrichts besteht darin, die einfachen Ideen zu extrahieren, die das wissenschaftliche Wissen strukturieren, und die Studenten nicht dazu zu zwingen, das zu leiden, was die Wissenschaftler zu leiden hatten (Doktoranden ausgenommen: es ist ein Übergangsritus :-).
Lizenz CC BY-SA 3.0 vom Autor