Příprava paralelního korpusu
Toto je přehled některých kroků, které bývá potřeba udělat s paralelním korpusem, než ho předhodíme Mosesovi, Joshuovi či jinému překladači.
Typicky potřebujeme
- Jednojazyčná trénovací data pro jazykový model cílového jazyka (bývají obrovská)
- Paralelní trénovací data (největší paralelní část, odsud se budeme učit překladový model)
- Paralelní vývojová data (tak 1000 vět pro vyladění vah MERTem)
- Paralelní testovací data (taky tak 1000 vět; v ideálním případě až 4 nezávislé referenční překlady téhož zdroje; často je však k dispozici pouze jeden překlad)
U některých kroků je důležité, aby byly aplikovány na všechny části dat stejně. To se týká zejména tokenizace, která by měla proběhnout podle jednotných pravidel. Zjednodušující úpravy jako lowercasing potřebujeme aplikovat jak na trénovací data, tak na vstupní, tj. zdrojovou polovinu testovacích dat. S cílovou polovinou testovacích dat (referenčním překladem) to sice můžeme udělat ze zvědavosti v pracovní verzi, ale při konečném vyhodnocení bychom neměli porovnávat lowercase výstup překladače s lowercasovaným referenčním překladem, nýbrž pomocí jazykového modelu či jiného nástroje domyslet velká písmena ve výstupu překladače a takto upravený výstup porovnat s originálním, nijak nezprzněným referenčním překladem.
Pro přípravu dat potřebujeme některé skripty, které jsou přibalené např. k Mosesovi, nebo je můžeme nahradit svými vlastními:
- Tokenizace trénovacích dat (zdrojový i cílový jazyk)
- “Lowercasing”, tedy nahrazení velkých písmen v textu malými
- Odstranění dlouhých vět (např. delších než 40 tokenů). Není to nezbytné, a pokud máme málo dat, možná ani žádoucí, ale Gize trvá neúměrně dlouho, když má pracovat s dlouhými větami. Pozor, pokud je věta dlouhá jen v jednom z jazyků, musíme ji samozřejmě odstranit nebo ponechat v obou.
Následující příklady jsou přímo z práce s hindštinou (TIDES). Převádění velkých písmen na malá by pravděpodobně stačilo provést pro angličtinu (hindština velká a malá písmena nerozlišuje), ale takhle si alespoň budeme jisti, že neuniknou případná anglická slova vložená v hindštině, a taky že se oba soubory budou jmenovat analogicky. A pozor, kdybychom hindská data neměli v UTF-8, ale v té jejich “WX” romanizaci, nesmíme lowercasing vůbec provádět, protože velká latinská písmena se tam používají pro úplně jiné znaky než odpovídající malá!
setenv MOSES /net/work/people/zeman/moses cd /net/work/people/zeman/hindstina/corpus cp $DATA/para/hi/icon/train.tok train.tok.hi cp $DATA/para/en/icon/train.tok train.tok.en $MOSES/tools/scripts/lowercase.perl < train.tok.en > train.lowercased.en $MOSES/tools/scripts/lowercase.perl < train.tok.hi > train.lowercased.hi
setenv MOSES /net/work/people/zeman/moses cd /net/work/people/zeman/hindstina/corpus cp $DATA/para/hi/icon/dev.tok dev.tok.hi cp $DATA/para/en/icon/dev.tok dev.tok.en $MOSES/tools/scripts/lowercase.perl < dev.tok.en > dev.lowercased.en $MOSES/tools/scripts/lowercase.perl < dev.tok.hi > dev.lowercased.hi
setenv MOSES /net/work/people/zeman/moses cd /net/work/people/zeman/hindstina/corpus cp $DATA/para/hi/icon/test.tok test.tok.hi cp $DATA/para/en/icon/test.tok test.tok.en $MOSES/tools/scripts/lowercase.perl < test.tok.en > test.lowercased.en $MOSES/tools/scripts/lowercase.perl < test.tok.hi > test.lowercased.hi
Zvláštní. Diff se tváří, že hindská data se lowercasingem opravdu změnila, a změněných řádků není málo. Většinou obsahují latinské písmeno “Z”. Co je to za šum? Z 50000 vět je asi 2000 takových rozdílů.
K tomu Gauravův komentář: Tam, kde se vyskytne celá posloupnost latinských znaků (opravdu asi stačí 2 a více za sebou), jde o nějakou divnou, často pro normálního Hinda nečitelnou romanizaci, kterou někdo nezkonvertoval zpátky. Tohle bude nejlepší prostě vyhodit. Pak se také občas objevuje samotné písmeno, přilepené nebo vložené do slova v dévanágarí. Viděli jsme Z, L a Q, ale mohou být i další. Je možné, že jsou to také nezkonvertované znaky. Z jsme viděli většinou na kraji slova, mohla by to být nějaká interpunkce. Q jsme viděli uprostřed slova a Gaurava nenapadá, co by to mohlo být - prostým vymazáním prý vznikne správné slovo. L jsme viděli taky uprostřed slova a u něj bylo možné vysledovat nějaký význam. Nepochopil jsem přesně jaký, ale to, co mi Gaurav namaloval, vypadalo na samohlásku “i” (krátké, tj. namalované doleva před souhlásku, která v textu předcházela tomu L). Bohužel jsem ale viděl L i samotné na konci věty (místo dandy?), taky 2 za sebou, taky jsem nově viděl Y a H.
Další krok je čištění korpusu od vět delších než 40 tokenů. Zatím k tomu použiju skript, který se mi kdysi vygeneroval u Mosese v rámci nějakého časovaného pokusu:
$MOSES/tools/moses-scripts/scripts-20090128-1534/training/clean-corpus-n.perl train.lowercased en hi train.clean 1 40
Ohlásilo to, že z 50000 vět zbylo 42737.