[ 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/01 21:10]
zeman Cesta k SRILM.
user:zeman:joshua [2009/06/04 11:19]
zeman Příprava spuštění Z-MERTu.
Line 1: Line 1:
 ====== Joshua ====== ====== Joshua ======
  
-Toto jsou Danovy poznámky k práci s hierarchickým překladovým dekodérem Joshuou (reimplementace Hiera (David Chiang) v Javě od lidí z JHU).+Toto jsou Danovy poznámky k práci s hierarchickým překladovým dekodérem Joshuou (reimplementace Hiera (David Chiang) v Javě od lidí z JHU (Zhifei Li)).
  
 Zdroje informací: Zdroje informací:
   * Soubory ''INSTALL'' a ''README'' přímo v balíčku s Joshuou.   * Soubory ''INSTALL'' a ''README'' přímo v balíčku s Joshuou.
 +  * 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://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í
  
-===== Instalace SRILM =====+===== Instalace =====
  
-SRILM je nástroj pro jazykové modelováníse kterým pracují mnohé ekladače včetně Mosese a Joshuy. Je napsaný v céčkuZpůsob, jak ho získat a přeložit, je popsaný tutoriálu k Mosesovi(Ten není na webu normálně vidětale jeden odkaz na něj vede např. z Trac wiki Gaurav.Stručně zde opakuji:+Prerekvizity: 
 +  * Ant: kompilátor a make Javy. Máme ho v ''/usr/bin/ant'' 
 +  * Swig: nástroj na propojení kódu napsaného v různých jazycíchv tomto ípadě Joshuy (Java) na SRILM (céčko)Máme ho v ''/usr/bin/swig'' 
 +  * [[SRILM]]: nástroj Andrease Stolckeho na trénování používání jazykových modelů, běžně používaný se strojovými ekladačijako je Pharaoh, Hiero, Moses, Joshua. Máme nainstalováno nejspíš mnohokrát, podstatě si každý instaluje svou kopiiPodrobnosti o instalaci viz odkaz na začátku tohoto bodu. Pozoraby instalace fungovala na stroji (architektuře), na kterém chceme překládat (podrobnosti viz tamtéž).
  
-Získat balík se SRILM lze zde: http://www.speech.sri.com/projects/srilm/download.html+Nastavit důležité proměnné (to by se hodilo přidat do ''.cshrc'' nebo nějakého podobného konfiguračního souboru).
  
-Stažený balík srilm.tgz má asi 49 MB<nowiki>!</nowikiPozor, rozbaluje se do aktuální složky, takže před rozbalováním vytvořit složku srilm a vlézt do ní.+<code>setenv JAVA_HOME /opt/jdk1.6 
 +setenv SRILM /home/zeman/nastroje/srilm 
 +setenv JOSHUA /net/work/people/zeman/joshua</code>
  
-<code>mkdir srilm +Stáhnout aktuální verzi Joshuy:
-cd srilm +
-unzip.pl ../srilm.tgz</code>+
  
-nebo+<code>cd $JOSHUA 
 +svn co https://joshua.svn.sourceforge.net/svnroot/joshua/trunk joshua</code>
  
-<code>tar -xzvf ../srilm.tgz</code>+Přeložit Joshuu:
  
-Přečíst si soubor README, je tam mnoho tipů. Upravit Makefile, aby obsahoval cestu do mé složky.+<code>cd $JOSHUA 
 +ant compile</code>
  
-<code>chmod +w Makefile +Kdyby bylo potřeba v budoucnosti překompilovat Joshuu načisto, již zkompilované moduly se dají odstranit pomocí
-vi Makefile</code>+
  
-diff:+<code>ant clean</code>
  
-<code>7c7 +Otestujeme, že je Joshua funkční:
-< # SRILM = /home/speech/stolcke/project/srilm/devel +
---- +
-> SRILM = /home/zeman/nastroje/srilm</code>+
  
-Není tam popsaný akorát tento zádrhel: z neznámých důvodů SRILM očekává grafickou knihovnu TCLPokud tato knihovna není k dispozici, musíme mu říct, že se na ni má vykašlatK tomu je potřeba ve složce SRILM vlézt do common, najít dílčí Makefile pro naši architekturu (lze zjistit pomocí ''$SRILM/sbin/machine-type''), otevřít ho v nějakém editoru a upravit 3 řádky: zakomentovat 2 začínající na TCL a zajistit, že je tam ten třetí (NO_TCL):+<code>ant test 
 +./example/decode_example_javalm.sh 
 +./example/decode_example_srilm.sh</code>
  
-<code># Tcl support (standard in Linux) +Joshuu jsem překládal na zenu. Teď je ještě potřeba otestovat, že funguje i na clusteru, třeba na počítači sol1. A ejhle, na 64 bitech přestala fungovat spolupráce se SRILM.
-# TCL_INCLUDE = +
-# TCL_LIBRARY = -ltcl +
-NO_TCL = x</code>+
  
-Nyní jsme připraveni přeložit SRILMPokud nejsme v kořenové složce ''srilm''vrátíme se do ní spustíme:+<code>21:35 sol1:/ha/work/people/zeman/joshua> ./example/decode_example_srilm.sh 
 +Jun 12009 9:35:43 PM joshua.decoder.JoshuaConfiguration readConfigFile 
 +INFO: you use LM feature function, so make sure you have a LM grammar 
 +Exception in thread "main" java.lang.UnsatisfiedLinkError: /ha/work/people/zeman/joshua/lib/libsrilm.so: /ha/work/people/zeman/joshua/lib/libsrilm.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch) 
 +        at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
 +        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1767) 
 +        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1692) 
 +        at java.lang.Runtime.loadLibrary0(Runtime.java:840) 
 +        at java.lang.System.loadLibrary(System.java:1047) 
 +        at joshua.corpus.vocab.SrilmSymbol.<init>(SrilmSymbol.java:46) 
 +        at joshua.decoder.JoshuaDecoder.initializeSymbolTable(JoshuaDecoder.java:322) 
 +        at joshua.decoder.JoshuaDecoder.initialize(JoshuaDecoder.java:259) 
 +        at joshua.decoder.JoshuaDecoder.<init>(JoshuaDecoder.java:108) 
 +        at joshua.decoder.JoshuaDecoder.main(JoshuaDecoder.java:684)</code>
  
