Programmierworkshop/projekte/interlinearisator/formate

Shoestring-Interlinearisator

shoestring.png

<!>

ACHTUNG! Beim dem hier abrufbaren Stand handelt es sich lediglich um einen ersten Entwurf.

Einzelheiten können sich bei fortschreitendem Kenntnisstand noch ändern.

Als langfristiges Ziel verfolgt die C Reihe des Workshop derzeit die Erstellung eines Werkzeugs zur Erstellung interlinearer Textübersetzungen.

Inhalt

  1. About

  2. screenshots

  3. Einleitung

  4. Beschreibung

  5. Komponenten

  6. JSON

  7. BSON

  8. Code-Schnippsel

  9. Testcorpus

10. Links

About

Programmierworkshop/projekte/interlinearisator/about

Zielsetzung

Es soll ein Programm zur maschinengestützen Bearbeitung und Erstellung von Interlinearversionen (d.h. interlinearer Textübersetzungen) erstellt werden.

Programmverhalten

Zusammenfassend in Kurzform eine Beschreibung des gewünschten Programmverhaltens

Eingabe

  • Gegliederter Eingabetext
  • Datenbanktabellen
  • Ableitungsregeln

Ausgabe

  • Interlinearversion
  • veränderte Datenbanktabellen

Anforderungen

  • Die Verarbeitung eines Eingabetexts soll dabei grundsätzlich halbautomatisch im Dialog mit dem Benutzer erfolgen. Die Kommunikation mit dem Benutzer soll nur dort ausgelassen werden, wo ausnahmsweise Eindeutigkeit herrscht.
  • Auch in Fällen vermeintlich eindeutiger Zuordnung muss es dem Benutzer schnell möglich sein, den automatischen Interlinearisierungsvorgang anzuhalten und einzugreifen.
  • Es soll dabei möglich sein die für einen Interlinearisierungsvorgang zur Verfügung stehende Datenbasis im laufenden Betrieb zu erweitern.
  • Die Steuerung des automatischen Teils eines Interlinearisierungsvorgangs soll über die Vorgabe von Datenbanktabellen und zugehörigen Ableitungsregeln erfolgen.
  • Um spätere Auswertung und Weiterverarbeitung erstellter Interlinearversionen zu ermöglichen sollen diese, sowie verwendete Datenbanktabellen und -regeln in einem standardisierten Format abgelegt werden.
  • Die Komponenten sollen modular aufgebaut sein und der Architektur funktionalem Designs möglichst nahekommen. Konkret: Interlinearisator und GUI sollen voneiander getrennt sein, so dass beliebige GUIs implementiert werden können (z.B. GTK+, ncurses, ...). Ferner soll die Interlinearisatorkomponente von den Lookup- und Viewer-Komponenten getrennt sein.
  • Die Entwicklung eigener Lookup- und Viewer-Komponenten soll so einfach wie möglich sein.

In einer ersten Erprobungsphase soll hierfür die Brauchbarkeit des JSON Formats erkundet werden. Nähere Informationen zu diesem finden sich in RFC 4627 unter folgendem link. Als Datenbank soll eine noSQL-Datenbank eingesetzt werden, als erster Versuch MongoDB.


Arbeitsweise

Hier die Beschreibung des vorgesehenen Interlinearisierungsvorgangs an Hand eines Beispiels.

Eingabe

Eingabetext

Bei der zu interlinearisierenden Textpassage handelt es sich um einen Ausschnitt aus Antoine de Saint-Exupéry's Werk "le petit prince" (der kleine Prinz), die als Folge von Zeichenketten zur Verfügung stehen soll:

ref

0001

1(tx)

lorsque

j´avais

six

ans

j´ai

Dabei ist der Text so gegliedert, dass jedes Segment (meist ein Satz) eine Referenznummer erhält und jede Zeile eines Segmentes mit einem Tag (hier (tx)) versehen ist.

Datenbanktabellen

Bevor es ans Interlinearisieren gehen kann sollte die bereits zum Übersetzungszeitpunkt zur Verfügung stehende Information über die Quellsprache, in der der zu übersetzende Text vorliegt bekannt gemacht werden.

