tokenizer, putzer, htmlEnt2Char -- drei Tools zur Korpusbearbeitung
===================================================================
tokenizer -- ein Tokenizer mit Satzenderkennung (Optionen siehe "tokenizer -h")
putzer -- entfernt aus dem Text überflüssige Leerzeichen, Trennstriche
(Optionen siehe "putzer -h")
htmlEnt2Char -- konvertiert HTML-Entities in Text (Optionen siehe "htmlEnt2Char -h")
Kompilierung und Installation (siehe auch Datei INSTALL):
./configure
make && make install
Alle drei Tools sind Weiterentwicklungen von Hausaufgaben im Kurs
"Programmentwicklung in C" bei Max Hadersbeck.
Zum "tokenizer":
Ziel war einen Tokenizer mit Satzenderkennung zu schreiben, der
schnell und universell ist, d.h. nicht abhängig von Trainingsdaten,
einer bestimmten Textsorte, aber nicht 100% perfekt.
Derzeit unterstützte Sprachen: Deutsch, Englisch und Russisch,
jeweils in ISO- und Windows-Codepage und UTF-8.
Die Teilprobleme und -aufgaben hier nur kurz skizziert:
1. Anpassung durch Optionen auf bestimmte Texteigenheiten:
- Sprache und Zeichensatz
- Worttrennung
- Bedeutung des Zeilenumbruchs
2. Probleme und Strategien der Tokenisierung:
- Bindestrichwörter: werden als ein Token behandelt
- Worttrennungen über Zeilengrenzen: werden (mit Option -c) konkateniert.
Dabei kommt es zwangsweise zu Fehlern, falls Bindestrichwörter von
der Trennung über die Zeilengrenze betroffen sind. Ausnahmelexika
würden den Tokenizer zu groß machen; die Option -c ist deshalb mit
Vorsicht zu wählen.
3. Satzenderkennung:
- Problem prinzipiell nicht lösbar ohne Lexikon
- Affinität zum Tagging (-> Mikheev "Tagging sentence boundaries")
- Methoden, die Kenntnis des ganzen Textes voraussetzen, nicht praktikabel
- hier wurde ein regulärer Ansatz gewählt, d.h. nur der nächste Kontext
einer möglichen Satzendeinterpunktion wird in Betracht gezogen
- Pfade die Satzendemarkierung enthalten vs.
- Alternativpfade (Datum, Abkürzungen etc.)
- Besondere Sorgfalt in Abkürzungsliste: nur Abkürzungen,
die häufig nicht am Satzende stehen (also nicht "usw.", "etc.")
- Besonderheit im Deutschen: da Nomina großgeschrieben werden, ist es sinnlos
(ohne Lexikon), das auf die Interpunktion folgende großgeschriebene
Wort mit in Betracht zu ziehen (<-> Mikheev "Periods, capitalized words, etc.",
mit Fallunterscheidung ob folgendes Wort Eigenname oder nicht)
- Allerdings sind z.B. ein großgeschriebener Artikel, Konjunktion oder Präposition
ein starkes Indiz für einen Satzanfang. Damit lassen sich Satzenden auch dann
erkennen, wenn der Satzendepunkt gleichzeitig Abkürzungspunkt ist.
4. Die Optionen teilen sich in zwei Gruppen:
- Optionen, die vom Input abhängig sind: -L, -c, -C, -n, -N
Diese sollten sehr sorgfältig gewählt werden
- Optionen, die den Output betreffen: -S, -p, -P, -s, -W, -l, ...
5. Groß/Klein-Konvertierung
- als praktische Ergänzung hinzugefügt, mit Tabelle für jeweilige
Sprache und Zeichensatz
Für das Deutsche ist eine Datei "torture_de_l1.txt" beigefügt, die die
oben besprochenen Probleme enthält.
Tests mit annotierten Korpora (Brown, SZ) haben eine Fehlerrate der Satzenderkennung
von etwa 3% ergeben.
Version history:
0.1 -- package with tokenizer, putzer, htmlEnt2Char
0.2 -- bug reported by js: when input contains long words or many following newlines
tokenizer stops with "input buffer overflow". To avoid this use putzer as
filter with newly introduced option -m!
0.3 -- optimization (inlines & macros): now about 10% faster
0.4 -- corrected some details in German EOS-detection, changed behaviour with option -sx:
When a newline is recognized a space is printed on a separate line,
instead of an empty line.
0.5 -- ':' now not considered as EOS-mark. Additions to German abbreviation list.
0.6 -- Added more German abbreviations, Roman numerals with point.
Added rudimentary support for utf-8 in German.
0.7 -- Better EOS for English, thanks to Michaela Geierhos;
rudimentary support for utf-8 in English
0.8 -- fixed a bug in the Russian part, which makes the tokenizer hanging
0.9 -- changes to German abbreviations
rudimentary support for utf-8 in Russian
0.10 -- fixed bug raising a segfault for German language option
short sequences in parenthesis are excluded from containit an end-of-sentence
additions to German abbreviations
0.11 -- fixed a bug with options -C and -c.
Introduced positive rules for German EOS : i.e. if a capitalized article, conjunction
or prepositions follows an abbreviation or date, there should be an EOS.
0.12 -- better documentation (in English)
Positive rules also for English: The text «The firm said it
plans to sublease its current headquarters at 55 Water St. A
spokesman declined to elaborate.» (Wall Street Journal) is now
correctely splitted into two sentences
1.0 -- (almost) no changes
GPL licensed now