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 dieSingular
-Wiedergabe des Nomens erzwingt, mit dem sie verknüpft ist und z. B. 2 fürPlural
entsprechend der Grammatik der Sprache für grammatikalische Zahlen) entsprechend dem numerischen Wert.
- Numerische Typen können beispielsweise mithilfe einer impliziten Funktion
- 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))
.
- Textelemente, einschließlich Satzzeichen, werden als Argumente an eine Funktion VorlagenText übergeben, z. B.
- 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
- ↑ 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.
- ↑ Beachte die große Ähnlichkeit der Datentypdefinition mit der Lexemdefinition von Wikidata, es handelt sich jedoch um unterschiedliche Objekte.
- ↑ 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.
- ↑ Eine erste Implementierung davon findet sich in Gerrit.
- ↑ 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. - ↑ 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.