Folgende Datenbanktabellen sollen für dieses Beispiel bereits bekannt sein und somit für den Interlinearisierungsvorgang zur Verfügung stehen:

TABELLE 1

TABELLE 2

TABELLE 3

(fl)

(br)

(le)

(me)

(le)

(me)

j´avais

je-avoir-ais

lorsque

als

ais

1sIPF; 2sIPF

ans

an-s

je

ich

s

PL; 1sPRES; 2sPRES; IMPs

j´ai

je-avoir-0

avoir

haben

0

1sPRES


(!)

zur Notation

Mit ; getrennte Zeichenketten stellen Alternativen dar; Mit - getrennte Zeichenketten hingegen sollen allesamt eingefügt und im nächsten Bearbeitungsschritt als getrennte Einheiten beachtet werden.

Ableitungsregeln

Schließlich sollte noch festgelegt werden nach welchen Spielregeln die Datenbanktabellen denn überhaupt für den anstehenden Interlinearisierungsvorgang verwendet werden dürfen.

Folgende Vorgaben sollen dabei für dieses Beispiel gelten:

  • Ausgehend von der Eingabezeile sollen zwei weitere Zeilen erzeugt werden.
  • Zeile 2 soll aus Zeile 1 unter Verwendung der Tabellen 1, 2 und 3 erzeugt werden.
  • Zeile 3 soll aus Zeile 2 unter Verwendung der Tabellen 2 und 3 erzeugt werden.

In der ersten Version des Interlinearisators sollen die obigen Regeln vorläufig "fest verdrahtet" sein. Für die Endversion sollen die Ableitungsregeln in einer Domain Specific Language über eine Konfigurationsdatei für ein spezifisches Projekt individuell gesteuert werden können (siehe unten).

DSL für Ableitungsregeln

Die Ableitungsregeln für das obige Beispiel würden ungefähr so formalisiert:

  • derive (mb) from (tx) split lookup (br) order 132

  • derive (gl) from (mb) unsplit lookup (me) order 32

In einer weiteren Ausbaustufe sollen statt Tabellennummern externe Applikationen benannt werden können, die als Input ein Lookup-Lemma (sowie ggf. weitere Argumente) erhalten und (ggf. nach Interaktion mit dem Benutzer) einen String als Output zurückliefern, der in der abgleiteten Zeile eingefügt wird. Der zurückgelieferte String kann eine einfaches Wort sein (derive) oder aber ein Wort mit Morphemtrennern (split).

Die erweiterten Ableitungsregeln für das obige Beispiel würden dann lauten:

  • split (mb) from (tx) use mongo_lookup db.frz.ps (br) || mongo_check db.frz.suff && mongo_check db.frz.lex ;

  • derive (gl) from (mb) use mongo_lookup db.frz.suff (me) && mongo_lookup db.frz.lex (me) ;

mongo_lookup(database,lemma,return-key) sucht in einer Datenbank (z.B. db.frz.ps) nach dem Element aus der oberen Zeile und gibt als Rückgabewert ein Element aus einem spezifizierten Keyfeld des Datensatzes zurück (z.B. (br)).

mongo_check(database,lemma) überprüft lediglich, ob das Element aus der oberen Zeile in der Datenbank vorhanden ist und gibt dann entweder das Element als Kopie zur Einfügung zurück oder liefert FALSE.

Interlinearisierungsvorgang

Mit den getroffenen Angaben sollte die Übersetzung sollte nun zunächst automatisch von statten gehen.

Erste Schwierigkeiten ergeben sich erst an den farblich markierten Stellen.

ref

0001

1(tx)

lorsque

j´avais

six

ans

j´ai

2(mb)

lorsque

je

-

avoir

-

ais

?

an

-

s

je

-

avoir

-

0

3(gl)

als

ich

-

haben

-

K

?

?

-

K

ich

-

haben

-

1sPRE

Konflikte

An den beiden blau gefärbten und mit einem K markierten Stellen stehen mehrere Übersetzungmöglichkeiten im Konflikt.

Laut TABELLE-2 gibt es zur Übersetzung von ait gleich zwei Möglichkeiten 1sIPF und 2sIPF. An dieser Stelle liegt es nun am Benutzer zu entscheiden, welche der beiden Alternativen zu wählen ist. In diesem Fall dürfte dies wohl 1sIPF sein.

