This is an old revision of the document!
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 (Zhifei Li)).
Zdroje informací:
- Soubory
INSTALL
aREADME
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://sourceforge.net/projects/joshua - download (ale viz též níže), jinak toho tu moc není
Instalace
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ích, v tomto případě Joshuy (Java) na SRILM (céčko). Máme ho v
/usr/bin/swig
- SRILM: nástroj Andrease Stolckeho na trénování a používání jazykových modelů, běžně používaný se strojovými překladači, jako je Pharaoh, Hiero, Moses, Joshua. Máme nainstalováno nejspíš mnohokrát, v podstatě si každý instaluje svou kopii. Podrobnosti o instalaci viz odkaz na začátku tohoto bodu. Pozor, aby instalace fungovala na stroji (architektuře), na kterém chceme překládat (podrobnosti viz tamtéž).
Nastavit důležité proměnné (to by se hodilo přidat do .cshrc
nebo nějakého podobného konfiguračního souboru).
setenv JAVA_HOME /opt/jdk1.6 setenv SRILM /home/zeman/nastroje/srilm setenv JOSHUA /net/work/people/zeman/joshua
Stáhnout aktuální verzi Joshuy:
cd $JOSHUA svn co https://joshua.svn.sourceforge.net/svnroot/joshua/trunk joshua
Přeložit Joshuu:
cd $JOSHUA ant compile
Kdyby bylo potřeba v budoucnosti překompilovat Joshuu načisto, již zkompilované moduly se dají odstranit pomocí
ant clean
Otestujeme, že je Joshua funkční:
ant test ./example/decode_example_javalm.sh ./example/decode_example_srilm.sh
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.
21:35 sol1:/ha/work/people/zeman/joshua> ./example/decode_example_srilm.sh 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 "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)
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).
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 přidal jsem do voleb překladu (ADDITIONAL_CFLAGS i ADDITIONAL_CXXFLAGS) volbu -fPIC. Pokud by se to př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.
Cluster
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).
kinit ssh lrc-two cd $JOSHUA ~bojar/tools/shell/qsubmit ./example/decode_example_srilm.sh qstat -u '*'
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.
Nejdříve potřebujeme získat paralelní data, to je úkol mimo Joshuu.
- Tokenizovaný a segmentovaný text ve zdrojovém jazyce (en).
- Tokenizovaný a segmentovaný text v cílovém jazyce (hi).
- Párování vyrobíme Gizou++.
Správný soubor s párováním vypadá nějak takhle:
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
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.
cd /net/work/people/zeman/hindstina setenv SRC corpus/train.clean.en setenv TGT corpus/train.clean.hi setenv ALI model/aligned.grow-diag-final-and setenv TST corpus/train.clean.en.1 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 –print-rules=false
, nevím proč. Výsledná gramatika totiž byla prázdná, a když jsem tuto volbu odstranil, gramatika se vygenerovala.
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ší.
Binarizovat zdrojovou část korpusu.
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
Takto se extrahuje gramatika pro konkrétní testovací data s pomocí binarizovaného korpusu:
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