Logo der Computerlinguistik


 

Diese Webseite ist veraltet. Neue Adresse: http://www.linguistik.uni-erlangen.de

Eine erste Syntax in JSLIM

Abstract

Dieser Teil der Dokumentation soll in die grundlegende Bedienung der Syntaxkomponente von JSLIM einführen. Für eine funktionierende syntaktische Analyse ist eine lauffähige Morphologie notwendig. Es wird das dort implementierte Projekt “german1” verwendet. Dieses wurde um einige Lexikoneinträge wie Artikel oder Pronomina erweitert, um vollständige Sätze parsen zu können. Weiterhin soll in dieser Dokumentation die Funktionsweise der wichtigsten Operationen erklärt werden, die für das Erstellen von Syntaxregeln notwendig sind.

Nötige Vorarbeiten

Bevor mit der eigentlichen Erstellung der für die Syntax benötigten Dateien begonnen werden kann, ist es nötig, einige Vorarbeiten zu treffen. Im Folgenden wird aufgezeigt, inwiefern die bereits existierende Projektdatei und Attributdatei modifiziert werden müssen, um eine erfolgreiche syntaktisch-semantische Analyse zu gewährleisten.

Änderungen an der Projektdatei

Zu Beginn wird die Projektdatei german1.pro um die Syntaxkomponente erweitert. Dafür wird im Anschluss an die Liste der notwendigen Dateien für die Morphologie mit der Anweisung lahear die Syntaxkomponente eingeleitet. Hier werden die nötigen Dateien aufgelistet, die im Laufe des Projektes verwendet werden. Dabei handelt es sich mindestens um eine Regeldatei und um eine Variablendatei, die idealerweise von der Regel- und Variablendatei der Morphologie getrennt sind. Es empfiehlt sich, die neuen Dateien in einen Ordner namens syn abzuspeichern. Diese Dateien werden im Laufe dieser Dokumentation noch genauer thematisiert. Wie schon in der Morphologiedokumentation näher erläutert wurde, sind die Pfadangaben relativ zum Speicherort der Projektdatei zu setzen. Eine Beispielprojektdatei ist in nachfolgender Abbildung dargestellt. 

 # Projektdatei
# author: cnweber

enc: UTF-8

att: german1.att
ops: german1.ops
tbl: ../allo/allo.tbl
     ../morph/german1-verb-table.tbl
     ../morph/german1-noun-table.tbl
     ../morph/german1-adj-table.tbl
     ../syn/filter.tbl

lamorph 
rul: ../morph/combi.rul
var: ../morph/german1.var
lex: ../allo/allo.all
     ../morph/punct.lex

lahear
rul: ../syn/syntax.rul
var: ../syn/syntax.var

Änderungen an der Attributdatei

Als nächstes muss die Attributdatei german1.att bearbeitet werden, in der die Datentypen der bisher verwendeten Attribute deklariert wurden. Hier werden nun die benötigten Attribute hinzugefügt, die im weiteren Verlauf des Projektes notwendig sind. Eine Beispielattributdatei kann in untenstehender Abbildung betrachtet werden. Die Reihenfolge der Attribute in dieser Datei bestimmt auch die Reihenfolge der Resultatsausgabe von JSLIM.

 string  sur	
        core
        noun
        verb
        adj
list    cat
        sem
table   allo
        flx
        syn
list    mdr
        mdd
        fnc
        arg
        nc
        pc
        prn
        wrd
        idy

Nachfolgend werden die neu hinzugefügten Attribute näher beschrieben, die in der obigen Abbildung zu sehen sind.

  • Die Kern-Attribute noun, verb und adj bestimmen die Wortklasse des Proplets. Sie erhalten ihren jeweiligen Wert aus der Lexikondatei.
  • Die intrapropositionalen Verknüpfungsattribute fnc (functor), arg (argument), mdd (modified) und mdr (modifier) dienen zur Darstellung der Funktor-Argument-Struktur und erstellen symbolische Verweise auf andere Proplets. Ihre jeweiligen Werte erhalten sie während der zeitlinearen Ableitung durch Kopieren des Werts des relevanten Kernattributs eines anderen Proplets. Diese Kopiervorgänge werden in der Regeldatei beschrieben. Es muss beachtet werden, dass die Attribute fnc, arg und mdd nicht leer sein dürfen, wohingegen das Attribut mdr den Wert “NIL” annehmen kann.
  • Die extrapropositionalen Verknüpfungsattribute nc (next conjunct), pc (previous conjunct) und idy (identity) werden sowohl extra- als auch intrapropositional verwendet. Den jeweiligen Wert erhalten diese Attribute ebenfalls über den Kopiervorgang in der Regeldatei. Zu beachten ist an dieser Stelle, dass der extrapropositionale Gebrauch obligatorisch ist und mindestens eines dieser Attribute nicht leer sein darf. Der intrapropositionale Gebrauch ist hingegen optional.
  • Die Attribute prn (proposition number) und wrd (word number) bestehen aus einem ganzzahligen Zahlenwert. Sie dienen zur internen Organisation der Proplets und Wörter und werden in der Regeldatei vergeben.

