„Earley-Algorithmus“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K →‎Verwendung: speziell
typos, meta infos
Zeile 12: Zeile 12:
Dabei geht er nicht wie der CYK-Algorithmus ''rückwärts'' wieder zum Startsymbol der Grammatik, sondern versucht das Wort zeichenweise zu erzeugen.
Dabei geht er nicht wie der CYK-Algorithmus ''rückwärts'' wieder zum Startsymbol der Grammatik, sondern versucht das Wort zeichenweise zu erzeugen.
In jedem Berechnungsschritt versucht er also, ein Zeichen des Wortes weiter zu kommen, bis das ganze Wort erzeugt ist. In einem solchen Fall ist das Wort von der Grammatik erzeugbar. Falls das Wort nicht erzeugbar (also nicht in der Sprache enthalten) ist, bricht der Algorithmus ab, da er an einem Zeichen ankommt, das er nicht vorhersagen kann.
In jedem Berechnungsschritt versucht er also, ein Zeichen des Wortes weiter zu kommen, bis das ganze Wort erzeugt ist. In einem solchen Fall ist das Wort von der Grammatik erzeugbar. Falls das Wort nicht erzeugbar (also nicht in der Sprache enthalten) ist, bricht der Algorithmus ab, da er an einem Zeichen ankommt, das er nicht vorhersagen kann.
Bei der Eingabe eines Wortes <math>x_1 x_2 \dots x_n</math> verwendet der Algorithmus die Zustandsmengen <math>Q_0, \dots, Q_n</math>. Ein Zustand (oder ''Earley-Zustand'', engl. ''Earley item'', auch ''dottet rule'') des Algorithmus ist dabei eine [[Produktionsregel|Produktion]], deren rechte Seite durch einen Teilungspunkt <math>\bullet</math> zerlegt ist. Alle Zeichen vor diesem Punkt gelten als schon überprüft. Eine solcher Zustand <math>(A \rightarrow ... \bullet ..., i)</math> ist in einer Zustandsmenge <math>Q_j</math> enthalten und durch einen zusätzlichen Zähler <math>i</math> gekennzeichnet. Dieser bestimmt, aus welcher Menge der Zustand ursprünglich stammt, damit der Algorithmus später mit Rekonstruktionschritten schnell einen [[Syntaxbaum]] erzeugen kann.
Bei der Eingabe eines Wortes <math>x_1 x_2 \dots x_\mathrm{n}</math> verwendet der Algorithmus die Zustandsmengen <math>Q_0, \dots, Q_n</math>. Ein Zustand (oder ''Earley-Zustand'', engl. {{lang|en|Earley item}}, auch {{lang|en|dottet rule)}} des Algorithmus ist dabei eine [[Produktionsregel|Produktion]], deren rechte Seite durch einen Teilungspunkt <math>\bullet</math> zerlegt ist. Alle Zeichen vor diesem Punkt gelten als schon überprüft. Eine solcher Zustand <math>(A \rightarrow \ldots \bullet \ldots , i)</math> ist in einer Zustandsmenge <math>Q_\mathrm{j}</math> enthalten und durch einen zusätzlichen Zähler <math>i</math> gekennzeichnet. Dieser bestimmt, aus welcher Menge der Zustand ursprünglich stammt, damit der Algorithmus später mit Rekonstruktionschritten schnell einen [[Syntaxbaum]] erzeugen kann.


