Abstrakte Wikipedia/Vorlagensprache für Wikifunctions/Umwandlung von Vorlagensyntax in Wikifunctions

Wenn eine Vorlage mit der Syntax verwendet wird, kann sie in eine Kompositionssyntax (und damit ein Z7-Funktionsaufrufobjekt) geparst werden, die dann direkt vom Wikifunctions-Orchestrierer ausgewertet werden kann.

Ausgabetyp der Auswertung

Gemäß der vorgeschlagenen NLG-Architektur sollte die Ausgabe des Vorlagen-Renderers ein "Lemma-Baum" sein. In der unten vorgeschlagenen aktuellen Implementierung ist die benötigte Ausgabe kein vollständig spezifizierter Baum, sondern eine Lexemliste, ein Lexem,[Note 1] das als Z-Typ mit den folgenden Feldern definiert wird:[Note 2]

  • Lemma: Zitierform des Lexems (hauptsächlich für Debugging-Zwecke benötigt)
  • Sprachcode (meistens ist dieser identisch mit dem Zielsprachencode der Vorlage, kann aber in Sonderfällen variieren)
  • Wortart
  • Liste der vereinheitlichbaren grammatikalischen Funktionen, die auf alle Formen anwendbar sind
  • Liste der vereinheitlichbaren grammatikalischen Funktionen, die als Einschränkungen für die Formen dienen (aufgefüllt durch die Anwendung von Abhängigkeitsregeln)
    • In der Praxis können die beiden oben genannten Listen als eine einzige Liste grammatikalischer Funktionen implementiert werden.
  • Liste der Formen, wobei letztere ein Z-Typ mit den folgenden Feldern ist:
    • Orthographie
    • Umgang mit Leerzeichen (ob Leerzeichen vor/nach der Form unterdrückt werden sollen, um verschiedene Arten von Klitikern/Affixen zu verarbeiten)
    • Liste der für die Form spezifischen vereinheitlichbaren grammatikalischen Funktionen

Der oben erwähnte Typ vereinheitlichbare grammatikalische Funktion hat drei Felder:

  • Vereinheitlichungsindex: dient der Identifizierung dieser Funktionen mit anderen Lexemen in den Ableitungen.
  • Grammatische Kategorie: die Art der Funktion, z. B. Zahl oder Geschlecht
  • Grammatische Funktion (richtig): die Funktion selbst, z.B. Plural oder männlich

Der Lexemlistentyp ist eine Liste, deren Elemente entweder vom Lexemtyp oder selbst Lexemlisten sein können. Darüber hinaus wird jede dieser Listen um den Index des Wurzellexems erweitert, möglicherweise durch den Typ Z22 (Paar). Das Ergebnis ist ein teilweise spezifizierter Abhängigkeitsbaum von Lexemen, in dem nur Bögen zwischen den Wurzeln von Untervorlagen und ihren Obervorlagen aufgezeichnet werden, Bögen innerhalb einer einzelnen Vorlage jedoch nicht beibehalten werden.[Note 3]

Konstruktion der zusammengesetzten Funktion