-<code>make World</code>+Přestože SRILM, který nebyl přeložen na 64 bitech, běží jak na 32, tak na 64 bitech, s Joshuou na 64 bitech spolupracovat neumí (na 32 ano). Nepomůže ani když překlad Joshuy pustím až na 64 bitech (při spolupráci s 32bitovým SRILM).
  
-Nyní bychom měli otestovat, že SRILM je přeložen a běží správněK tomu ho musíme idat do své cesty (i když pro použití s Mosesem a Joshuou to zřejmě není potřeba). Musíme do cesty idat jednak bin, jednak jeho podsložku pro naši architekturu.+**Nicméně se zdá, že pomohlo následující:** 
 +  * Nalogoval jsem se na sol1 (aby kompilace probíhala na clusterové 64bitové architektuře). 
 +  * Upravil jsem $SRILM/sbin/machine-type tak, aby vracel i686-m64 (teď byl upravený, aby i zde dával jen i686). 
 +  * Vlezl jsem do $SRILM/common/Makefile.machine.i686-m64. TCL proměnné tam byly v pořádku, ale idal jsem do voleb překladu (ADDITIONAL_CFLAGS ADDITIONAL_CXXFLAGSvolbu -fPICPokud by se to eložilo bez ní, knihovny SRILM by pak nešly slinkovat přes Swig s Joshuou. 
 +  * make clean, pak make World 
 +  * Vrátil jsem se do $JOSHUA_HOME a pustil ant clean, pak ant compile, nakonec ant test a hlavně ten ./example/decode_example_srilm.sh.
  
-<code>setenv PATH /home/zeman/nastroje/srilm/bin/i686:/home/zeman/nastroje/srilm/bin:${PATH} +==== Cluster ====
-cd test +
-make all</code>+
  
-Josh Schroeder: "Prohlédneme si výstup, budeme hledat zprávy IDENTICAL a DIFFERSObčas se může stát, že není vše identické, ale přesto lze poznat, jestli nástroj funguje, nebo padá." Dan: Úplně všechny testy mi hlásily DIFFERS, ale zdá se mi, že problém je spíš v pojmenování souborů (mnou vygenerované výstupy mají ve jménu navíc ".unknown"; namátkou jsem zkusil jeden z nich porovnat se vzorem a byl identický).+Ke spuštění Joshuy na clusteru se hodí napřOndrova obálka (nebo i ta moje vlastní, ale tu bych neměl nutit např. Gauravovikdyž jako jeden z mála pořád pracuju s tcsh).
  
-==== Kompatibilita architektur ====+<code>kinit 
 +ssh lrc-two 
 +cd $JOSHUA 
 +~bojar/tools/shell/qsubmit ./example/decode_example_srilm.sh 
 +qstat -u '*'</code>
  
-Předpokládal bych, že když něco přeložím pro 32bitový počítač, poběží to i na 64bitovém, ale není to tak. Přeložil jsem SRILM na zenu a úspěšně jsem ho otestoval. Potom jsem se pokusil tentýž test zopakovat na luciferovi (lucifer.ufal.hide). Hlásilo to následující chybu:+===== Použití =====
  
-<code>ngram: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ngram)</code>+Joshua je nainstalován a fungujeNyní se musíme naučit, jak ho trénovat a jak ho použít k překladu.
  
