Programmierworkshop/projekte/interlinearisator/formate
Shoestring-Interlinearisator
|
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
10. Links
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
Stand: 07-08-2012
Stand: 07-08-2012
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.
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.
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.
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.
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
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
Ü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" : "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
- ...
- 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 }
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
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:
Einschränkungen
Eine automatische Bearbeitung darf nur an den Blättern vorgenommen werden. In diesem Sinne "legale" Bearbeitungsstellen wurden in der folgenden Skizze blau markiert.
Begriffe
Hier ein erster Versuch einige für eine Beschreibung des Übersetzungsvorgangs scheinbar wichtige Konzepte begrifflich zu erfassen.
TODO! ... offensichtlich fehlt hier noch einiges.
Vorschläge, gerne auch zu ganz anderer Herangehensweise sind hier nicht nur jederzeit willkommen, sondern sogar erbeten.
Bearbeitungszustand
Ein gerichteter azyklischer Graph z heißt Σ-Bearbeitungszustand zum Alphabet Σ, wenn jeder Knoten von z mit einem Wort des Alphabets Σ beschriftet ist.
Die Menge aller Σ-Bearbeitungszustände zu vorgegebenen Alphabet Σ soll im folgenden mit dem Symbol ZΣ bezeichnet werden.
Regeln
Eine totale Funktion r:ZΣ → 𝓟(ZΣ) von der Menge aller Bearbeitunszustände ZΣ in die Potenzmenge 𝓟(ZΣ) aller Bearbeitungszustände soll im folgenden kurz mit dem Begriff der (allgemeinen) Σ-Regel bezeichnet werden.
Sofern Missverständnisse ausgeschlossen sind wird das Symbol Σ im folgenden weggelassen werden und stattdessen von Bearbeitungszuständen, Regeln, bzw. der Menge Z gesprochen werden.
Bearbeitungsschritt
Sind z1 und z2 Bearbeitunszustände und R eine Menge von Regeln zum gleichen Alphabet Σ, so heißt der Zustand z2 genau dann bezüglich R durch einen gültigen Bearbeitunsschritt aus z1 erzeugt, wenn es in R eine Regel gibt, die den Bearbeitungszustand z1 auf eine Teilmenge von Z abbildet, die den Bearbeitungszustand z2, enthält.
Schreibweise:
Für diesen Sachverhalt soll im folgenden auch die folgende Kurzschreibweise erlaubt sein: z1→R z2 erlaubt sein.
Mit dieser lässt sich obige Definition kurz wie folgt formulieren:
z1→R z2 :⇔ ∃ r∊R : z2∊r(z1)
Ableitbarkeit
Sind z und z' Bearbeitunszustände und R eine Menge von Regeln, so heißt z' genau denn bezüglich R aus z ableitbar, wenn es eine Folge von Bearbeitungszuständen z1, z2, ... , zn gibt, sodass gilt:
z→R z1 →R z2 →R ... →R zn →R z'
Schreibweise:
Hierfür soll im folgenden auch die Kurzschreibweise z →R* z' erlaubt sein.