Gleiches gilt für die Übersetzung von s auch hier stehen laut TABELLE-2 mehrere Möglichkeiten zur Verfügung.

keine Übersetzung

Ein anderes Problem ergibt sich an den rot gefärbten und mit einem ? markierten Stellen. Hier ist laut sämtlichen zur Verfügung stehenden Tabellen nämlich gar nicht bekannt wie zu übersetzen ist.

Fall 1

Der einfachere Fall betrifft die Übersetzung von ans, dieses ließ sich in Zeile 2 wenigstens noch in an und s trennen und es hängt bloß am letzten Schritt.

Auch hier kann nur der Benutzer weiter helfen: Der fehlende Tabelleneintrag dürfte wohl an = Jahr sein.

Fall 2

Viel früher schon ins Stocken gerät die Übersetzung schließlich bei der Übersetzung von six in Zeile 1. Hier ist noch nicht einmal klar, ob eventuell in Zeile 2 zu trennen ist.

Scheinbar ist dies hier nicht der Fall. Ein weiterer Tabelleneintrag six = sechs sollte hier wohl die korrekte Lösung des Problems sein.

Ausgabe

Nach Durchführung aller genannten Schritte sollten sowohl Interlinearversion, als auch überarbeitete Datenbanktabellen bereit zur Ausgabe sein.

Interlinearversion

ref

0001

1(tx)

lorsque

j´avais

six

ans

j´ai

2(mb)

lorsque

je

-

avoir

-

ais

six

an

-

s

je

-

avoir

-

0

3(gl)

als

ich

-

haben

-

1sIMP

sechs

Jahr

-

PL

ich

-

haben

-

1sPRE

Datenbanktabellen

TABELLE 1

TABELLE 2

TABELLE 3

(fl)

(br)

(le)

(me)

(le)

(me)

j´avais

je-avoir-ais

lorsque

als

ais

1sIPF; 2sIPF

ans

an-s

je

ich

s

PL; 1sPRES; 2sPRES; IMPs

j´ai

je-avoir-0

avoir

haben

0

1sPRES

six

sechs

an

Jahr

Fazit

In zwei besonderen Spezialfällen ist eine Interaktion von Benutzerseite nötig:

  • Konflikt zwischen mehreren anwendbaren Übersetzungen
  • keine bekannte Übersetzung


Erweiterungsmöglichkeiten

Semantische Hierarchieebenen für Lexikoneinträge

Lexikografen neigen (aus mehr oder weniger rationalen Gründen) dazu, Bedeutungen in Baumstrukturen nach Haupt-, Neben, Über- und Unterbedeutungen zu gliedern. Diese Möglichkeit soll auch hier gegeben werden, indem z.B. das me-Feld als beliebig verschachtelte Liste angelegt und dargestellt werden kann. Beim Lookup jedoch, wird dann jede verschachtelte Liste als flache Liste behandelt.


Screenshots

Hier die (vermutlich) obligatorischen screenshots:

Stand: 04-08-2012 shot-1.png


Stand: 07-08-2012 shot-2.png


Stand: 07-08-2012 shot-3.png


Lizensierung

Das im Verlaufe des Projektes (hoffentlich) entstehende Programm soll sowohl in seiner Erstellungsphase, als auch nach seiner Fertigstellung unter freier Lizenz Verfügbar sein. Welche Lizenz zum Zuge kommt, ist noch zu entscheiden.

Das "frei" in "freier Lizenz" ist hierbei nicht im Sinne von kostenlos zu verstehen, sondern im Sinne der von der FSF formulierten vier wesentlichen Freiheiten freier Software. Nachzulesen genau hier.

Ferner soll das Projekt auch als freies Entwicklungsprojekt auf einer entsprechenden Plattform (github, sourceforge) gehostet werden und öffentlich zur Mitarbeit aufgerufen werden.

Sobald eine halbwegs verwendbare Version (1.0) vorliegt, soll diese in die Repositories der Linux-Distributionen Eingang finden.

Screenshots

Programmierworkshop/projekte/interlinearisator/screenshots



Einleitung

Programmierworkshop/projekte/interlinearisator/einleitung


