2012-04-03 18 views
1

Ich entwerfe ein Werkzeug (in LEX & YACC), um zu überprüfen, ob der eingegebene Satz vom Benutzer grammatikalisch richtig ist oder nicht. Wie überprüft man einen Satz, ob er voll oder nicht bedeutet? Mein Werkzeug erkennt das Muster des Satzes. ZB: Für das Muster s + v + o "Ich lese das Buch" ist der richtige Satz! Aber "Ich trinke das Buch" stimmt mit dem Muster überein, das nicht voll bedeutet! Wie gibt man die Regeln für die semantische Überprüfung eines Satzes in YACC?Wie überprüft man einen Satz bedeutet, voll oder nicht mit LEX & YACC

Antwort

4

Sie versuchen, natürliche Sprache mit formalen Parsing-Mechanismen zu analysieren.

Das funktioniert so ziemlich nicht, da natürliche Sprachen nicht den netten, sauberen Grammatikregeln folgen. Sie müssen über natural language parsing methods.

lernen

Sobald Sie vorbei rohes Parsing, dann benötigen Sie eine riesige Datenbank des Wissens über die Welt, Dinge, Eigenschaften der Dinge und wie die Dinge interagieren. Das, wo Wissen, dass "Bücher nicht trinkbar sind", kommt aus und wird verwendet, um Ihre Parser zu filtern. Natürlich können Sie Ihrer YACC-Grammatik ein wenig dieses Wissens hinzufügen, und dann wird es mit Ihrem Beispiel umgehen, aber Sie brauchen eine Menge, um mit dem umzugehen, was die Leute wirklich sagen oder vernünftigerweise nicht sagen dürfen.

"Farblose grüne Ideen schlief wild". "Mary hatte ein kleines Lamm, ein wenig Käse und ein wenig Getränk".

+0

Vielen Dank für Ihre Vorschläge! Es hat mir geholfen, die Dinge klar zu verstehen! –

1

Sie können Yacc nicht einmal für den ersten Teil Ihres Problems verwenden: Überprüfen Sie, ob ein Satz grammatikalisch ist. Natürliche Sprachen haben keine eindeutigen kontextfreien Grammatiken. Du machst also ein Spielzeugprogramm, das eine begrenzte Anzahl von Sätzen erkennt. Lass uns darüber nachdenken und darüber nachdenken, wie man das Spielzeug manipulieren kann.

Erstellen Sie einfach eine Datenbank über Verben, die angibt, welche Arten von "Argumenten" sie nehmen, wie Funktionen in einer Programmiersprache: Die Datenbank zeigt an, welche Objekte dieses Verb ausführen, zu welchen Arten von Objekten, mit welchen Instrumenten Situation usw.

Eg "Der Hund hat einen Stuhl mit einem Blatt geschrieben". Wir suchen in unserer kleinen Spielzeugdatenbank nach "schreiben" und sehen, dass "Hund" nicht auf der Liste der möglichen Fächer steht, obwohl (obwohl das Verb transitiv ist) "Stuhl" kein mögliches direktes Objekt ist, und dieses "Blatt" ist kein mögliches Instrument.

So kann unser Programm den Satz ablehnen und einen oder mehrere dieser Gründe angeben.

Das ist nicht viel anders als die Ablehnung, sagen wir, A + B wenn A eine ganze Zahl ist und B ein String ist, oder wenn func(A, B, C)func nur zwei Argumente hat.

Sie tun dies besser in einer Sprache, die symbolische Darstellungen leicht behandelt. Die Aufgabe profitiert davon, dass Mustervergleiche in Baumstrukturen durchgeführt werden können.

Lex und Yacc bringen eigentlich keinen so hohen Wert für diese Art von Aufgabe. Zumindest nicht die regulären Lex und Yacc, die mit C-Code produzieren und interagieren.

+0

Ambiguität ist ein Problem für YACC, aber nicht für Earley- oder GLR-Parser. –

+1

Ich fürchte, diese Aussage verrät ein mögliches Missverständnis. GLR ist keine Möglichkeit, mit mehrdeutigen Grammatiken umzugehen, sondern mit unzweideutigen Grammatiken umzugehen, für die LALR (1) (Yaccs Algorithmus) nicht stark genug ist. GLR kann keine Sprache wie Englisch behandeln, die keine kontextfreie LR-Grammatik hat. LALR (1) wird durch nur ein Token von Lookahead und einige Einschränkungen zum Komprimieren der Parsingtabelle unscharf gemacht, was es unmöglich macht, eine Arbeitstabelle für einige Grammatiken zu konstruieren. Natürliche Sprachen können nicht geparst werden, selbst wenn Sie beliebige Lookahead- und unkomprimierte LR-Tabellen haben; Es hilft nicht. – Kaz

+0

Ich denke GLR hält das besser, als Sie vielleicht erwarten. (Es kam tatsächlich von der NLP-Gemeinschaft). Parser für echte Computersprachen sehen sich kontextsensitiven Sprachen gegenüber; Wir entscheiden uns dafür, dies zu tun, indem wir eine kontextfreie Grammatik schreiben und den kontextsensitiven Teil außerhalb der rohen Parsing-Maschinerie erzwingen. Ich verstehe nicht, warum Englisch anders ist ... du kannst (WLOG) * eine * kontextfreie Grammatik (worst case: "Englisch = Wort *;") schreiben, die es sammelt. Die Frage ist, wie viel zusätzliche Kontextsensitivität von rohen NLP-Parsern behandelt wird, im Gegensatz zu den "außerhalb des Parsers" -Überprüfungen. –

0

IRa Baxter Mit einer Datenbank von Wissen über die Welt, Dinge, Eigenschaften von Dingen und wie Dinge interagieren können Sie ein wenig von diesem Wissen zu Ihrer YACC-Grammatik hinzufügen, und es wird dann Ihr Beispiel behandeln, aber Sie Ich brauche eine Tonne, um damit umzugehen, was die Leute wirklich sagen oder vernünftigerweise nicht sagen dürfen.

Könnten Sie klarer sein, wie das Wissen zur YACC-Grammatik hinzugefügt werden kann, indem Sie ein Beispiel geben