Die Filterdatei

Wie bereits in obiger Beschreibung angedeutet, werden nicht alle Attribute in jedem Proplet gefordert. Welche Attribute den drei Hauptarten von Proplets hinzugefügt werden, wird in der Filterdatei filter.tbl deklariert.

 table T_1:  [core] => [verb, mdr, arg, nc, pc]
                 \1 => \1, (), (), (), ().

table T_2:  [core] => [noun, mdr, fnc, nc, pc]
                 \1 => \1, (), (), (), ().

table T_3:   [core] => [adj, mdr, mdd, nc, pc]
                 \1 => \1, (), (), (), ().

Wie aus obenstehender Abbildung ersichtlich, wird mit Hilfe von Rückreferenzen der core-Wert der drei Proplets jeweils durch das entsprechende Attribut verb, noun oder adj ersetzt. Die weiteren angegebenen Attribute werden dem jeweiligen Proplet automatisch hinzugefügt. So besitzt beispielsweise nur das “T_3”-Proplet das Attribut mdd, da ein Verb und ein Nomen kein anderes Proplet modifizieren können, ein Adjektiv hingegen schon.

Die Regeldatei

Die Funktionsweise der Regeldatei syntax.rul wird anhand einer rudimentären Syntaxkomponente verdeutlicht. Im Anschluss wird auf weitere Regeln eingegangen, die in dem vorliegenden Projekt gebraucht werden.

Grundlegendes

Wie auch schon in der Morphologie ist die Regeldatei der elementare Bestandteil, der eine korrekte syntaktische Erkennung eines Beispielsatzes ermöglicht. In der Regeldatei werden die benötigten Regeln samt ihrer zugehörigen Regelpakete und Operationen (siehe hierzu auch den Anhang) definiert. In der nachfolgenden Abbildung ist eine rudimentäre Regeldatei dargestellt, deren einzelne Abschnitte im Folgenden näher erläutert werden. In dem Beispiel wird zunächst die Regel “DET+N” implementiert, die einen Artikel mit einem Nomen verknüpft.

 ST_S = {([cat: (_)] {DET+N})}

DET+N 

[noun: _, cat: (ADN' N' NP)]
[noun: _, cat: (N)         ]

setref(nw.noun SS.noun)
cancel(N' ADN')
acopy(nw.sem SS.sem)

ST_F = {([cat: (_)] rp_DET+N)}

Zunächst wird auch in der Regeldatei für die Syntax ein Startzustand definiert, der mit dem Schlüsselwort “ST_S” eingeleitet wird. Im Anschluss wird das Muster deklariert, das die gültige Anfangskategorie beschreibt. In der Beispieldatei ist diese mit der Platzhaltervariable _ belegt, die für null bis unendlich viele Werte steht. Im Normalfall wird der Satzanfang allerdings eingeschränkt, da nicht jede Kategorie als Satzanfang akzeptiert werden darf. Schließlich folgt ein Regelpaket, das alle nach dem erfolgreichen Abgleich mit der Startkategorie anwendbaren Regeln auflistet (hier trifft dies nur auf die Regel “DET+N” zu). Als nächstes wird eine Regel definiert. Sie beginnt mit dem Regelnamen, gefolgt von einer Liste möglicher Folgeregeln, dem sogenannten Regelpaket. In obenstehendem Beispiel existieren keine weiteren Regeln, die nach “DET+N” aufgerufen werden können. Möglich wären etwa die Regeln “MAIN+FV” oder auch “S+IP”. Danach werden die Muster definiert, die den möglichen Satzanfang und das mögliche nächste Wort definieren. In der hier dargestellten Regeldatei wird als Satzanfang ein beliebiger Artikel akzeptiert, der kategorial mit dem folgenden Nomen abgeglichen wird, da bestimmte Kongruenzbestimmungen einzuhalten sind. Im Anschluss an die Musterdefinition folgen die Operationen, die in der jeweiligen Regel angewendet werden sollen. Für die Regel “DET+N” wird mit der Operation setref der Wert des noun-Attributs der zweiten Wortform referentiell auf den Wert des noun-Attributs der ersten Wortform, dem sentence start (SS), gesetzt. Schließlich werden mit der Operation cancel die nun nicht mehr gebrauchten Variablen “N'” und “ADN'” gelöscht. Am Ende der Regeldatei wird der Endzustand definiert, dessen Aufbau dem des Startzustands sehr ähnelt. Eingeleitet mit dem Schlüsselwort “ST_F”, werden auch hier die möglichen Endkategorien abgeglichen (in diesem Falle wird erneut die Platzhaltervariable _ verwendet), die als gültiger Endzustand akzeptiert werden. Abschließend folgen die möglichen Regelpakete, deren Ergebnisse als valides Satzende angenommen werden. In obigem Beispiel wird die Regel “DET+N” als gültiger Abschluss akzeptiert, da sonst keine weitere Regel vorhanden ist und diese daher gleichzeitig Start- und Endzustand darstellt. Ein mögliches Ende wäre beispielsweise die Regel “S+IP”, die den vorherigen Satz mit einem Interpunktionszeichen abgleicht, das im Normalfall auch das Ende des Satzes signalisiert.