-Jako kdyby na luciferovi byla jiná verze céčka (a standardních knihovennež na zenu.+Nejdříve potřebujeme získat paralelní data, to je úkol mimo Joshuu. 
 +  * Tokenizovaný a segmentovaný text ve zdrojovém jazyce (en). 
 +  * Tokenizovaný segmentovaný text v cílovém jazyce (hi)
 +  * Párování vyrobíme [[Giza++|Gizou++]].
  
-**zen:**+Správný soubor s párováním vypadá nějak takhle:
  
-<code>17:38 zen:/ha/home/zeman/nastroje/srilm/test> gcc -+<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 
-Using built-in specs. +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 
-Target: i486-linux-gnu +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 
-Configured with: ../src/configure ---enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu +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 
-Thread model: posix +0-0 1-1 2-1 3-1 7-8-3 9-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 
-gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)</code>+-32 34-33</code>
  
-**lucifer:**+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.
  
-<code>17:37 lucifer:/ha/home/zeman/nastroje/srilm/test> gcc -v +<code>cd /net/work/people/zeman/hindstina 
-Using built-in specs. +setenv SRC corpus/train.clean.en 
-Target: x86_64-redhat-linux +setenv TGT corpus/train.clean.hi 
-Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-cpu=generic --host=x86_64-redhat-linux +setenv ALI model/aligned.grow-diag-final-and 
-Thread model: posix +setenv TST corpus/train.clean.en.1 
-gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)</code>+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</code>
  
-Možná je problém tom, že na luciferovi ještě není Ubuntuale Red HatZkusíme to tedy přímo na clusterunapř**sol1:**+V příkladu INSTALL.txt měli navíc ještě volbu ''--print-rules=false''nevím pročVýsledná gramatika totiž byla prázdnáa když jsem tuto volbu odstranil, gramatika se vygenerovala.
  
-<code>17:42 sol1:/ha/work/people/zeman/zeh/zeman/tectomt/devel/external_code_compilation> gcc -v +Pozor, je poměrně snadné vyčerpat paměťTomu se dá čelit jednak tímže se přesuneme na strojkterý má více pamětijednak že zvolíme postupkterý je složitějšíale k paměti šetrnější.
-Using built-in specs. +
-Target: x86_64-linux-gnu +
-Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +
-Thread model: posix +
-gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)</code>+
  
