[ 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
user:zeman:joshua [2009/06/04 10:04]
zeman Vyhodnocení úspěšnosti.
user:zeman:joshua [2010/08/31 15:55] (current)
zeman Překlep.
Line 9: Line 9:
   * http://joshua.sourceforge.net/ - download, trocha dokumentace (hlavně té automaticky vygenerované, javadoc)   * 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://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 27: 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 79: 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 86: 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:+==== Zastaralý návod ====
  
-<code>2-0 2-2-2 2-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 +**Pozor, následující poznámky pocházejí z&nbsp;doby, kdy jsem se učil pracovat s&nbsp;první verzí Joshuy, a jsou zastaralé! Níže je kopie mailu od Lana Schwartze, kde je vysvětlen postup pro Joshuu 1.3.**
-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 106: Line 109:
 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 116: Line 121:
 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>
  
 +==== Nový návod pro Joshuu 1.3 ====
 +
 +Následuje výtah z&nbsp;mailu od Lana Schwartze, který vysvětluje, jak zadávat parametry při extrakci gramatiky s&nbsp;Joshuou 1.3. V&nbsp;dokumentaci u Joshuy jsem to nenašel.
 +
 +The recommended way to extract a grammar is to configure an ant XML file for ExtractRules. All available parameters can be configured using that technique. The main method is meant now to just be a simple version for use if you don't need any custom configuration.
 +
 +The current version of ExtractRules and its parameters are documented in my and Chris's paper at the most recent MT Marathon:
 +http://www.mtmarathon2010.info/web/Program_files/art-schwartz-callison-burch.pdf
 +
 +The ant file should look something like this:
 +
 +extract.xml:
 +
 +<code xml><project name="JoshuaTasks">
 +
 + <!-- Define the path to Joshua class files -->
 + <property name="classes.dir" 
 + value="/path/to/joshua/bin"/>
 +
 + <!-- Define the ant task to compile a corpus into binary memory-mappable files -->
 + <taskdef name="compileJosh" 
 + classname="joshua.corpus.suffix_array.Compile" 
 + classpath="${classes.dir}"/>
 +
 + <!-- Define the ant task to extract rules -->
 + <taskdef name="extractRules" 
 + classname="joshua.prefix_tree.ExtractRules" 
 + classpath="${classes.dir}"/>
 +
 +
 + <!-- Declare a target to compile a corpus -->
 + <target name="compile_de-en" 
 +                      description="Compile josh dir for German-English">
 + <compileJosh
 + sourceCorpus="/path/to/train.de"
 + targetCorpus="/path/to/train.en"
 + alignments="/path/to/train.de-en.aln"
 + outputDir="/path/to/output/de-en.josh"
 + />
 + </target>
 +
 +
 + <!-- Declare a target to extract a grammar -->
 + <target name="extract_de-en"
 +                      description="Extract grammar for German-English">
 + <extractRules
 + joshDir="/path/to/output/de-en.josh"
 + outputFile="/path/to/output/de-en.grammar"
 + testFile="/path/to/test.de"
 + />
 + </target>
 +
 +
 + <!-- Declare a target to extract a grammar with other parameters-->
 + <target name="extract_de-en-custom"
 +                      description="Extract grammar for German-English">
 + <extractRules
 + joshDir="/path/to/output/de-en.josh"
 + outputFile="/path/to/output/de-en.grammar"
 + testFile="/path/to/test.de"
 + maxPhraseSpan="5"
 + maxPhraseLength="5"
 + requireTightSpans="true"
 + edgeXViolates="false"
 + sentenceInitialX="false"
 + sentenceFinalX="false"
 + ruleSampleSize="200"
 + maxNonterminals="2"
 + />
 + </target>
 +
 +</project></code>
 +
 +You can call this, with any of the targets that you define in extract.xml, using ant:
 +
 +<code bash># Compile the corpus
 +ant -f extract.xml compile_de-en
 +
 +# Extract rules using defaults
 +ant -f extract.xml extract_de-en
 +
 +# Extract rules using custom settings
 +ant -f extract.xml extract_de-en-custom</code>
  
 ===== Decoding ===== ===== Decoding =====
Line 210: Line 318:
  
 <code>$JOSHUA/example2/get_1best_from_Nbest.pl $HINDI/output/dev.nbest.out $HINDI/output/dev.1best.out</code> <code>$JOSHUA/example2/get_1best_from_Nbest.pl $HINDI/output/dev.nbest.out $HINDI/output/dev.1best.out</code>
- 
  
 ===== Vyhodnocení úspěšnosti ===== ===== Vyhodnocení úspěšnosti =====
Line 225: Line 332:
     -cand $HINDI/output/dev.1best.out \     -cand $HINDI/output/dev.1best.out \
     -ref $HINDI/corpus/dev.lowercased.hi</code>     -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>
 +
 +===== Troubleshooter =====
 +
 +
 +
 +==== Grammar extraction: Negative array size ====
 +
 +If you encounter this exception during corpus binarization or (in older releases of Joshua) during grammar extraction, check your alignment file whether it matches your source and target corpus. Did you switch translation direction accidentially? The alignment file must have the same number of lines as your source and target corpus, one line per sentence (segment) pair. The "tokens" on each line are pairs of numbers, such as "0-0 1-2 2-2 3-5". The first number in each pair is the index to the source sentence (first token has index 0) and the second number is index to the target sentence. By switching the source and the target, you are likely to cause some indices to point out of the sentence, and you are in trouble.
 +
 +Another source of this error could be sentences with 100 or more words. This is not a strict limit, often I was able to extract grammars for corpora unchecked for such sentences, but according to Lance Schwartz, long sentences can cause problems. (For me, filtering out such sentences helped with es-en WMT08 training data.) And after all, they are suspicious anyway, and their contribution to the learnt model is doubtful.
 +
 +==== ZMERT: corrupted temp file ====
 +
 +Hi all,
 +
 +does the following ZMERT exception look familiar to anyone? My only idea was that the nbest output from the decoder is corrupted somehow. However, I cannot find anything strange in it, such as sequence of more then three "|||" etc.
 +
 +Thanks,
 +Dan
 +
 +zmert.out:
 +-----
 +<code>tmpDirPrefix: /ha/work/people/zeman/wmt/experiments/obo-max/mert/ZMERT.
 +Processed the following args array:
 + -dir /ha/work/people/zeman/wmt/experiments/obo-max/mert -s src.txt -r ref.txt -rps 1 -p params.txt -m BLEU 4 closest -maxIt 5 -ipi 20 -cmd ./decoder.pl -decOut nbest.txt -dcfg decoder-config.txt -N 300 -v 1 -seed 12341234
 +
 +----------------------------------------------------
 +Initializing...
 +----------------------------------------------------
 +
 +Random number generator initialized using seed: 12341234
 +
 +Number of sentences: 2051
 +Number of documents: 1
 +Optimizing BLEU
 +docSubsetInfo: {0, 1, 1, 1, 1, 0, 0}
 +Number of features: 5
 +Feature names: {"lm","phrasemodel pt 0","phrasemodel pt 1","phrasemodel pt 2","wordpenalty"}
 +
 +c    Default value    Optimizable?    Crit. val. range    Rand. val. range
 +1     1.0000         Yes         [0.1,Infinity]         [0.5,1.5]
 +2     1.0669         Yes         [-Infinity,Infinity]         [-1.0,1.0]
 +3     0.7522         Yes         [-Infinity,Infinity]         [-1.0,1.0]
 +4     0.5898         Yes         [-Infinity,Infinity]         [-1.0,1.0]
 +5     -2.8448         Yes         [-Infinity,Infinity]         [-5.0,0.0]
 +
 +Weight vector normalization method: weights will be scaled so that the "lm" weight has an absolute value of 1.0.
 +
 +----------------------------------------------------
 +
 +----------------------------------------------------
 +Z-MERT run started @ Sat Mar 06 23:52:57 CET 2010
 +----------------------------------------------------
 +
 +Initial lambda[]: {1.0, 1.066893, 0.752247, 0.589793, -2.844814}
 +
 +--- Starting Z-MERT iteration #1 @ Sat Mar 06 23:52:57 CET 2010 ---
 +Decoding using initial weight vector {1.0, 1.066893, 0.752247, 0.589793, -2.844814}
 +Running external decoder...
 +...finished decoding @ Sun Mar 07 00:02:33 CET 2010
 +Reading candidate translations from iterations 1-1
 +(and computing BLEU sufficient statistics for previously unseen candidates)
 + Progress:
 +Exception in thread "main" java.lang.NumberFormatException: For input string: "||||||"
 +   at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
 +   at java.lang.Integer.parseInt(Integer.java:449)
 +   at java.lang.Integer.parseInt(Integer.java:499)
 +   at joshua.zmert.MertCore.run_single_iteration(MertCore.java:1071)
 +   at joshua.zmert.MertCore.main(MertCore.java:3129)
 +Z-MERT exiting prematurely (MertCore returned 1)...</code>
 +----- 
 +
 +Omar's response:
 +
 +Hi Dan,
 +
 +The "||||||" sequence is in a temp file, not the decoder's output.  If
 +if there are any *temp* (or *tmp*) files in the folder from earlier
 +runs, make sure you delete them first, then try launching Z-MERT
 +again.  Such files are left over from runs that crash.  Z-MERT does
 +not delete them because they can be used to restart Z-MERT from the
 +point where it crashed.  But that assumes the crash is due to power
 +loss or an interrupted job, etc.  In your case, I think what happened
 +is that a prior run crashed because of an external problem in the
 +setup itself, which you fixed and tried to restart Z-MERT.  For that
 +reason, Z-MERT should not be using those temp files in the first
 +place, but when it sees them there, it assumes it can use them because
 +the user did not delete them.
 +
 +Let me know if that's not the case.
 +
 +O.Z.
 +

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