Weiterführende Regeln

Für eine vollständige und korrekte Analyse einfacher deklarativer Hauptsätze im Deutschen sind neben der Regel “DET+N” noch mindestens folgende Regeln notwendig:

  • “DET+ADJ”
  • “FV+MAIN”
  • “MAIN+FV”
  • “S+IP”

Die Regel “DET+ADJ” verknüpft einen Artikel mit einem Adjektiv und kann auch zu Beginn eines Satzes stehen. Aus diesem Grund muss “DET+ADJ” im Startzustand in die Liste der möglichen Anfangsregeln eingefügt werden. In nachfolgender Abbildung kann die in diesem Beispielprojekt verwendete “DET+ADJ”-Regel betrachtet werden.

 DET+ADJ {DET+ADJ DET+N}

[cat: (ADN' N' NP)]
[cat: (ADN)]

acopy(nw.adj SS.mdr)
acopy(SS.noun nw.mdd)
copy(nw)

“DET+ADJ” kann, neben der Folgeregel “DET+N”, auch rekursiv angewendet werden (Beispiel: “Der schöne große Mann”), deshalb wird diese Regel auch in das eigene Regelpaket geschrieben. Der Abgleich auf den Satzanfang und die folgende Wortform erfolgt nach ähnlichem Prinzip wie bei der Regel “DET+N”. Die Regel “MAIN+FV” erlaubt es, eine komplexe Nominalphrase, ein Pronomen oder einen Eigennamen mit einem Verb zu verknüpfen. Für die Verknüpfung einer komplexen Nominalphrase folgt diese Regel der Regel “DET+N”. “MAIN+FV” kann auch am Satzanfang, beispielsweise bei der Kombination eines Pronomens mit einem finiten Verb, stehen und wird daher im Startzustand eingetragen. Der Regel selbst kann entweder die Regel “S+IP” oder “FV+MAIN” folgen, die beide im Anschluss erläutert werden. Wie aus nachfolgender Abbildung ersichtlich wird, muss die erste Wortform ein noun-Attribut besitzen, wohingegen die nachfolgende Wortform ein verb-Attribut innehat.

 MAIN+FV {S+IP FV+MAIN}