-Tentokrát test běží bez chyb!+Binarizovat zdrojovou část korpusu.
  
-===== Instalace =====+<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>
  
-Pozor, aby to běželo na clusteru LRC, je potřeba to překládat pro 64bitovou architekturu. V nejhorším případě přímo na clusteru samém.+Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu:
  
-Stáhnout aktuální verzi Joshuy:+<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>cd /net/work/people/zeman/joshua 
-svn co https://joshua.svn.sourceforge.net/svnroot/joshua/trunk joshua</code> 
  
-Nastavit důležité proměnné (to by se hodilo přidat do ''.cshrc'' nebo nějakého podobného konfiguračního souboru) a zkontrolovat, že máme nainstalované prerekvizity. Ant je překladač nebo spíš make pro Javu. Swig je nástroj, který umí propojovat kód napsaný v různých jazycích, v tomto případě jde o napojení céčkového SRILM (jazykové modelování) na zbytek Joshuy, který je v Javě.+===== Decoding =====
  
-<code>setenv JAVA_HOME /opt/jdk1.6 +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, nevyladěných vah. 
-which ant # /usr/bin/ant + 
-which swig # /usr/bin/swig +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: 
-setenv SRILM /home/zeman/nastroje/srilm</code>+ 
 +Cesta k souboru s jazykovým modelem. Zatím předpokládám, že to má být soubor ve formátu SRILM, i když SRILM nepoužijeme a místo něj použijeme javovské jazykové modelování, které je součástí Joshuy. Jazykový model může být zagzipován. Cesta k souboru může být relativní. 
 + 
 +<code>lm_file=$WORK/lm/train.lowercased.hi.lm</code> 
 + 
 +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, že je to i defaultní formát, který produkuje Joshua, po setřídění s odstraněním duplicit a po zagzipování. 
 + 
 +<code>tm_file=$WORK/model/en-hi-dev.grammar.gz 
 +tm_format=hiero</code> 
 + 
 +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. 
 + 
 +<code>glue_file=$JOSHUA/grammars/hiero.glue 
 +glue_format=hiero</code> 
 + 
 +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. 
 + 
 +<code>#lm config 
 +use_srilm=false 
 +lm_ceiling_cost=100 
 +use_left_euqivalent_state=false 
 +use_right_euqivalent_state=false 
 +order=3</code> 
 + 
 +Konfigurace překladového modelu. Kopíruju ji z example2, aniž bych tušil, co znamená. 
 + 
 +<code>#tm config 
 +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</code> 
 + 
 +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 na začátek seznamu, ale při jiném vyvážení komponent by se tam mohla dostat. Pro závěrečný překlad testovacích dat obvykle N nejlepších hypotéz nepotřebujeme, chceme znát rovnou tu, kterou systém považuje za úplně nejlepší. 
 + 
 +<code>#nbest config 
 +use_unique_nbest=true 
 +use_tree_nbest=false 
 +add_combined_cost=true 
 +top_n=300</code> 
 + 
 +Další sekce se týkají vzdáleného serveru pro jazykové modelování a paralelního dekodéru. Tyto sekce vynechávám, protože se nezdá, že bychom je v současné době využili. 
 + 
 +Následují váhy jednotlivých komponent ("features"), tedy jazykového modelu, frázového modelu a případně dalších. 
 + 
 +<code>###### model weights 
 +#lm order weight 
 +lm 1.000000 
 + 
 +#phrasemodel owner column(0-indexed) weight 
 +phrasemodel pt 0 1.066893 
 +phrasemodel pt 1 0.752247 
 +phrasemodel pt 2 0.589793 
 + 
 +#arityphrasepenalty owner start_arity end_arity weight 
 +#arityphrasepenalty pt 0 0 1.0 
 +#arityphrasepenalty pt 1 2 -1.0 
 + 
 +#phrasemodel mono 0 0.5 
 + 
 +#wordpenalty weight 
 +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     # target sentences file name (in this case, file name prefix) 
 +-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 ]