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/01 21:13] zeman JOSHUA_HOME |
user:zeman:joshua [2009/06/04 10:06] zeman První výsledek. |
||
---|---|---|---|
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 '' | * Soubory '' | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * http:// | ||
- | ===== Instalace | + | ===== Instalace ===== |
- | SRILM je nástroj | + | Prerekvizity: |
+ | * Ant: kompilátor a make Javy. Máme ho v ''/ | ||
+ | * Swig: nástroj | ||
+ | * [[SRILM]]: nástroj Andrease Stolckeho na trénování | ||
- | Získat balík | + | Nastavit důležité proměnné (to by se hodilo přidat do '' |
- | Stažený balík srilm.tgz má asi 49 MB<nowiki>!</nowiki> Pozor, 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 / |
+ | setenv SRILM / | ||
+ | setenv JOSHUA / | ||
- | < | + | Stáhnout aktuální verzi Joshuy: |
- | cd srilm | + | |
- | unzip.pl ../ | + | |
- | nebo | + | < |
+ | svn co https:// | ||
- | < | + | Přeložit Joshuu: |
- | Přečíst si soubor README, je tam mnoho tipů. Upravit Makefile, aby obsahoval cestu do mé složky. | + | < |
+ | ant compile</ | ||
- | < | + | Kdyby bylo potřeba v budoucnosti překompilovat Joshuu načisto, již zkompilované moduly se dají odstranit pomocí |
- | vi Makefile</ | + | |
- | diff: | + | < |
- | < | + | Otestujeme, že je Joshua funkční: |
- | < # SRILM = / | + | |
- | --- | + | |
- | > SRILM = / | + | |
- | Není tam popsaný akorát tento zádrhel: z neznámých důvodů SRILM očekává grafickou knihovnu TCL. Pokud tato knihovna není k dispozici, musíme mu říct, že se na ni má vykašlat. K tomu je potřeba ve složce SRILM vlézt do common, najít dílčí Makefile pro naši architekturu (lze zjistit pomocí '' | + | < |
+ | ./ | ||
+ | ./example/ | ||
- | < | + | 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</ | + | |
- | Nyní jsme připraveni přeložit SRILM. Pokud nejsme v kořenové složce '' | + | < |
+ | Jun 1, 2009 9:35:43 PM joshua.decoder.JoshuaConfiguration readConfigFile | ||
+ | INFO: you use a LM feature function, so make sure you have a LM grammar | ||
+ | Exception in thread " | ||
+ | at java.lang.ClassLoader$NativeLibrary.load(Native Method) | ||
+ | at java.lang.ClassLoader.loadLibrary0(ClassLoader.java: | ||
+ | at java.lang.ClassLoader.loadLibrary(ClassLoader.java: | ||
+ | at java.lang.Runtime.loadLibrary0(Runtime.java: | ||
+ | at java.lang.System.loadLibrary(System.java: | ||
+ | at joshua.corpus.vocab.SrilmSymbol.< | ||
+ | at joshua.decoder.JoshuaDecoder.initializeSymbolTable(JoshuaDecoder.java: | ||
+ | at joshua.decoder.JoshuaDecoder.initialize(JoshuaDecoder.java: | ||
+ | at joshua.decoder.JoshuaDecoder.< | ||
+ | at joshua.decoder.JoshuaDecoder.main(JoshuaDecoder.java:684)</ | ||
- | < | + | 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 | + | **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/ | ||
+ | * Vlezl jsem do $SRILM/ | ||
+ | * 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 ./ | ||
- | < | + | ==== Cluster ==== |
- | cd test | + | |
- | make all</ | + | |
- | Josh Schroeder: " | + | 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ř. Gauravovi, když jako jeden z mála pořád pracuju s tcsh). |
- | ==== Kompatibilita architektur ==== | + | < |
+ | ssh lrc-two | ||
+ | cd $JOSHUA | ||
+ | ~bojar/ | ||
+ | qstat -u ' | ||
- | 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í ===== |
- | < | + | Joshua je nainstalován a funguje. Nyní 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 | + | Nejdříve potřebujeme získat paralelní data, to je úkol mimo Joshuu. |
+ | * Tokenizovaný a segmentovaný text ve zdrojovém jazyce | ||
+ | * Tokenizovaný | ||
+ | * Párování vyrobíme [[Giza++|Gizou++]]. | ||
- | **zen:** | + | Správný soubor s párováním vypadá nějak takhle: |
- | < | + | < |
- | 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: ../ | + | 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-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 |
- | gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)</ | + | -32 34-33</ |
- | **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. |
- | < | + | < |
- | Using built-in specs. | + | setenv SRC corpus/train.clean.en |
- | Target: x86_64-redhat-linux | + | setenv TGT corpus/train.clean.hi |
- | Configured with: ../ | + | setenv ALI model/ |
- | Thread model: posix | + | setenv TST corpus/ |
- | gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)</ | + | setenv GRM en-hi.grammar |
+ | head -1 $SRC > $TST | ||
+ | java -cp $JOSHUA/bin joshua.prefix_tree.ExtractRules | ||
+ | sort -u $GRM.unsorted > $GRM | ||
+ | gzip $GRM</ | ||
- | Možná je problém | + | V příkladu |
- | < | + | 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ší, ale k paměti šetrnější. |
- | Using built-in specs. | + | |
- | Target: x86_64-linux-gnu | + | |
- | Configured with: ../ | + | |
- | Thread model: posix | + | |
- | gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)</ | + | |
- | Tentokrát test běží bez chyb! | + | Binarizovat zdrojovou část korpusu. |
+ | < | ||
- | ===== Instalace ===== | + | Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu: |
- | 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. | + | <code bash> |
- | Stáhnout aktuální verzi Joshuy: | ||
- | < | + | ===== Decoding ===== |
- | cd $JOSHUA_HOME | + | |
- | svn co https:// | + | |
- | Nastavit důležité proměnné | + | Jakmile máme gramatiku |
- | < | + | 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: |
- | which ant # /usr/bin/ant | + | |
- | which swig # /usr/bin/swig | + | Cesta k souboru s jazykovým modelem. Zatím předpokládám, |
- | setenv SRILM /home/zeman/nastroje/srilm</ | + | |
+ | < | ||
+ | |||
+ | 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</code> | ||
+ | |||
+ | 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 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, | ||
+ | |||
+ | < | ||
+ | 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 \ | ||
+ | | ||
+ | $HINDI/corpus/dev.lowercased.en \ | ||
+ | | ||
+ | |||
+ | 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. |