Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
user:zeman:joshua [2009/06/02 10:41] zeman Data. |
user:zeman:joshua [2009/06/04 11:25] zeman Oprava nedorozumění ohledně ref.txt. |
||
---|---|---|---|
Line 7: | Line 7: | ||
* http:// | * http:// | ||
* http:// | * http:// | ||
- | * http:// | + | |
+ | | ||
===== Instalace ===== | ===== Instalace ===== | ||
Line 20: | Line 21: | ||
< | < | ||
setenv SRILM / | setenv SRILM / | ||
- | setenv | + | setenv |
Stáhnout aktuální verzi Joshuy: | Stáhnout aktuální verzi Joshuy: | ||
- | < | + | < |
svn co https:// | svn co https:// | ||
Přeložit Joshuu: | Přeložit Joshuu: | ||
- | < | + | < |
ant compile</ | ant compile</ | ||
Line 74: | Line 75: | ||
< | < | ||
ssh lrc-two | ssh lrc-two | ||
- | cd $JOSHUA_HOME | + | cd $JOSHUA |
~bojar/ | ~bojar/ | ||
qstat -u ' | qstat -u ' | ||
- | |||
===== Použití ===== | ===== Použití ===== | ||
Line 86: | Line 86: | ||
* Tokenizovaný a segmentovaný text ve zdrojovém jazyce (en). | * Tokenizovaný a segmentovaný text ve zdrojovém jazyce (en). | ||
* Tokenizovaný a segmentovaný text v cílovém jazyce (hi). | * Tokenizovaný a segmentovaný text v cílovém jazyce (hi). | ||
- | * Párování vyrobíme Gizou++. | + | * Párování vyrobíme |
+ | |||
+ | Správný soubor s párováním vypadá nějak takhle: | ||
+ | |||
+ | < | ||
+ | 0-3 7-4 8-5 9-6 10-7 11-8 12-9 13-10 14-11 15-12 16-13 4-15 2-17 3-18 20-19 18-21 21-22 22-23 22-24 22-25 19-26 23-27 | ||
+ | 0-0 1-1 2-1 3-2 4-4 5-5 7-9 8-16 9-17 10-17 12-17 13-17 14-17 15-17 17-17 18-17 11-18 18-19 18-20 19-21 | ||
+ | 1-0 4-2 6-4 7-5 7-6 5-7 7-7 6-8 8-9 7-10 8-11 8-12 8-13 11-14 12-17 | ||
+ | 0-0 1-1 2-1 3-1 7-2 8-3 9-4 6-5 11-6 11-7 12-10 13-11 14-12 15-13 16-14 22-15 23-15 21-16 26-17 17-20 28-22 29-23 27-26 25-28 30-29 31-30 32-30 33-30 33-31 33 | ||
+ | -32 34-33</ | ||
+ | |||
+ | A takhle pustíme Joshuu, aby z trénovacích dat extrahoval gramatiku. Joshua z nějakého důvodu vyžaduje také testovací soubor se zdrojovým jazykem. Soudě podle příkladu, který dodali, stačí zkopírovat první větu ze zdrojových trénovacích dat. Gramatiku | ||
+ | |||
+ | < | ||
+ | setenv SRC corpus/ | ||
+ | setenv TGT corpus/ | ||
+ | setenv ALI model/ | ||
+ | setenv TST corpus/ | ||
+ | setenv GRM en-hi.grammar | ||
+ | head -1 $SRC > $TST | ||
+ | java -cp $JOSHUA/bin joshua.prefix_tree.ExtractRules --source=$SRC --target=$TGT --alignments=$ALI --test=$TST --output=$GRM.unsorted --maxPhraseLength=5 | ||
+ | sort -u $GRM.unsorted > $GRM | ||
+ | gzip $GRM</ | ||
+ | |||
+ | V příkladu v INSTALL.txt měli navíc ještě volbu '' | ||
+ | |||
+ | Pozor, je poměrně snadné vyčerpat paměť. Tomu se dá čelit jednak tím, že se přesuneme na stroj, který má více paměti, jednak že zvolíme postup, který je složitější, | ||
+ | |||
+ | Binarizovat zdrojovou část korpusu. | ||
+ | |||
+ | < | ||
+ | |||
+ | Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu: | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | |||
+ | ===== Decoding ===== | ||
+ | |||
+ | Jakmile máme gramatiku (tj. překladový model), můžeme dekódovat neboli překládat. Bývá sice zvykem ještě nejdříve vyladit váhy jednotlivých komponent pomocí MERTu, ale MERT sám už dekódování používá a teoreticky se můžeme spokojit s dekódováním pomocí odhadnutých, | ||
+ | |||
+ | Parametry dekódování se zadávají prostřednictvím konfiguračního souboru. Vytvoříme si ho třeba tak, že zkopírujeme a upravíme konfigurační soubor, který byl přibalen k Joshuovi v jednom z příkladů (example2). Konfigurační soubor obsahuje následující parametry: | ||
+ | |||
+ | Cesta k souboru s jazykovým modelem. Zatím předpokládám, | ||
+ | |||
+ | < | ||
+ | |||
+ | Cesta k souboru s překladovým modelem, tedy s gramatikou vyextrahovanou pro daný testovací soubor. Formát má být stejný, jako produkuje Hiero. Předpokládám, | ||
+ | |||
+ | < | ||
+ | tm_format=hiero</ | ||
+ | |||
+ | Jakýsi spojovací soubor, glue_file. Vůbec nevím, co to je. Joshua ale jeden obsahuje a vypadá dost obecně, takže možná nezávisí na konkrétních trénovacích datech. | ||
+ | |||
+ | < | ||
+ | glue_format=hiero</ | ||
+ | |||
+ | Konfigurace jazykového modelu. Kopíruju ji z example2, akorát měním order na 3, protože jsem trénoval trigramy, nikoli čtyřgramy. | ||
+ | |||
+ | < | ||
+ | use_srilm=false | ||
+ | lm_ceiling_cost=100 | ||
+ | use_left_euqivalent_state=false | ||
+ | use_right_euqivalent_state=false | ||
+ | order=3</ | ||
+ | |||
+ | Konfigurace překladového modelu. Kopíruju ji z example2, aniž bych tušil, co znamená. | ||
+ | |||
+ | < | ||
+ | span_limit=10 | ||
+ | phrase_owner=pt | ||
+ | mono_owner=mono | ||
+ | begin_mono_owner=begin_mono | ||
+ | default_non_terminal=X | ||
+ | |||
+ | #pruning config | ||
+ | fuzz1=0.1 | ||
+ | fuzz2=0.1 | ||
+ | max_n_items=30 | ||
+ | relative_threshold=10.0 | ||
+ | max_n_rules=50 | ||
+ | rule_relative_threshold=10.0</ | ||
+ | |||
+ | Konfigurace N-best listu (dekodér vrací N překladových hypotéz, které se mu jeví jako nejlepší, seřazených podle skóre, které jim přiřadil). Pro MERT potřebujeme N nejlepších hypotéz, abychom mohli každou z nich porovnat s referenčními překlady, spočítat BLEU skóre a případně upravit váhy, pokud má nejlepší BLEU skóre hypotéza, která se celkovým skóre nedostala | ||
+ | |||
+ | < | ||
+ | use_unique_nbest=true | ||
+ | use_tree_nbest=false | ||
+ | add_combined_cost=true | ||
+ | top_n=300</ | ||
+ | |||
+ | Další sekce se týkají vzdáleného serveru pro jazykové modelování a paralelního dekodéru. Tyto sekce vynechávám, | ||
+ | |||
+ | Následují váhy jednotlivých komponent (" | ||
+ | |||
+ | < | ||
+ | #lm order weight | ||
+ | lm 1.000000 | ||
+ | |||
+ | # | ||
+ | phrasemodel pt 0 1.066893 | ||
+ | phrasemodel pt 1 0.752247 | ||
+ | phrasemodel pt 2 0.589793 | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # | ||
+ | |||
+ | # | ||
+ | wordpenalty -2.844814</ | ||
+ | |||
+ | No a nakonec příkaz, kterým pustíme Joshuu s naším konfiguračním souborem (na clusteru): | ||
+ | |||
+ | < | ||
+ | "java -Xmx1200m -Xms1200m -cp $JOSHUA/bin joshua.decoder.JoshuaDecoder \ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | I když si v konfiguračním souboru řekneme, že chceme N-best výstup pro N=1, dostaneme ho ve formátu, který je připraven na více hypotéz (každý překlad např. obsahuje skóre a váhy). Abychom z toho dostali obyčejný 1-best překlad, můžeme použít Zhifeiův skript, který je k Joshuovi přibalen ve složce example2: | ||
+ | |||
+ | < | ||
+ | |||
+ | ===== Vyhodnocení úspěšnosti ===== | ||
+ | |||
+ | 1-best výstup Joshuy a referenční překlad bychom mohli převést do příslušného XML formátu a pustit na ně oficiální externí perlový skript, který počítá BLEU skóre. Pro výsledná čísla do článku bychom to tak také měli udělat. | ||
+ | |||
+ | Jinak ale Joshua obsahuje svůj vlastní kód pro vyhodnocování. Přehled parametrů jeho volání se dozvíme, když ho zavoláme bez argumentů: | ||
+ | |||
+ | < | ||
+ | |||
+ | S využitím většiny defaultů stačí dodat jméno vyhodnocovaného souboru a jméno souboru s referenčním překladem: | ||
+ | |||
+ | < | ||
+ | -cand $HINDI/ | ||
+ | -ref $HINDI/ | ||
+ | |||
+ | Bez MERTu mi zatím vyšlo BLEU = 0.0807. | ||
+ | |||
+ | ===== MERT ===== | ||
+ | |||
+ | Celý proces by nebyl úplný bez MERTu, což je zkratka za Minimum Error Rate Training. V principu jde o to, že se dekodér opakovaně pouští na vývojová data a na základě změřené úspěšnosti se postupně optimalizují váhy překladového modelu, jazykového modelu a případně dalších složek. V Joshuovi je pro tento účel integrován javovský nástroj Z-MERT. | ||
+ | |||
+ | Většina parametrů se Z-MERTu předává prostřednictvím konfiguračního souboru. Přehled volání Z-MERTu se dozvíme takto: | ||
+ | |||
+ | < | ||
+ | |||
+ | Příklad použití Z-MERTu najdeme ve složce '' | ||
+ | |||
+ | Dále potřebujeme soubor (vlastně skript: měl by být spustitelný), | ||
+ | |||
+ | < | ||
+ | cp ../ | ||
+ | cp ../ | ||
+ | cp $JOSHUA/ | ||
+ | vi decoder-config</ | ||
+ | |||
+ | Změněné parametry: | ||
+ | |||
+ | < | ||
+ | tm_file=/ | ||
+ | glue_file=/ | ||
+ | order=3</ | ||
+ | |||
+ | < | ||
+ | chmod 755 decoder_command | ||
+ | vi decoder_command</ | ||
+ | |||
+ | Ve volání dekodéru musíme změnit cesty ke konfiguračnímu, | ||
+ | |||
+ | < | ||
+ | $HINDI/ | ||
+ | $HINDI/ | ||
+ | $HINDI/ | ||
+ | |||
+ | V konfiguraci Z-MERTu zohledníme právě upravené volání a konfiguraci dekodéru. | ||
+ | |||
+ | < | ||
+ | cp $JOSHUA/ | ||
+ | vi zmert-config.txt</ | ||
+ | |||
+ | Změněné parametry: | ||
+ | |||
+ | < | ||
+ | -s src.txt # source sentences file name | ||
+ | -r ref.txt # target sentences file name | ||
+ | -rps 1 # references per sentence | ||
+ | -maxIt 5 # maximum MERT iterations | ||
+ | -cmd ./ | ||
+ | -decOut nbest.txt # file produced by decoder | ||
+ | -dcfg decoder-config.txt # decoder config file</ | ||
+ | |||
+ | No a teď už můžeme spustit Z-MERT (případně to celé dát do uvozovek a před to '' | ||
+ | < | ||
+ | $HINDI/ | ||
+ | > $HINDI/ |