Beschreibung

Programmierworkshop/projekte/interlinearisator/beschreibung

Hier der vorläufige Versuch einer formalen Beschreibung des Interlinearisierungsproblems.

Motivation

Um dem Gedanken hinter der auf den ersten Blick vermutlich ein wenig ulkig erscheinende Herangehensweise des hier vorgenommenen Beschreibungsversuchs ein wenig schneller auf die Schliche zu kommen dürfte sich - soweit nicht bereits vorgenommen - ein Blick auf den vorangegangenen Einleitungsabschnitt lohnen.

Die einzelnen Bearbeitungsschritte des in oben genanntem Abschnitt vorgeführten Beispiels befinden sich in folgender Skizze in einer für den vorgenommenen Beschreibungsversuch ein wenig suggestiveren Form aufbereitet wieder.

image-1.png

Beobachtung

Wie oben abgebildete Skizze nahezulegen versucht scheint sich jede interlineare Übersetzung eines Textes auch als spezielle Form eines gerichteten azyklischen Graphen auffassen zu lassen.

Interessanter Weise scheint diese Beobachtung nicht nur für die vollständige Interlinearversion des zu übersetzenden Textes zuzutreffen, sondern wie hier skizziert auch für den eingegebenen Text selbst.

image-2.png

Selbst jeder während eines Übersetzungsvorgangs erreichte Zwischenstand sollte sich selbst ebenfalls wieder als Graph auffassen lassen.

Hier beispielhaft ein möglicher Zwischenstand, der sich bei der Übersetzung des Beispieltextes ergeben könnte.

image-3.png

Zum selbst mitverfolgen hier eine mögliche Folge von Bearbeitungsschritten für die Textpassage aus dem Beispiel.

Idee

Mit oben gemachter Beobachtung scheint es möglich den Vorgang des Erstellens einer interlinearen Übersetzung als eine Folge von Transformationen zu beschreiben, die an einem zum jeweiligen Eingangstext korrespondierenden Graphen vorgenommen werden.

Noch genauer festzulegende Regeln würden bei einem solchen Beschreibungsversuch über "erlaubte", bzw. "nicht erlaubte" Transformationsschritte Auskunft geben.

Regelsuche

Auf der Suche nach solchen Transformationsvorschriften scheint ein trade-off zwischen Effizienz des eingesetzen Algorithmus und der Vielfältigkeit seiner Einsatzmöglichkeiten mehr oder minder unvermeidlich.

Zwei mögliche Strategien scheinen sich auf der Suche nach einer "Lösung" für das Regelformulierungsproblem anzubieten:

  • Einschränkung eines möglichst allgemein formulierten Regelsatzes
  • Verallgemeinerung eines Spezialfalls mit sehr stark eingeschränkten Regeln.

Der bisher vorgenommene Beschreibungsversuch folgt dabei erstgenannter Strategie und dürfte zur Zeit noch eine ganze Reihe für das Interlinearisierungsproblem vollkommen unsinnige Transformationen zulassen.


Implementierung

Programmierworkshop/projekte/interlinearisator/implementierung

Implementierung

Einziges bisher unterstütztes Backend ist derzeit:

  • MongoDB

Vorgesehen, bisher aber noch nicht implementiert sind Visualisierungsmöglichkeiten mit folgenden Frontends:

  • ncurses
  • GTK+

Bibliotheken

Folgende Bibliotheken werden zum aktuellen Zeitpunkt benötigt

  • glib
  • json-glib
  • icu
  • mongodb-c-driver

ICU

International Components for Unicode (ICU) ist ein Open-Source-Projekt zur Unicode-Unterstützung und Internationalisierung, welches ausgereifte C/C++- und Java-Bibliotheken bereitstellt. Im Interlinearisator soll es für den Mustervergleich und für die Sortierung der Datenbanktabellen eingesetzt werden.


Schemata

Konfiguration

   1 {
   2   "boxes" : [
   3     { "collection" : "lug.frzps" },
   4     { "collection" : "lug.frzsf" },
   5     { "collection" : "lug.frz" }
   6   ],
   7 
   8   "rules" : [
   9     { "boxes" : [0],
  10       "copy"  : [1, 2] },
  11 
  12     { "boxes" : [1, 2] }
  13   ]
  14 }

