[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
user:zeman:joshua [2009/06/03 22:35]
zeman Konfigurační soubor Joshuy.
user:zeman:joshua [2009/07/13 14:47]
zeman Odkaz na dokumentaci Chrise Callisona-Burche.
Line 7: Line 7:
   * http://www.clsp.jhu.edu/wiki2/JosHUa_-_JHU_Open_Source_Architecture - wiki Joshuy na JHU, jenže jak sami říkají, zastaralá   * http://www.clsp.jhu.edu/wiki2/JosHUa_-_JHU_Open_Source_Architecture - wiki Joshuy na JHU, jenže jak sami říkají, zastaralá
   * http://www.clsp.jhu.edu/wiki2/Joshua_Lab - cvičení s Joshuou na JHU, všechno už mají nainstalováno, ale u nich. Nicméně z toho vyplývá, že to pouštějí na clusteru 64bitových strojů (dokonce něco mají zkompilováno pro ně a nepoběží to jinde) se Sun Grid Engine   * http://www.clsp.jhu.edu/wiki2/Joshua_Lab - cvičení s Joshuou na JHU, všechno už mají nainstalováno, ale u nich. Nicméně z toho vyplývá, že to pouštějí na clusteru 64bitových strojů (dokonce něco mají zkompilováno pro ně a nepoběží to jinde) se Sun Grid Engine
-  * http://sourceforge.net/projects/joshua - download (ale viz též níže), jinak toho tu moc není+  * http://joshua.sourceforge.net/ - download, trocha dokumentace (hlavně té automaticky vygenerované, javadoc) 
 +  * http://sourceforge.net/projects/joshua - kupodivu ne totéž jako nahoře. Download (ale viz též níže), jinak toho tu moc není 
 +  * http://cs.jhu.edu/~ccb/joshua/ - step-by-step instructions by Chris Callison-Burch (v budoucnosti se stanou součástí oficiální dokumentace v PDF)
  
 ===== Instalace ===== ===== Instalace =====
Line 26: Line 28:
 <code>cd $JOSHUA <code>cd $JOSHUA
 svn co https://joshua.svn.sourceforge.net/svnroot/joshua/trunk joshua</code> svn co https://joshua.svn.sourceforge.net/svnroot/joshua/trunk joshua</code>
 +
 +Poznámka: Na začátku června 2009 jsem měl problémy se zdrojáky získanými přímo z SVN (třída SuffixArray neobsahovala metodu main()), ale možná to byl jen dočasný výpadek dokumentace, protože šlo o věci, které se vzápětí v nové release verzi dělají jinak. Každopádně mi vždy fungovalo, když jsem si ze
 +
 +http://joshua.sourceforge.net/
 +
 +přešel na link Download a stáhnul si aktuální release verzi.
  
 Přeložit Joshuu: Přeložit Joshuu:
Line 78: Line 86:
 qstat -u '*'</code> qstat -u '*'</code>
  
-===== Použití =====+ 
 +===== Extrakce gramatiky =====
  
 Joshua je nainstalován a funguje. Nyní se musíme naučit, jak ho trénovat a jak ho použít k překladu. Joshua je nainstalován a funguje. Nyní se musíme naučit, jak ho trénovat a jak ho použít k překladu.
Line 85: Line 94:
   * 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 [[Giza++|Gizou++]]. +  * Párování vyrobíme [[Giza++|Gizou++]]. Správný soubor s párováním má stejný počet řádků jako zdrojový a cílový text (co řádek, to věta), ale místo slov má na každém řádku posloupnost dvojic čísel (např. "2-0 2-1 2-2 2-3 1-4"). Čísla vyjadřují, kolikáté slovo zdrojové věty je spárované s kolikátým slovem cílové věty. Ten správný soubor s takovýmto obsahem z Gizy++ obvykle vypadne pod jménem ''model/aligned.grow-diag-final-and'' nebo nějakým podobným.
- +
-Správný soubor s párováním vypadá nějak takhle: +
- +
-<code>2-0 2-1 2-2 2-3 1-4 2-5 14-8 13-10 8-11 9-11 8-12 8-13 8-14 8-15 5-16 7-16 6-17 4-18 15-19 +
-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</code>+
  
 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 je pak ještě třeba seřadit, vyházet duplicitní pravidla a zagzipovat. 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 je pak ještě třeba seřadit, vyházet duplicitní pravidla a zagzipovat.
Line 105: Line 105:
 setenv GRM en-hi.grammar setenv GRM en-hi.grammar
 head -1 $SRC > $TST 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+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 sort -u $GRM.unsorted > $GRM
 gzip $GRM</code> gzip $GRM</code>
Line 115: Line 117:
 Binarizovat zdrojovou část korpusu. Binarizovat zdrojovou část korpusu.
  
-<code>java -cp bin joshua.corpus.suffix_array.SuffixArray $WORK/corpus/train.clean.en $WORK/model/vocab.en.bin $WORK/model/corpus.en.bin $WORK/model/suffixes.en.bin</code>+<code>java -cp $JOSHUA/bin joshua.corpus.suffix_array.SuffixArray 
 +    $WORK/corpus/train.clean.en 
 +    $WORK/model/vocab.en.bin 
 +    $WORK/model/corpus.en.bin 
 +    $WORK/model/suffixes.en.bin 
 +java -cp $JOSHUA/bin joshua.corpus.suffix_array.SuffixArray \ 
 +    $WORK/corpus/train.clean.hi \ 
 +    $WORK/model/vocab.hi.bin \ 
 +    $WORK/model/corpus.hi.bin \ 
 +    $WORK/model/suffixes.hi.bin 
 +java -cp $JOSHUA/bin joshua.corpus.alignment.AlignmentGrids \ 
 +    $WORK/model/aligned.grow-diag-final-and \ 
 +    $WORK/model/alignments.bin</code>
  
 Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu: Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu:
  
-<code bash>java -Xmx2000m -Xms2000m -cp $JOSHUA/bin joshua.prefix_tree.ExtractRules --binary-source=true --binary-target=true --source=model/corpus.en.bin --target=model/corpus.hi.bin --source-vocab=model/vocab.en.bin --target-vocab=model/vocab.hi.bin --source-suffixes=model/suffixes.en.bin --target-suffixes=model/suffixes.hi.bin --alignmentsType=MemoryMappedAlignmentGrids --alignments=model/alignments.bin --test=corpus/test.lowercased.en --output=model/en-hi.grammar.unsorted --maxPhraseLength=5</code>+<code>java -Xmx2000m -Xms2000m -cp $JOSHUA/bin joshua.prefix_tree.ExtractRules 
 +    --binary-source=true --binary-target=true 
 +    --source=model/corpus.en.bin --target=model/corpus.hi.bin 
 +    --source-vocab=model/vocab.en.bin --target-vocab=model/vocab.hi.bin 
 +    --source-suffixes=model/suffixes.en.bin --target-suffixes=model/suffixes.hi.bin 
 +    --alignmentsType=MemoryMappedAlignmentGrids --alignments=model/alignments.bin 
 +    --test=corpus/test.lowercased.en 
 +    --output=model/en-hi.grammar.unsorted 
 +    --maxPhraseLength=5</code>
  
 ===== Decoding ===== ===== Decoding =====
Line 196: Line 218:
 #wordpenalty weight #wordpenalty weight
 wordpenalty -2.844814</code> wordpenalty -2.844814</code>
 +
 +No a nakonec příkaz, kterým pustíme Joshuu s naším konfiguračním souborem (na clusteru):
 +
 +<code>qsub.csh \
 +    "java -Xmx1200m -Xms1200m -cp $JOSHUA/bin joshua.decoder.JoshuaDecoder \
 +     ~zeman/projekty/hindstina/joshua-config-tides-dev.txt \
 +     $HINDI/corpus/dev.lowercased.en \
 +     $HINDI/dev.nbest.out"</code>
 +
 +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:
 +
 +<code>$JOSHUA/example2/get_1best_from_Nbest.pl $HINDI/output/dev.nbest.out $HINDI/output/dev.1best.out</code>
 +
 +===== 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ů:
 +
 +<code>java -cp $JOSHUA/bin joshua.util.JoshuaEval</code>
 +
 +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:
 +
 +<code>java -cp $JOSHUA/bin joshua.util.JoshuaEval \
 +    -cand $HINDI/output/dev.1best.out \
 +    -ref $HINDI/corpus/dev.lowercased.hi</code>
 +
 +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:
 +
 +<code>java -cp $JOSHUA/bin joshua.zmert.ZMERT -h</code>
 +
 +Příklad použití Z-MERTu najdeme ve složce ''$JOSHUA/ZMERT_example''. Můžeme si zkopírovat a upravit tamější konfigurační soubor ''ZMERT_config_ex2.txt''. Některé numerické parametry (počáteční váhy například) jsou v samostatném souboru ''params.txt'', který si také musíme zkopírovat. Pro jistotu si také uděláme kopii vývojových dat.
 +
 +Dále potřebujeme soubor (vlastně skript: měl by být spustitelný), ve kterém bude napsáno, jak volat dekodér. A, samozřejmě, také soubor s konfigurací dekodéru.
 +
 +<code>cd $HINDI/mert
 +cp ../corpus/dev.lowercased.en src.txt
 +cp ../corpus/dev.lowercased.hi ref.txt
 +cp $JOSHUA/ZMERT_example/config_ex2.txt decoder-config.txt
 +vi decoder-config</code>
 +
 +Změněné parametry:
 +
 +<code>lm_file=/net/work/people/zeman/hindstina/lm/train.lowercased.hi.lm
 +tm_file=/net/work/people/zeman/hindstina/model/en-hi-dev.grammar.gz
 +glue_file=/net/work/people/zeman/joshua/grammars/hiero.glue
 +order=3</code>
 +
 +<code>cp $JOSHUA/ZMERT_example/decoder_command_ex2 decoder_command
 +chmod 755 decoder_command
 +vi decoder_command</code>
 +
 +Ve volání dekodéru musíme změnit cesty ke konfiguračnímu, zdrojovému a cílovému souboru.
 +
 +<code>java -Xmx1200m -Xms1200m -cp $JOSHUA/bin joshua.decoder.JoshuaDecoder \
 +    $HINDI/mert/decoder-config.txt \
 +    $HINDI/mert/src.txt \
 +    $HINDI/mert/nbest.txt</code>
 +
 +V konfiguraci Z-MERTu zohledníme právě upravené volání a konfiguraci dekodéru.
 +
 +<code>cp $JOSHUA/ZMERT_example/params.txt .
 +cp $JOSHUA/ZMERT_example/ZMERT_config_ex2.txt zmert-config.txt
 +vi zmert-config.txt</code>
 +
 +Změněné parametry:
 +
 +<code>-dir /net/work/people/zeman/hindstina/mert # working directory
 +-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 ./decoder_command # file containing commands to run decoder
 +-decOut nbest.txt # file produced by decoder
 +-dcfg decoder-config.txt # decoder config file</code>
 +
 +No a teď už můžeme spustit Z-MERT (případně to celé dát do uvozovek a před to ''~zeman/bin/qsub.csh''):
 +
 +<code>java -cp $JOSHUA/bin joshua.zmert.ZMERT -maxMem 500 \
 +    $HINDI/mert/zmert-config.txt \
 +    > $HINDI/mert/zmert.out</code>

[ Back to the navigation ] [ Back to the content ]