====== Brillův tagger ======
setenv BRILL /home/zeman/nastroje/taggery/brill/RULE_BASED_TAGGER_V1.14
Potřebujeme trénovací korpus. Ten musí být tokenizovaný, každá věta na samostatném řádku. Každý token má tvar ''slovo/značka''. Zatím nevím, jak se zachází s lomítkem jako slovem.
cd ~/data/pdt/2.0
$PARSINGROOT/tools/csts2brill.pl < trainmm.utf.csts > train.brill
Výsledkem je soubor o 68562 řádcích (větách). Příklad:
Třikrát/Cv------------- rychlejší/AAFS1----2A---- než/J,------------- slovo/NNNS1-----A----
Dále potřebujeme rozdělit trénovací data na 2 části. Z první části se budeme učit značky pro neznámá slova. Ze druhé se budeme učit kontextová pravidla pro náhradu značky u slova lepší značkou.
Pozor, Eric měl Perl v ''/usr/local/bin/perl'', já ho mám na zenu v ''/usr/bin/perl'', takže musím Erikovy Perlové skripty volat jako argumenty perlu, ne jako spustitelné soubory.
cd $BRILL/Bin_and_Data
perl ../Utilities/divide-in-two-rand.prl < ~/data/pdt/2.0/train.brill pdt-train-1.brill pdt-train-2.brill
Dělení korpusu je náhodné, ale se snahou, aby obě části byly přibližně stejně velké. Vyšlo mi 34221 vět v první části a 34341 ve druhé. Vzhledem k tomu, že původní korpus měl kolem miliónu slov, každá část by měla mít kolem 500000 slov.
===== Model neznámých slov =====
Z označkovaného korpusu vyrobíme neoznačkovaný a získáme z něj seznam slov.
cat pdt-train-*.brill | perl ../Utilities/tagged-to-untagged.prl > pdt-train.tok
cat pdt-train.tok | perl ../Utilities/wordlist-make.prl | sort -k2 -rn | awk '{ print $1 }' > pdt.bigwordlist
Zjistíme nejčastější značku pro každé slovo.
cat pdt-train-1.brill | perl ../Utilities/word-tag-count.prl | sort -k3 -rn > pdt.smallwordtaglist
Získáme seznam všech dvojic slov (bigramů).
cat pdt-train.tok | perl ../Utilities/bigram-generate.prl | sort -k3 -rn | awk '{ print $1,$2 }' > pdt.bigbigramlist
Pustíme učení pravidel. Eric hlásí, že na Sparc 10 (někdy v roce 1994) nad anglickými daty (250000 slov z Penn Treebanku) to běželo 3 dny. Nejdříve vlézt do Erikova kódu a změnit práh ze 3 na 8 (Erikovo doporučení pro korpusy o více než 400000 slov):
$THRESHOLD = 8;
Trénování běželo na clusteru 17 dní, ale možná by bylo rychlejší, kdybych změnil algoritmus na přiřazování počáteční značky, viz níže.
**Upozornění:** Chtělo by to ještě změnit (na několika místech, viz README) Erikův algoritmus na přiřazování počáteční značky. Eric zatím přiřazuje značky Penn Treebanku (začíná-li slovo velkým písmenem, je to vlastní jméno (''NNP''), jinak obyčejné podstatné jméno (''NN'')), které na datech z PDT nemohou uspět. Chtělo by to např. veškeré interpunkci dát ''Z:-------------'', všem číslům ''C=-------------'' a všemu ostatnímu třeba ''NNFS1-----A----''.
perl ../Learner_Code/unknown-lexical-learn.prl pdt.bigwordlist pdt.smallwordtaglist pdt.bigbigramlist \
300 pdt.lexruleoutfile
===== Model kontextových pravidel =====
Vytvoříme dva slovníky značek ke slovům. První bude vyroben z poloviny trénovacích dat a bude se používat během trénování pravidel. Druhý bude vyroben ze všech trénovacích dat a bude se používat při ostrém nasazení již natrénovaného taggeru.
cat pdt-train-1.brill | perl ../Utilities/make-restricted-lexicon.prl > pdt.training.lexicon
cat pdt-train-*.brill | perl ../Utilities/make-restricted-lexicon.prl > pdt.final.lexicon
Odznačkujeme si druhou část korpusu a zkusíme ji označkovat počátečním taggerem, to budeme potřebovat při trénování pravidel. Tagger nemůžeme spustit, dokud se nenatrénuje model neznámých slov.
cat pdt-train-2.brill | perl ../Utilities/tagged-to-untagged.prl > pdt-train-2.tok
tagger pdt.training.lexicon pdt-train-2.tok pdt.bigbigramlist pdt.lexruleoutfile /dev/null -w bigwordlist -i pdt.dummy-tagged-corpus > /dev/null
Naučíme se kontextová pravidla.
contextual-rule-learn pdt-train-2.brill pdt.dummy-tagged-corpus pdt.context-rulefile pdt.training.lexicon