Am Anfang wird <math>(S'\rightarrow\bullet S,0) \in Q_0</math> gesetzt. Dabei ist <math>S</math> das Startsymbol der Grammatik. Der Algorithmus läuft nun Zeichen für Zeichen und wendet im <math>i</math> ten Schritt immer die drei folgenden Regeln an, solange bis jeweils keine weiteren Zustände mehr angefügt werden können:
Am Anfang wird <math>(S'\rightarrow\bullet S,0) \in Q_0</math> gesetzt. Dabei ist <math>S</math> das Startsymbol der Grammatik. Der Algorithmus läuft nun Zeichen für Zeichen und wendet im <math>i</math> ten Schritt immer die drei folgenden Regeln an, solange bis jeweils keine weiteren Zustände mehr angefügt werden können:


{| class="wikitable" color
{| class="wikitable" color
|style="background-color:#CAE1FF; width:10em"| Voraussage (P)<br />(engl. ''predictor'')
|style="background-color:#CAE1FF; width:10em"| Voraussage (P)<br />(engl. {{lang|en|predictor}})
|style="width:50em"| Falls <math>(A\rightarrow ...\bullet B ..., j)</math> in <math>Q_i</math> enthalten ist, füge für jede Regel <math>B\rightarrow \alpha</math> der Grammatik den Zustand <math>(B\rightarrow \bullet\alpha, i)</math> zu <math>Q_i</math> hinzu.
|style="width:50em"| Falls <math>(A\rightarrow \ldots \bullet B \ldots , j)</math> in <math>Q_i</math> enthalten ist, füge für jede Regel <math>B\rightarrow \alpha</math> der Grammatik den Zustand <math>(B\rightarrow \bullet\alpha, i)</math> zu <math>Q_i</math> hinzu.
|}
|}


{| class="wikitable"
{| class="wikitable"
|style="background-color:#CAE1FF; width:10em" | Überprüfung (S)<br />(engl. ''scanner'')
|style="background-color:#CAE1FF; width:10em" | Überprüfung (S)<br />(engl. ''{{lang|en|scanner}})
|style="width:50em"| Falls <math>(A\rightarrow ...\bullet a ... , j) \in Q_i</math> und <math>a=x_{i+1}</math>, füge <math>(A\rightarrow ... a\bullet ... , j)</math> zu <math>Q_{i+1}</math> hinzu.
|style="width:50em"| Falls <math>(A\rightarrow \ldots \bullet a \ldots , j) \in Q_i</math> und <math>a=x_{i+1}</math>, füge <math>(A\rightarrow \ldots a\bullet \ldots , j)</math> zu <math>Q_{i+1}</math> hinzu.
|}
|}


{| class="wikitable"
{| class="wikitable"
|style="background-color:#CAE1FF; width:10em"| Vervollständigung (C)<br />(engl. ''completer'')
|style="background-color:#CAE1FF; width:10em"| Vervollständigung (C)<br />(engl. {{lang|en|completer}})
|style="width:50em"| Falls ein komplettierter Zustand <math>(A\rightarrow ...\bullet ,j) \in Q_i</math> existiert, füge für alle Zustände <math>(B\rightarrow ...\bullet A ... , k) \in Q_j</math> einen Zustand <math>(B\rightarrow ... A\bullet ... , k)</math> zu <math>Q_i</math> hinzu.
|style="width:50em"| Falls ein komplettierter Zustand <math>(A\rightarrow ...\bullet ,j) \in Q_i</math> existiert, füge für alle Zustände <math>(B\rightarrow \ldots \bullet A \ldots , k) \in Q_j</math> einen Zustand <math>(B\rightarrow \ldots A\bullet \ldots , k)</math> zu <math>Q_i</math> hinzu.
|}
|}


Man nennt die drei Schritte auch ''prädiktive Erweiterung'', ''lexikalische Konsumption'' und ''Konstituentenvervollständigung''. In der Definition bedeuten Kleinbuchstaben ''terminierte Symbole'' (auch ''lexikalische Kategoriensymbole'', engl. ''terminals''), Großbuchstaben ''nichtterminierte Symbole'' (auch ''komplexe syntaktische Kategoriensymbole'', engl. ''non-terminals'') und lateinische Buchstaben die gesamte rechte Seite einer Regel, bestehend aus verschiedenen Symbolen.
Man nennt die drei Schritte auch ''prädiktive Erweiterung'', ''lexikalische Konsumption'' und ''Konstituentenvervollständigung''. In der Definition bedeuten Kleinbuchstaben ''terminierte Symbole'' (auch ''lexikalische Kategoriensymbole'', engl. {{lang|en|terminals}}), Großbuchstaben ''nichtterminierte Symbole'' (auch ''komplexe syntaktische Kategoriensymbole'', engl. {{lang|en|non-terminals}}) und lateinische Buchstaben die gesamte rechte Seite einer Regel, bestehend aus verschiedenen Symbolen.


Genau dann, wenn am Ende <math>(S'\rightarrow S\bullet , 0)</math> in der Zustandsmenge <math>Q_n</math> enthalten ist, kann die Grammatik das Wort erzeugen.
Genau dann, wenn am Ende <math>(S'\rightarrow S\bullet , 0)</math> in der Zustandsmenge <math>Q_\mathrm{n}</math> enthalten ist, kann die Grammatik das Wort erzeugen.


Im Anschluss müssen die einzelnen Zustände durch einen geeigneten rekursiven Suchalgorithmus (engl. ''walker'') wieder miteinander verknüpft werden, um den Syntaxbaum zu erzeugen.
Im Anschluss müssen die einzelnen Zustände durch einen geeigneten rekursiven Suchalgorithmus (engl. {{lang|en|walker}}) wieder miteinander verknüpft werden, um den Syntaxbaum zu erzeugen.


== Beispiele ==
== Beispiele ==
===Beispiel 1: einfacher mathematischer Ausdruck===
===Beispiel 1: einfacher mathematischer Ausdruck===
Die folgende die Grammatik (Anwendungsbeispiel aus <ref>J. Aycock and, N. Horspool, ''Directly-Executable Earley Parsing'', Lecture Notes in Computer Science, Volume '''2027''', s. 229-243 (2001)
Die folgende die Grammatik (Anwendungsbeispiel aus <ref>J. Aycock, N. Horspool: ''Directly-Executable Earley Parsing.'' In: ''Lecture Notes in Computer Science.'' 2027, 2001, S. 229–243, {{DOI|10.1007/3-540-45306-7}} ([http://www.rsdn.ru/File/73/deep-2.pdf PDF]).</ref>)
</ref>)
{|
{|
|width="150"|
|width="150"|
Zeile 71: Zeile 70:
|}
|}
|}
|}
beschreibt einfache mathematische Ausdrücke (mit n als Platzhalter für Zahlen). Als Eingabe soll der Ausdruck n+n erkannt werden. Die nach Ablauf des Earley-Algorithmus im Speicher befindlichen Zustände sind in den Tabellen <math>Q_0</math> bis <math>Q_3</math>
beschreibt einfache mathematische Ausdrücke (mit <math>n</math> als Platzhalter für Zahlen). Als Eingabe soll der Ausdruck n+n erkannt werden. Die nach Ablauf des Earley-Algorithmus im Speicher befindlichen Zustände sind in den Tabellen <math>Q_0</math> bis <math>Q_3</math>


<div style="float:left; margin-right:1em;">
<div style="float:left; margin-right:1em;">
Zeile 281: Zeile 280:


Damit ist das Wort in der Dyck-Sprache enthalten.
Damit ist das Wort in der Dyck-Sprache enthalten.

== Weblinks ==
* [http://www-ls.informatik.uni-tuebingen.de/psh/lehre/skripten/Skriptum-InfoIII.pdf Vorlesungsskript der Universität Tübingen mit Beispielen und Korrektheitsbeweis (pdf)] (845 kB)
* [http://wiki-lingua.uni-trier.de/index.php/Earley-Algorithmus Earley-Algorithmus (WikiLingua, freie Wissensdatenbank für Computerlinguistik)]

== Einzelnachweise ==
<references/>


== Literatur ==
== Literatur ==
Zeile 296: Zeile 288:
| Band=13
| Band=13
| Nummer=2
| Nummer=2
| Seiten=94-102
| Seiten=94–102
| Jahr=1970
| Jahr=1970
| Online=[http://www.cs.cmu.edu/afs/cs.cmu.edu/project/cmt-55/lti/Courses/711/Class-notes/p94-earley.pdf PDF, 902 KB]
| Online=[http://www.cs.cmu.edu/afs/cs.cmu.edu/project/cmt-55/lti/Courses/711/Class-notes/p94-earley.pdf PDF, 902 KB]
}}
}}
* {{Literatur
* {{Literatur
| Autor=J. Aycock, R.N. Horspool
| Autor=J. Aycock, R. N. Horspool
| Titel=Practical Earley Parsing
| Titel=Practical Earley Parsing
| Sammelwerk=The Computer Journal
| Sammelwerk=The Computer Journal
| Band=45
| Band=45
| Nummer=6
| Nummer=6
| Seiten=620-630
| Seiten=620–630
| Jahr=2002
| Jahr=2002
| Online=[http://www.cs.uvic.ca/~nigelh/Publications/PracticalEarleyParsing.pdf PDF, 162 KB]
| Online=[http://www.cs.uvic.ca/~nigelh/Publications/PracticalEarleyParsing.pdf PDF, 162 kB]
}}
}}
* {{Literatur | Autor=Grune, Dick; Jacobs, Ceriel J. H. | Titel=Parsing Techniques: A Practical Guide | Jahr=1990 | Verlag=Ellis Horwood | Ort=New York | Auflage=1. | ISBN=0-13-651431-6 | Seiten=149-163 | Online=[ftp://ftp.cs.vu.nl/pub/dick/PTAPG_1st_Edition/BookBody.pdf PDF, 1.9 MB]}}
* {{Literatur | Autor=Grune, Dick; Jacobs, Ceriel J. H. | Titel=Parsing Techniques: A Practical Guide | Jahr=1990 | Verlag=Ellis Horwood | Ort=New York | Auflage=1. | ISBN=0-13-651431-6 | Seiten=149–163 | Online=[ftp://ftp.cs.vu.nl/pub/dick/PTAPG_1st_Edition/BookBody.pdf PDF, 1,9 MB]}}

== Weblinks ==
* [http://www-ls.informatik.uni-tuebingen.de/psh/lehre/skripten/Skriptum-InfoIII.pdf Vorlesungsskript der Universität Tübingen mit Beispielen und Korrektheitsbeweis (pdf)] (845 kB)
* [http://wiki-lingua.uni-trier.de/index.php/Earley-Algorithmus Earley-Algorithmus (WikiLingua, freie Wissensdatenbank für Computerlinguistik)]

== Einzelnachweise ==
<references/>


[[Kategorie:Formale Sprachen]]
[[Kategorie:Formale Sprachen]]

Version vom 19. Januar 2010, 15:21 Uhr

Der Earley-Algorithmus oder Earley-Parser ist in der Informatik ein Algorithmus, der entscheidet, ob ein Wort von einer kontextfreien Grammatik erzeugt werden kann. Er wurde 1970 von Jay Earley entwickelt. Er ähnelt dem Cocke-Younger-Kasami-Algorithmus und löst wie dieser das Wortproblem der kontextfreien Sprachen. Er verwendet die Methode der dynamischen Programmierung.

Verwendung

Eine Aufgabe eines Compilers oder Parsers ist es, zu überprüfen, ob der eingegebene Quelltext den Regeln der entsprechenden Grammatik folgt, also der Syntax der Programmiersprache entspricht. Dies entspricht dem Lösen des Wortproblems. Da die meisten Programmiersprachen kontextsensitiv sind, werden dabei bestimmte Bedingungen zunächst ignoriert. Dadurch kann man erreichen, dass nur das wesentlich einfachere (nicht NP-vollständige) Wortproblem der kontextfreien Sprachen gelöst werden muss. Die kontextsensitiven Nebenbedingungen, wie etwa die Vollständigkeit der Variablendeklarationen müssen dann mit einem anderen Algorithmus geprüft werden. So wird der erste Schritt der Syntaxprüfung auf das Wortproblem der kontextfreien Sprachen zurück geführt. Diese wird vom Earley-Algorithmus und auch vom CYK-Algorithmus mit -Zeitaufwand erreicht, bei eindeutigen Grammatiken mit und in manchen speziellen Grammatiken mit . Beide sind optimal, um das Problem für eine allgemeine kontextfreie Sprache zu lösen. Der Earley Algorithmus hat jedoch den Vorteil, dass keine Umwandlung der Grammatik in Chomsky-Normalform nötig ist. Nachteil ist die Einschränkung auf Epsilon-freie Grammatiken. Epsilon-Regeln können jedoch immer durch Umformung der Grammatik eliminiert werden.

In der Praxis versucht man meist, den relativ hohen Rechenaufwand der beiden Algorithmen zu vermeiden oder zu reduzieren. Man optimiert dabei den Compiler oder Parser speziell an die verwendete Programmiersprache und kann so oft einen geringeren Berechnungsaufwand erreichen. Besonders große Verbesserungen können dabei erreicht werden, wenn man die Syntax der Programmiersprache so weit einschränkt, dass sie LR1- oder sogar LL1-Eigenschaften hat. Dies wird bei der Entwicklung neuerer Programmiersprachen berücksichtigt. Für solche Programmiersprachen exisiteren Algorithmen, die in der Praxis schneller sind und weniger Speicher benötigen als der Earley-Parser. Für generelle kontextfreie Grammatiken ist der Earley-Parser und verwandte Algorithmen dagegen anderen überlegen.

Algorithmus

Der Algorithmus benötigt als Eingabe eine kontextfreie Grammatik und ein Wort über demselben Alphabet. Er entscheidet dann, ob die Grammatik das Wort erzeugen kann. Dabei geht er nicht wie der CYK-Algorithmus rückwärts wieder zum Startsymbol der Grammatik, sondern versucht das Wort zeichenweise zu erzeugen. In jedem Berechnungsschritt versucht er also, ein Zeichen des Wortes weiter zu kommen, bis das ganze Wort erzeugt ist. In einem solchen Fall ist das Wort von der Grammatik erzeugbar. Falls das Wort nicht erzeugbar (also nicht in der Sprache enthalten) ist, bricht der Algorithmus ab, da er an einem Zeichen ankommt, das er nicht vorhersagen kann. Bei der Eingabe eines Wortes verwendet der Algorithmus die Zustandsmengen . Ein Zustand (oder Earley-Zustand, engl. Earley item, auch dottet rule) des Algorithmus ist dabei eine Produktion, deren rechte Seite durch einen Teilungspunkt zerlegt ist. Alle Zeichen vor diesem Punkt gelten als schon überprüft. Eine solcher Zustand ist in einer Zustandsmenge enthalten und durch einen zusätzlichen Zähler gekennzeichnet. Dieser bestimmt, aus welcher Menge der Zustand ursprünglich stammt, damit der Algorithmus später mit Rekonstruktionschritten schnell einen Syntaxbaum erzeugen kann.

Am Anfang wird gesetzt. Dabei ist das Startsymbol der Grammatik. Der Algorithmus läuft nun Zeichen für Zeichen und wendet im ten Schritt immer die drei folgenden Regeln an, solange bis jeweils keine weiteren Zustände mehr angefügt werden können:

Voraussage (P)
(engl. predictor)
Falls in enthalten ist, füge für jede Regel der Grammatik den Zustand zu hinzu.
Überprüfung (S)
(engl. scanner)
Falls und , füge zu hinzu.
Vervollständigung (C)
(engl. completer)
Falls ein komplettierter Zustand existiert, füge für alle Zustände einen Zustand zu hinzu.

Man nennt die drei Schritte auch prädiktive Erweiterung, lexikalische Konsumption und Konstituentenvervollständigung. In der Definition bedeuten Kleinbuchstaben terminierte Symbole (auch lexikalische Kategoriensymbole, engl. terminals), Großbuchstaben nichtterminierte Symbole (auch komplexe syntaktische Kategoriensymbole, engl. non-terminals) und lateinische Buchstaben die gesamte rechte Seite einer Regel, bestehend aus verschiedenen Symbolen.

Genau dann, wenn am Ende in der Zustandsmenge enthalten ist, kann die Grammatik das Wort erzeugen.

Im Anschluss müssen die einzelnen Zustände durch einen geeigneten rekursiven Suchalgorithmus (engl. walker) wieder miteinander verknüpft werden, um den Syntaxbaum zu erzeugen.

Beispiele

Beispiel 1: einfacher mathematischer Ausdruck

Die folgende die Grammatik (Anwendungsbeispiel aus [1])

beschreibt einfache mathematische Ausdrücke (mit als Platzhalter für Zahlen). Als Eingabe soll der Ausdruck n+n erkannt werden. Die nach Ablauf des Earley-Algorithmus im Speicher befindlichen Zustände sind in den Tabellen bis

 
n
+
n

gezeigt. Sie wurden durch mehrfache Anwendung der drei Schritte Voraussage, Überprüfung und Vervollständigung erzeugt. Rot markiert sind die komplettierten Zustände, deren Punkt das Ende der Regel erreicht hat. Bis zu dieser Stelle entspricht also der Ausdruck einer gegebenen Regel. Jedoch nur wenn, wie in diesem Beispiel, in der letzten Zustandsmenge der komplettierte Zustand der Startregel enthalten ist, wurde der Ausdruck erfolgreich erkannt und wird folglich durch die Grammatik beschrieben. Durch eine rekursive Suche kann nun, ausgehend von diesem letzten Zustand, der Pfad zurück zum Anfang zurückverfolgt und ein Syntaxbaum erzeugt werden.

Beispiel 2: Dyck-Sprache

Die Dyck-Sprache der korrekt geklammerten Ausdrücke mit nur einer Art Klammern wird von dieser kontextfreien Grammatik erzeugt:


Bei Eingabe des Wortes ()(()) läuft der Algorithmus folgendermaßen ab:

  • In :
    • Die Voraussagen für :
    • (P)
    • (P)
    • (P)
    • (P)
  • In :
    • Zuerst alle Überprüfungen
    • (S)
    • (S)
    • (S)
    • (S)
    • Jetzt ist es möglich vorauszusagen. Dieses A kann dann ab dem zweiten Zeichen eingesetzt werden. Es kommt also sozusagen aus , daher wird der Zähler auf 1 gesetzt.
    • (P)
    • (P)
    • (P)
    • Wegen der Epsilonproduktion ist das Nichtterminal hier fertig produziert. Es ist also schon ein Vervollständigungsschritt möglich:
    • (C)
    • (C)

Weitere Schritte sind nicht möglich,

  • Also geht es weiter in :
    • wieder zuerst die Vorhersagen, das aktuelle Zeichen ist ')':
    • (S)
    • (S)
    • (S)
    • (S)
    • alle anderen Regeln lassen sich hier nicht anwenden.
  • In :
    • Nur bei einem Zustand lässt sich das richtige Zeichen einlesen:
    • (S)
    • Jetzt können neue Vorhersagen für gemacht werden:
    • (P)
    • (P)
    • (P)
    • (C)
  • In :
    • (S)
    • (S)
    • wird wieder vorhergesagt:
    • (P)
    • (P)
    • (P)
    • (C)
    • (C)
  • In :
    • (S)
    • (S)
    • Da das obere fertig eingelesen ist, dann jetzt aus vervollständigt werden
    • (C)
  • In :
    • (S)
    • Das Startsymbol wurde also komplett gelesen. kann also vervollständigt werden.
    • (C)

Damit ist das Wort in der Dyck-Sprache enthalten.

Literatur

  • Jay Earley: An efficient context-free parsing algorithm. In: Communications of the Association for Computing Machinery. Band 13, Nr. 2, 1970, S. 94–102 (PDF, 902 KB).
  • J. Aycock, R. N. Horspool: Practical Earley Parsing. In: The Computer Journal. Band 45, Nr. 6, 2002, S. 620–630 (PDF, 162 kB).
  • Grune, Dick; Jacobs, Ceriel J. H.: Parsing Techniques: A Practical Guide. 1. Auflage. Ellis Horwood, New York 1990, ISBN 0-13-651431-6, S. 149–163 (PDF, 1,9 MB).

Einzelnachweise

  1. J. Aycock, N. Horspool: Directly-Executable Earley Parsing. In: Lecture Notes in Computer Science. 2027, 2001, S. 229–243, doi:10.1007/3-540-45306-7 (PDF).

Vorlage:Link FA