Der zusammengesetzte Funktionsaufruf ist wie folgt aufgebaut:[Note 4]

  • Jedes Vorlagenelement wird wie folgt in einen Funktionsaufruf umgewandelt:
    • Textelemente, einschließlich Satzzeichen, werden als Argumente an eine Funktion VorlagenText übergeben, z. B. TemplateText("is"), TemplateText(".").
      • Die Funktion VorlagenText wandelt jedes Wort (oder Satzzeichen) in ein Lexem (oder genauer gesagt in eine Lexemliste der Länge 1) um. In den meisten Fällen enthält dieses Lexem genau eine Form, nämlich den bereitgestellten Text, wodurch statischer Text effektiv simuliert wird. In ausgewählten Fällen bietet dies jedoch die Möglichkeit, bestimmte Wörter zu einer Liste von Formen zu erweitern (z. B. könnte der englische Determinator "a" zu {"a", "an"} erweitert werden) oder zur Vereinfachung des Zugriffs relevante Anmerkungen zu bestimmten gängigen grammatikalischen Mustern hinzuzufügen.
    • Lücken mit Zeichenketten oder Interpolationen von Zeichenkettenargumenten werden ebenfalls in VorlagenText-Aufrufe umgewandelt, z. B. {"text"} → TemplateText("text"), {string_field} → TemplateText(string_field).
    • Interpolationen anderer Argumenttypen werden ähnlich behandelt, jedoch mit anderen Funktionen (TBD).
      • Numerische Typen können beispielsweise mithilfe einer impliziten Funktion Cardinal in Lexeme umgewandelt werden, die nicht nur den numerischen Wert in einen Lexemtyp umwandeln würden – z. B. die Zahl 1 in die Zeichenkette 1 – sondern bereichern auch das Lexem mit einer grammatikalischen Zahlenfunktion (z. B. dass eine 1 im Satz bei der Quantifizierung von Zählnomen die Singular-Wiedergabe des Nomens erzwingt, mit dem sie verknüpft ist und z. B. 2 für Plural entsprechend der Grammatik der Sprache für grammatikalische Zahlen) entsprechend dem numerischen Wert.
    • Lücken mit Funktionsaufrufen verwenden einfach den entsprechenden Funktionsaufruf (bei dem es sich möglicherweise um eine Untervorlage handelt), z. B. {Lexeme(entity}) → Lexeme(entity). Beachte, dass diese Funktionen einen Typ Lexemliste zurückgeben müssen.
    • Jede bedingte Funktion würde zusätzlich zum zuvor angegebenen Funktionsaufruf angewendet werden, z. B. {Lexeme(entity}|Elide_if(ellipsis)} → Elide_if(ellipsis, Lexeme(entity)).
  • Die Liste der resultierenden Funktionsaufrufe wird zusammen mit dem 1-basierten Index der mit der Wurzel gekennzeichneten Lücke an eine Vorlagen-Funktion übergeben.[Note 5] Zum Beispiel:
    Hello {root:Person(entity}|Elide_if(ellipsis)}! →
    Template(2, [TemplateText("Hello") Elide_if(ellipsis, Person(entity)) TemplateText("!")])
  • Die Abhängigkeitsbeziehungen werden als weitere Funktionsaufrufe zusätzlich zum Vorlagenaufruf angewendet, zusammen mit den 1-basierten Indizes der Ziel- und Quellbezeichnungen. Beachte, dass dies bedeutet, dass jede Abhängigkeitsrolle einer Wikifunctions-Funktion entsprechen sollte, die den Lemma-Baum transformiert, um die Anwendung der gegebenen Rolle widerzuspiegeln; z. B. würde eine Rolle amod die Subjekt-Verb-Übereinstimmung im Lemmabaum erzwingen. Zum Beispiel:
    Bonjour {det:DefiniteArticle()} {amod:Lexeme(L10098)} {root:Person(entity}! →
    amod(3, 4, det(2, 4, Template(4, [
    TemplateText("Bonjour")
    DefiniteArticle()
    Lexeme("L10098") -- adjective "petit"
    Person(entity)
    TemplateText("!")
    ]))

Beachte, dass von den Funktionen Vorlage und VorlagenText sowie den von den Namen der Abhängigkeitsbeziehungen abgeleiteten Funktionen erwartet wird, dass sie eine Lexemliste zurückgeben. Daher muss bei der Umwandlung eines Konstruktors in eine Vorlage eine weitere Funktion mit dem vorläufigen Namen Render angewendet werden, die den Lemma-Baum durch die anderen Module der NLG-Pipeline verarbeiten soll, um den realisierten Text als Zeichenkette zurückzugeben.

Sprachspezifische Funktionsausführung

In Wikifunctions wird der sprachspezifische Funktionsversand implementiert, indem jede Funktionsbezeichnung um ein Sprachcode-Suffix erweitert wird. Beispielsweise werden die englischen, deutschen und brasilianisch-portugiesischen Versionen von VorlagenText (auf Englisch) TemplateText_en, TemplateText_de und TemplateText_pt-BR genannt.[Note 6] Es wird die Aufgabe des Vorlagenparsers sein, beim Entkennzeichnen der Funktionsnamen nach der sprachspezifischsten Version einer bestimmten Funktion zu suchen.

Beispiele für die Umwandlung in Kompositionssyntax

Wir wiederholen hier die im Dokument der Vorlagenspezifikation aufgeführten Beispiele zusammen mit ihrer Umwandlung in die Kompositionssyntax.

Schwedisch

Zur besseren Lesbarkeit wiederholen wir die Vorlagensyntax:

Age_renderer_sv(Entity, Age_in_years): "{Person(Entity)} är {Age_in_years} år gammal ."

Die entsprechende Kompositionssyntax (Kurzform):

Age_renderer_sv(Entity, Age_in_years): Template(1, [
Person(Entity)
TemplateText("är")
TemplateText(Age_in_years)
TemplateText("år")
TemplateText("gammal")
TemplateText(".")
])

Französisch

Vorlagensyntax:

Age_renderer_fr(Entity, Age_in_years):
"{Person(Entity)} a {Year(Age_in_years)}."
Year_fr(years): "{nummod:Cardinal(years)} {root:Lexeme(L10081)}"

Kompositionssyntax:

Age_renderer_fr(Entity, Age_in_years): Template(1, [
Person(Entity)
TemplateText("a")
Year_fr(Age_in_years)
TemplateText(".")
])
Year_fr(years): num(1, 2, Template(2, [
Cardinal_fr(years)
Lexeme_fr(L10081)
]))

Hebräisch

Vorlagensyntax:

Age_renderer_he(Entity, Age_in_years):
"{subj:Person(Entity)} {root:GenderedLexeme(L64310, L64399)} {gmod:Year(Age_in_years)}."
Year_he(years):
"{nummod:Cardinal(years)|Elide_if(years<=2)} {root:Lexeme(L68440)|Elide_if(years>2)}"

Kompositionssyntax:

Age_renderer_he(Entity, Age_in_years):
gmod(3, 2, subj(1, 2, Template(2, [
Person(Entity)
GenderedLexeme(L64310, L64399)
Year_he(Age_in_years)
TemplateText(".")
])))
Year_he(years):
nummod(1, 2, Template(2, [
ElideIf(years<=2, Cardinal_he(years))
ElideIf(years>2, Lexeme(L68440)) ]))

isiZulu

Vorlagensyntax:

Age_renderer_zu(Entity, Age_in_years):
"{subj:Person(Entity)} {sc:SubjectConcord()}na{Year(Age_in_years)}."
Year_zu(years):
"{root:Lexeme(L686326} {concord:RelativeConcord()}{Copula()}{concord_1<nummod:NounConcord()}-{nummod:Cardinal(years)}"

Kompositionssyntax:

Age_renderer_zu(Entity, Age_in_years):
subj(1, 2, Template(2, [
Person(Entity)
SubjectConcord()
TemplateText("na")
Year(Age_in_years)
TemplateText(".")
]))
Year_zu(years):
nummod(6, 1, concord(4, 6, concord(2, 1, Template(1, [
Lexeme(L686326)
RelativeConcord()
Copula()
NounConcord()
TemplateText("-")
Cardinal(years)
]))))

Bretonisch

Vorlagensyntax:

Age_renderer_br(Entity, Age_in_years):
"{Cardinal(Age_in_years)} {Lexeme(L45068)} eo {Person(Entity)} ."

Kompositionssyntax:

Age_renderer_br(Entity, Age_in_years):
Template(1, [
Cardinal_br(Age_in_years)
Lexeme(L45068)
TemplateText("eo")
Person(Entity)
TemplateText(".")
])

Fußnoten

  1. Der Begriff "Lexem" wird hier recht weit gefasst. Er kann sich auf ein typisches Inhaltswort einer Sprache, ein grammatikalisches Morphem oder (unter bestimmten Umständen) sogar auf eine grammatikalische Phrase beziehen. Das Wesentliche ist, dass es eine Liste von einer oder mehreren Formen aufweist, die durch grammatikalische Funktionen gekennzeichnet sind.
  2. Beachte die große Ähnlichkeit der Datentypdefinition mit der Lexemdefinition von Wikidata, es handelt sich jedoch um unterschiedliche Objekte.
  3. Da Untervorlagen nicht unbedingt einer linguistischen Einheit entsprechen (obwohl sie im Idealfall sprachlichen Bestandteilen eines Abhängigkeitsbaums entsprechen sollten) und ihre Verwendung darüber hinaus im Ermessen des Vorlagenautors liegt, entspricht diese Teilbaumspezifikation nicht unbedingt einer bestimmten linguistische Logik, sondern spiegelt vielmehr die Organisation der Vorlage im Hinblick auf die Verwendung von Untervorlagen wider.
  4. Eine erste Implementierung davon findet sich in Gerrit.
  5. Wenn keine Lücke mit root gekennzeichnet ist (was nur zulässig ist, wenn auch keine anderen Bezeichnungen vorhanden sind), wird die erste Lücke als Wurzel identifiziert.
  6. Beachte, dass dies unabhängig davon ist, dass jede Wikifunctions-Funktion Bezeichnungen in verschiedenen Sprachen haben kann. Alle diese Bezeichnungen sollten der Konvention folgen, den Sprachcode der Implementierung so zu kennzeichnen, wie er von der Implementierung verarbeitet wird.