[noun: _, cat: (_ NP)]
[verb: _, cat: (NP' _), arg: _]

acopy(SS.noun nw.arg)
acopy(nw.verb SS.fnc)
cancel(NP')
copy(nw)

Weiterhin wird die Regel “FV+MAIN” benötigt, die ein Verb mit einer komplexen Nominalphrase, einem Pronomen oder einem Eigennamen verknüpft. Sie kommt nach der “MAIN+FV”-Regel zur Anwendung und muss daher in die Liste der möglichen Folgeregeln bei der Regel “MAIN+FV” eingetragen werden. Der Aufbau der Regel “FV+MAIN” ist folgender Abbildung zu sehen:

 FV+MAIN {DET+ADJ DET+N FV+MAIN S+IP}

[verb: _, cat: (NP' _)]
[noun: _, cat: (_ NP)]

cancel(NP')
acopy(SS.verb nw.fnc)
acopy(nw.noun SS.arg)
copy(nw)

Zuletzt muss noch die Regel “S+IP” implementiert werden, die einen Satz mit einem Interpunktionszeichen verknüpft. Im Falle der deklarativen Hauptsätze handelt es sich hierbei um den Punkt. Die im Beispielprojekt verwendete Regel “S+IP” ist in untenstehender Abbildung zu sehen. Es existieren hier keine weiteren Folgeregeln, da mit dieser Regel der Satz abgeschlossen ist und keine weiteren Wortformen folgen können. Die Regel “S+IP” ist somit auch die einzige Regel, die im Endzustand zu finden ist. Zudem muss in sämtlichen Regelpaketen, nach Anwendung einer Regel, die ein gültiges Satzende darstellen können, die Regel “S+IP” eingefügt werden. In dem Beispielprojekt “german1” wären das die Regeln “DET+N” (“Der Mann schenkt der Frau das Buch.”), “MAIN+FV” (“Die Frau isst.”) und “FV+MAIN” (“Er schenkt ihr es.”). Im Fall der Regel “DET+ADJ” ist “S+IP” nicht möglich, da etwa “$^*$Der schöne .” syntaktisch nicht korrekt ist.

 S+IP 

[cat: (v) ]
[cat: (v' decl)]

ecopy(decl SS.cat)

Erweiterung auf freie Wortstellung

Mit dem bisherigen System ist es nicht möglich, die freie Wortstellung des Deutschen zu berücksichtigen. Daher ist es nötig, die Regeln “MAIN+FV” und “FV+MAIN” um eine unspezifizierte Variable “X” zu erweitern. Diese Variable dient dazu, um auch auf einer unbekannten Position auf Constraints zugreifen zu können. Das bedeutet, dass die Variablen in beliebiger Reihenfolge gekürzt werden können. Um die Variable “X” nutzen zu können, muss diese zunächst in der Variablendatei eingetragen werden. Die genaue Definition lautet: “X = .{0,3”} - die Variable “X” kann somit null bis drei beliebige Werte annehmen. Anschließend werden die beiden angesprochenen Regeln wie in den beiden nachfolgenden Abbildungen gezeigt erweitert, indem die Variable “X” jeweils in das Muster für das Verb eingefügt wird.

 MAIN+FV {S+IP FV+MAIN}

[noun: _, cat: (_ NP)]
[verb: _, cat: (X NP' _), arg: _]

acopy(SS.noun nw.arg)
acopy(nw.verb SS.fnc)
cancel(NP')
copy(nw)
 
FV+MAIN {DET+ADJ DET+N FV+MAIN S+IP}

[verb: _, cat: (X NP' _)]
[noun: _, cat: (_ NP)]

cancel(NP')
acopy(SS.verb nw.fnc)
acopy(nw.noun SS.arg)
copy(nw)

Die Variablendatei

Die Variablendatei syntax.var dient dazu, die möglichen Werte zu definieren, die die verwendeten Variablen annehmen dürfen. Diese Deklaration erfolgt nach dem Muster untenstehenden Muster. Hier wird zunächst der Datentyp der Variable definiert, gefolgt von dem Variablennamen. Diese Variablen können nach eigenem Ermessen benannt werden, es muss jedoch beachtet werden, dass zu Beginn keine Kleinbuchstaben verwendet werden dürfen. Durch das Elementzeichen <- werden die (in geschweiften Klammern) nachfolgenden Werte der soeben definierten Variable zugeordnet. Somit kann in nachfolgender Abbildung etwa die Variable “N” die Werte “n-g” und “m-g” annehmen.

 string	
N    <- {m-g, mg, n-g, ng, f, p, p-d, pd}
N'   <- {f', p-d', m-n', mn', n-g', -fd', pd'}
NP   <- {s3+a, a, g+d, d, s3, s3+p3+a, p3+a, p2+d}
NP'  <- {s3', d', a', s3p2', p2', s23p2'}
ADN' <- {e', en', er', es'}
ADN  <- {e, en, er, es}
X    =  .{0,3}

In der Variablendatei ist es zudem möglich, Kongruenzbeziehungen zwischen zwei Variablen, beziehungsweise zwischen den Werten dieser zwei Variablen, herzustellen. Dies sind die sogenannten Constraints. Diese Werte müssen allerdings in der eben beschriebenen Art und Weise bereits der Variable zugeordnet worden sein. Durch Constraints werden die Möglichkeiten beschränkt, nach denen die Werte der Variablen miteinander kongruieren können, was schließlich dazu führt, dass nicht kongruente Wortformen nicht miteinander verknüpft werden. In der nachfolgenden Abbildung findet sich die um einige Constraints erweiterte Variablendatei. Jeder einzelne Constraint wird mit dem Schlüsselwort constraint eingeleitet. In der darauffolgenden Zeile wird das vom Constraint zu beeinflussende Variablenpaar definiert, abgeschlossen von einem Doppelpunkt. In den folgenden Zeilen werden dann die möglichen Belegungen definiert, die die beiden Variablen in Abhängigkeit voneinander annehmen dürfen: auf der linken Seite steht genau ein Wert, der mit einer Liste möglicher Werte auf der rechten Seite verknüpft wird. Diese Verknüpfung erfolgt mit dem Elementzeichen =>. Jede dieser Kombinationsmöglichkeiten muss mit einem Punkt abgeschlossen werden.

 string	
N    <- {m-g, mg, n-g, ng, f, p, p-d, pd}
N'   <- {f', p-d', m-n', mn', n-g', -fd', pd'}
NP   <- {s3+a, a, g+d, d, s3, s3+p3+a, p3+a, p2+d}
NP'  <- {s3', d', a', s3p2', p2', s23p2'}
ADN' <- {e', en', er', es'}
ADN  <- {e, en, er, es}
X    =  .{0,3}
 
strict constraint

N'    => N:
f'    => {f}        .
p-d'  => {p-d, p}   .
m-n'  => {m-g}      .
mn'   => {m-g}      .
n-g'  => {n-g}      .
-fd'  => {n-g, m-g} .
pd'   => {pd, p}    .


strict constraint

ADN'  => ADN:
e'    => {e}    .
en'   => {en}   .
er'   => {er}   .
es'   => {es}   .


strict constraint

NP'    => NP:     
s3'    => {s3+a, s3, s3+p3+a}      .
s3p2'  => {s3+a, s3, p2+d}         .
s23p2' => {s3}                     .
d'     => {d, p2+d, g+d}           .
a'     => {a, s3+a, s3+p3+a, p3+a} .

Durch den Constraint “p-d' => p-d, p” sind zum Beispiel Artikel-Nomen-Kombinationen wie “die Männer”, “die Bücher” oder “die Frauen” möglich. Das Schlüsselwort strict gibt hierbei an, dass ansonsten keine anderen Kombinationen von Werten zulässig sind. Der Constraint “mn' => m-g” lässt hingegen nur Artikel-Nomen-Kombination wie “der Mann” zu.

Einbindung eines semantischen Lexikons

Um Verben mit Valenzstellen für die syntaktisch-semantische Analyse auszustatten, eignet sich die Einbindung eines semantischen Lexikons. Hier können über einen Schlüssel, der in diesem Projekt die Grundform ist, Informationen, die über die rein morphologische Analyse hinausgehen, automatisch der Analyseausgabe hinzugefügt werden. Untenstehende Abbildung zeigt einen Eintrag für das Verb “schenken”.

 [sur: schenken, cat: (d' a')]  

Durch die Annotierung des Attributes cat mit einer Dativ- und Akkusativvalenzstelle ist das Verb in der syntaktisch-semantischen Analyse, neben der in der Morphologie gebildeten Nominativvalenzstelle, noch mit diesen beiden Valenzstellen ausgestattet. Somit ist es möglich, Sätze wie “Die Frau schenkt dem Mann das Buch.” korrekt analysieren zu können. Will man auch Sätze wie “Die Frau schenkt das Buch.” analysieren, kann der Eintrag im Attribut cat in “<(d' a')(a')>” umgeschrieben werden. In diesem Falle ist die Dativvalenzstelle als optional markiert.

Testlisten

Eine wichtige und sinnvolle Überprüfung des Projektes wird durch Testlisten gemacht. Hier werden in einer positiven Testliste grammatikalisch korrekte Sätze mit einem Satz pro Zeile eingetragen. Die Option -test gefolgt von dem Namen der Testdatei (z.B. “-test ../tests/german1.tst”) erlaubt es innerhalb des JSLIM-Systems, alle Einträge der Testdatei syntaktisch zu parsen. Somit kann überprüft werden, ob alle Satzkonstruktionen richtig implementiert wurden. Das Gegenteil der positiven Testliste, die negative Testliste, wird zum Finden von Übergenerierungen gebraucht. In die negative Testliste werden fehlerhafte Satzgebilde eingetragen. Werden alle diese Wortformen nicht akzeptiert, ist dies ein guter Anhaltspunkt dafür, dass das Projekt kaum oder gar nicht übergeneriert ist. Werden jedoch nicht wohlgeformte Sätze erkannt, so dient die negative Testliste als Basis dafür, das Projekt sukzessive durch Finden und Ausbessern der Fehler zu optimieren. Es werden bei Angabe einer Testdatei automatisch drei Dateien generiert, die denselben Namen der Testdatei tragen, gefolgt von der Endung .err (Exceptions), .lst (Kurzansicht der Ausgabe) und .out (Propletansicht der Ausgabe).