Übersetzungstabellen

TABELLE 1

TABELLE 2

TABELLE 3

(fl)

(br)

(le)

(me)

(le)

(me)

j´avais

je-avoir-ais

lorsque

als

ais

1sIPF; 2sIPF

ans

an-s

je

ich

s

PL; 1sPRES; 2sPRES; IMPs

j´ai

je-avoir-0

avoir

haben

0

1sPRES

   1 { "key" : "fauve", "value" : "Raubtier" }
   2 { "key" : "fauve", "value" : "falb" }

   1 { "key" : "j'avais", "value" : [ "je", "avoir", "ais" ] }

Interlinearversion

Die Interlinearversion eines Textes wird als Ableitungsbaum gespeichert.

Die ersten drei Hierarchie-Ebenen entsprechen hierbei dem gesamten Dokument, in Abschnitte gegliederten Referenzen, sowie auf letzter Ebene einzelnen Worten und Satzzeichen.

  • dokument
    • referenz
      • wort
      • wort
    • referenz
      • ...

Beispiel

ref

u 001

1(tx)

lorsque

j´avais

six

ans

2(mb)

lorsque

je

-

avoir

-

ais

six

an

-

s

3(gl)

als

ich

-

haben

-

1sIMP

sechs

Jahr

-

PL

   1 {
   2   "id" : "document",
   3   "children" : [
   4     {
   5       "id" : "u 001",
   6       "children" : [
   7         {
   8           "id" : "Lorsque"
   9           "children" : [
  10             {
  11               "id" : "lorsque",
  12               "children" : [
  13                 {
  14                   "id" : "als"
  15                 }
  16               ]
  17             }
  18           ]
  19         },
  20         {
  21           "id" : "j'avais"
  22           "children" : [
  23             {
  24               "id" : "je",
  25               "children" : [
  26                 {
  27                   "id" : "ich"
  28                 }
  29               ]
  30             },
  31             {
  32               "id" : "avoir",
  33               "children" : [
  34                 {
  35                   "id" : "haben"
  36                 }
  37               ]
  38             },
  39             {
  40               "id" : "ais",
  41               "children" : [
  42                 {
  43                   "id" : "1sIMP"
  44                 }
  45               ]
  46             },
  47           ]
  48         },
  49         {
  50           "id" : "six",
  51           "children" : [
  52             {
  53               "id" : "six",
  54               "children" : [
  55                 {
  56                   "id" : "sechs"
  57                 }
  58               ]
  59             }
  60           ]
  61         },
  62         {
  63           "id" : "ans",
  64           "children" : [
  65             {
  66               "id" : "an",
  67               "children" : [
  68                 {
  69                   "id" : "Jahr"
  70                 }
  71               ]
  72             },
  73             {
  74               "id" : "s",
  75               "children" : [
  76                 {
  77                   "id" : "PL"
  78                 }
  79               ]
  80             }
  81           ]
  82         }
  83       ]
  84     }
  85   ]
  86 }


Komponenten

Programmierworkshop/projekte/interlinearisator/komponenten


JSON

Programmierworkshop/projekte/interlinearisator/json


BSON

Programmierworkshop/projekte/interlinearisator/bson


Code-Schnippsel

Programmierworkshop/projekte/interlinearisator/code


Testcorpus

Programmierworkshop/projekte/interlinearisator/sample

Als Testsprachen für die Abbildung möglichst vieler Features sollen folgende Sprachen dienen:

  • Deutsch
  • Hebräisch
  • Akkadisch
  • Sumerisch
  • Vietnamesisch
  • Bantu (z.B. Swahili / Zulu / Xhosa)
  • Altgriechisch
  • Altirisch


Links

Programmierworkshop/projekte/interlinearisator/links

Interessantes und Überflüssiges zum Thema

wikipedia

Da der deutschsprachige Wikipedia Eintrag zum Thema leider deutlich knapper is als der entsprechene englischsprachige empfiehlt sich hier besonders ein Blick auf den Zweitgenannten:

lugfrankfurt: Programmierworkshop/projekte/interlinearisator (zuletzt geändert am 2012-08-04 22:23:32 durch Bernd)