7.3. Tokenisierung
Covingtons Tokenizer in XFST ▸▸▸
define AlphaNumeric [A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|a|b|c|d|e
|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|%0|1|2|3|4|5|6|7|8|9] ;
define WS ["\n"|" "|"\t"] ;
define WORD [ AlphaNumeric + ] ;
define SYMBOL [ \ Alphanumeric ] ;
define TOKEN [ WORD|SYMBOL ] ;
define Downcase [A->a, B->b, C->c, D->d, E->e, F->f, G->g, H->h, I->i, J->j,
K->k, L->l, M->m, N->n, O->o, P->p, Q->q, R->r, S->s, T->t, U->u, V->v, W->w,
X->x, Y->y, Z->z] ;
define NormalizeSpace [ WS+ @-> "\n"] ;
define Tokenizer [
[ TOKEN @-> ... "\n" ]
.o. NormalizeSpace
.o. Downcase ];
Covingtons Tokenizer in XFST mit Funktionssymbolen ▸▸▸
Die neue Version hat eingebaute Listen von Zeichen und Funktionen
# xfst[0]: write definitions
# xfst[0]: print lists
# Dokumentation zu neuen Funktionen
# http://www.stanford.edu/~laurik/.book2software/novelties.pdf
define WS [ [ cntrl | space ]+ ];
define WORD [ alnum + ] ;
define SYMBOL [ \ [WORD|WS] ] ;
define TOKEN [ WORD|SYMBOL ] ;
define Tokenizer [ [ TOKEN @-> ... "\n" ] .o. [ WS @-> "\n" ] ];
define Normalizer DownCase(Tokenizer, L);
# Function zum Downcasen auf Lower-Side
Befehlszeilentool tokenize
Tool tokenize vs. lookup
- Beide Tools lesen Zeichenketten der unteren Sprache ein und berechnen die damit
gepaarten Zeichenketten der oberen Sprache wie bei apply up.
- lookup verarbeitet immer zeilenweise (1 Token pro Zeile).
- lookup berechnet nicht-deterministisch alle
damit gepaarten Zeichenketten der oberen Sprache.
- tokenize liest beliebigen Eingabestrom (Datei, Redirection) und benötigt Transduktoren mit ?*
als untere Sprache.
- tokenize benötigt Transduktoren, welche deterministisch auf die obere Sprache abbilden.
Wie beim Chunker ist bei der Montage obere und untere Sprache noch vertauscht und muss beim
Abspeichern noch invertiert werden.
Schillers Tokenizer mit Abkürzungsbehandlung ▸▸▸
define WS [" "|"\t"|"\n" ];
define SYMBOL [ "\""|"."|","|";"|{’’}|{...} ] ; ! noch mehr
define WORD [ \ [ WS | SYMBOL ] ] + ;
define ABBR [ {A.} | {Mr.} | {Mrs.} | {E.g.} ] ; ! noch mehr
define DIGIT [ "0"|1|2|3|4|5|6|7|8|9 ] ;
define NUMSYMBOL [ "-"|"."|"," ] ;
define NUM [ [ DIGIT + ] / NUMSYMBOL ] ; ! /=Ignoring-Op
define TOKEN [ SYMBOL | WORD | ABBR | NUM ] ;
define Tokenizer [
[ TOKEN @-> ... "\n" ]
.o. [ WS+ @-> "\n" ]];
read regex Tokenizer.i ;
save stack tok2.fst
system echo ’E.g. 120.000 New Yorker live in New York.’| tokenize tok2.fst
Schillers Tokenizer mit naiver Multiword-Behandlung ▸▸▸
source tok2.xfst
define MWT [ {New York} | {Ad hoc} ] ;
define TOKEN [ TOKEN | MWT ] ;
define WS1 [ WS+ & [ $ "\n" ] ] ;
define Tokenizer [
[ TOKEN @-> ... "\n"]
.o. [ WS1 @-> "\n" ]
];
read regex Tokenizer.i ;
save stack tok3.fst
system echo ’E.g. 120.000 New Yorker live in New York.’ | tokenize tok3.fst
Frage
Wo liegt das Problem?
Schillers Tokenizer mit Multiword-Behandlung ▸▸▸
source tok2.xfst
define MWT [ {New York} | {Ad hoc} | {to and fro}] ;
define TOKEN [ TOKEN| " " MWT " "] ; ! WS-Markierung bei MWT
define BOUND [ SYMBOL | WS | .#. ] ;
define WS1 [ WS+ & [ $ "\n" ]] ;
define Tokenizer [
[WS+ @-> " "]
.o. [ MWT @-> " " ... " " || BOUND _ BOUND ]
.o. [TOKEN @-> ... "\n" ]
.o. [ WS1 @-> "\n" ]
] ;
read regex Tokenizer.i ;
save stack tok4.fst
system echo ’E.g. 120.000 New Yorker live in New York.’ | tokenize tok4.fst