Update planung authored by Lena Schiffer's avatar Lena Schiffer
......@@ -93,3 +93,143 @@ Folgen für uns:
1. Zeichen-ngram-Sprachmodell mit OpenGrm
1. Lazy Composition testen (OpenFST-Implementierung in C++)
1. Vergleich der Laufzeit mit WWMOCR
### 25. Mai 2018 (mit Maciej)
#### Verwendung von Morle
Man legt ein neues Verzeichnis an, in dem die Daten angelegt werden und in
dem man morle ausführt.
Trainingsdaten werden in `input.training` abgelegt (entweder
Verktordarstellungen von Wörtern oder Paare von Lemma+Wortform mit
optionalen Tags).
**`morle preprocess`**
Beim ersten Starten wird `config.ini` angelegt.
wichtige Optionen:
- `root_feature_model = rnn` (oder none)
- `edge_feature_model = neural` (oder none)
- Anzahl Iterationen
- Parallelisierung
- Anzahl Regeln
- Größe des Embeddings
Erzeugte Dateien:
- `graph.txt` - aus Eingabe ermittelte Paare + Regeln (ungerichteter Graph,
kann zyklisch sein)
- `rules.txt` - auf wie viele Wörter ist die Regel anwendbar? (wie viele Wörter
können aus der Eingabe mit der Regel generiert werden?)
**`morle fit`**
Sampling von Spannbäumen, wodurch Wahrscheinlichkeiten für Regeln berechnet
werden
Erzeugte binäre Dateien:
- `edge.model`
- `root.model`
**`morle compile`**
erzeugt FST (`rules.fsm`)
Lege `input.analyze` an als Liste von Wörtern, die man analysieren will.
**`morle analyze`**
Wenn die RNN-Option verwendet wird, wird auch ein Vektor für jedes
analysierte Wort ausgegeben.
Der Regel-FST ist azyklisch. Seine Komposition mit einem Lexikon
entspricht einer einzigen Regelanwendung.
Eine Komposition des Regel-FSTs mit sich selbst entsprich einer doppelten
Anwendung von Regeln.
Da wir bei der Nachkorrektur aufpassen müssen, dass wir nicht
übergenerieren, ist es wichtig, dass wir die Regeln gut selektieren. Das
heißt, dass wir vielleicht nur die häufigsten Regeln behalten möchten.
Bei der Komposition ist das Fehlermodell für die Performance am
kritischsten. Es kann sinnvoll sein, nur die Alternativen der OCR-Ausgabe
zu verwenden, falls diese ausreichend gegeben werden.
#### Fragen
Folgende Fragen wollten wir besprechen:
1 Im Repo asse/wwmocr/ gibt es das Unterverzeichnis fst/ -- was sind das
jeweils für Modelle (d.h. in welcher Beziehung stehen sie zu Deiner
OCR-Präsentation von 2016, und wie wurden sie erzeugt)?
- Die Asse-Nachkorrektur mit wwmocr ist unfertig und funktioniert nicht so
gut. Daran sollten wir uns nicht orientieren.
2 Wie erzeugt man allgemein aus einem morphologischen Modell von Dir
(Lexikon+Regeln) ein Akzeptor-FSM? Geht das direkt mit Morle? (Wo wird
das implementiert, vielleicht in algorithms/fst.py?)
- Man nutzt `morle compile` (wie oben beschrieben).
3 Weißt Du einen einfachen Weg, wie wir jetzt schon Komposition
provisorisch hinzufügen können? Vielleicht ließe sich der exportierte
FSM durch zusätzliche (zyklische) Übergänge manipulieren? (Die
entsprechenden Gewichte könnten aus einem empirisch zu lernenden
Parameter gelernt werden.) Oder müssen wir Komposita extern/vorher mit
einem anderen Modell segmentieren? Warum wurden Komposita in Deiner
OCR-Präsentation von 2016 erwähnt? (War es in der damaligen
Implementierung enthalten?)
- Komposition lässt sich relativ einfach ins FST-Modell einbauen, indem
eine Komposition (Lexikon)(Fugenautomat)(Lexikon) mit dem (Lexikon)
disjunkt vereinigt wird. Der Fugenautomat kann Beispielsweise Fugen-s
etc. enthalten. Man muss vielleicht noch darauf achten, dass das Lexikon
sowas wie Verbstämme enthält, da diese bei Komposition als Präfix
verwendet werden und nicht der Infinitiv.
4 In Deiner OCR-Präsentation von 2016 berichtest Du ja, daß das
Fehlermodell sehr rechenaufwendig ist. Stimmt es, daß dort für einzelne
Wörter für eine Art Beamsearch bei der FST-Komposition aus
Eingabe+Fehler+Lexikon+Lexikonerweiterung Rechenzeiten herauskamen von
bis zu ~1s mit dem WWM-Fehlermodell / ~10s mit ST-1 / >~20s mit ST?
(Oder trafen obige Einschränkungen nicht zu?)
5 Welche Art von Beamsearch ist das? (Wo ist sie implementiert,
vielleicht in src/search.py?) Liegt das FST in einem besonderen Format
mit vorberechneten kürzesten Teilpfad-Kosten vor?
- Ist unklar. An wwmocr sollen wir uns nicht orientieren, da unfertig.
6 Wie müssen die Daten aussehen, mit denen Morle semi-überwacht
trainiert werden soll? Gibt es irgendwo Beispiele oder Skripte?
- Diese Daten werden in `input.training` abgelegt. Dabei sind Lemma und
Wortform (in dieser Reihenfolge) durch ein Tab getrennt. Falls ein Wort
selbst ein Lemma ist, wird die erste Spalte leer gelassen. Optionale
POS-Tag werden jeweils in spitzen Klammern eingefasst an die Worte
angefügt.
7 Ist die Konfidenz bei der Lexikonerweiterung ein gutes Maß für die
Precision? Können wir hohes Recall bekommen, also lieber zuviele als
zuwenige Kandidaten erzeugen?
8 Wie hast Du Dein RNN-LM trainiert (Skripte / Korpus)?
- Als Daten wurde ein Wikipedia-Korpus benutzt. Das dazugehörige Skript
haben wir per Mail erhalten. Mit den Funktionen `log_prob` und `perplexity`
kann man ein trainiertes Modell anwenden. Im Git liegt das Skript unter
sumalvico/langmod.
9 Kann uns Morle dabei helfen, auch gute stetige
Vektorraum-Repräsentationen (etwa SkipGram/word2vec) für "unbekannte"
Wortformen zu bekommen? Wäre es zu diesem Zwecke auch möglich, einen
Morph-Segmentierer abzuleiten?
- Das kann Morle mit `morle analyze`, falls die RNN-Option gesetzt wurde (in
ein paar Wochen verfügbar, funktioniert momentan nicht).