Table of Contents
Instalace SRILM
SRILM je nástroj pro jazykové modelování, se kterým pracují mnohé překladače včetně Mosese a Joshuy. Je napsaný v céčku. Způsob, jak ho získat a přeložit, je popsaný v tutoriálu k Mosesovi. (Ten není na webu normálně vidět, ale jeden odkaz na něj vede např. z Trac wiki Gaurav.) Stručně zde opakuji:
Získat balík se SRILM lze zde: http://www.speech.sri.com/projects/srilm/download.html
Stažený balík srilm.tgz má asi 49 MB! 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í.
mkdir srilm cd srilm unzip.pl ../srilm.tgz
nebo
tar -xzvf ../srilm.tgz
Přečíst si soubor README, je tam mnoho tipů. Upravit Makefile, aby obsahoval cestu do mé složky.
chmod +w Makefile vi Makefile
diff:
7c7 < # SRILM = /home/speech/stolcke/project/srilm/devel --- > SRILM = /home/zeman/nastroje/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í $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):
# Tcl support (standard in Linux) # TCL_INCLUDE = # TCL_LIBRARY = -ltcl NO_TCL = x
Nyní jsme připraveni přeložit SRILM. Pokud nejsme v kořenové složce srilm
, vrátíme se do ní a spustíme:
make World
Nyní bychom měli otestovat, že SRILM je přeložen a běží správně. K tomu ho musíme přidat do své cesty (i když pro použití s Mosesem a Joshuou to zřejmě není potřeba). Musíme do cesty přidat jednak bin, jednak jeho podsložku pro naši architekturu.
setenv PATH /home/zeman/nastroje/srilm/bin/i686:/home/zeman/nastroje/srilm/bin:${PATH} cd test make all
Josh Schroeder: “Prohlédneme si výstup, budeme hledat zprávy IDENTICAL a DIFFERS. Obč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ý).
Kompatibilita architektur
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:
ngram: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ngram)
Jako kdyby na luciferovi byla jiná verze céčka (a standardních knihoven) než na zenu.
zen:
17:38 zen:/ha/home/zeman/nastroje/srilm/test> gcc -v Using built-in specs. Target: i486-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-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
lucifer:
17:37 lucifer:/ha/home/zeman/nastroje/srilm/test> gcc -v Using built-in specs. Target: x86_64-redhat-linux 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 Thread model: posix gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
Možná je problém v tom, že na luciferovi ještě není Ubuntu, ale Red Hat. Zkusíme to tedy přímo na clusteru, např. sol1:
17:42 sol1:/ha/work/people/zeman/zeh/zeman/tectomt/devel/external_code_compilation> gcc -v 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)
Tentokrát test běží bez chyb!
Výroba jazykového modelu
Pro strojový překlad potřebujeme jazykový model cílového jazyka. Např. pro hindštinu ho vyrobíme následovně. Vyrobíme ho pro data převedená na malá písmena, protože ta budeme také používat při trénování překladu. Vyrobíme trigram (-order 3
).
cd $HINDSTINA mkdir lm $SRILM/bin/i686/ngram-count -order 3 -interpolate -kndiscount -unk \ -text data/train.lowercased.hi \ -lm lm/train.lowercased.hi.lm
Pro 50000 hindských vět je to rychlá práce (pár vteřin) i na slabém stroji. Takhle zjistíme, jak velký model vznikl:
head -5 lm/train.lowercased.hi.lm \data\ ngram 1=67924 ngram 2=488352 ngram 3=98876