GIZA++ の実行方法の基本を理解するのに問題があります。
ここでは、StackOverflow ( Is there a tutorial about giza++? ) で、人々が提供するリンクを通じて、ディスカッションを行いました。Moses-SMT Github から最新の giza をダウンロードしてコンパイルしました。
git clone https://github.com/moses-smt/giza-pp.git
cd giza-pp
make
コンパイルが成功した後、テスト用の簡単なスクリプトを作成しました。
#!/bin/bash
SRC=french
TRG=english
PREFIX=out
GIZA=../giza-pp
# Cleaning from previous run ...
rm -f *.log
rm -f *.vcb
rm -f *.snt
rm -f *.vcb.classes
rm -f *.vcb.classes.cats
rm -f *.gizacfg
rm -f *.cooc
rm -f ${PREFIX}*
# Converting plain text into sentence format using the "plain2snt.out" tool ...
${GIZA}/GIZA++-v2/plain2snt.out ${SRC} ${TRG}
# Generating word clusters using the "mkcls" tool ...
${GIZA}/mkcls-v2/mkcls -p${SRC} -V${SRC}.vcb.classes
${GIZA}/mkcls-v2/mkcls -p${TRG} -V${TRG}.vcb.classes
# Generating coocurrence using the "snt2cooc" tool ...
${GIZA}/GIZA++-v2/snt2cooc.out ${SRC}.vcb ${TRG}.vcb ${SRC}_${TRG}.snt > ${SRC}_${TRG}.cooc
# Running "GIZA++" ...
${GIZA}/GIZA++-v2/GIZA++ -S ${SRC}.vcb -T ${TRG}.vcb -C ${SRC}_${TRG}.snt -CoocurrenceFile ${SRC}_${TRG}.cooc -o ${PREFIX} >> giza.log 2>&1
これは、スクリプトを実行した直後のディレクトリの内容です。
jakub@jakub-virtual-machine:~/Master/giza-pp_test$ ls
english french_english.snt out.d3.final out.perp
english_french.snt french.vcb out.d4.final out.t3.final
english.vcb french.vcb.classes out.D4.final out.trn.src.vcb
english.vcb.classes french.vcb.classes.cats out.Decoder.config out.trn.trg.vcb
english.vcb.classes.cats giza.log out.gizacfg out.tst.src.vcb
french out.a3.final out.n3.final out.tst.trg.vcb
french_english.cooc out.A3.final out.p0_3.final run_test.sh
ポイントは、以下にリストされている (私にとって重要な) ファイルが出力にないことです。
out.ti.final
out.actual.ti.final
今、私は GIZA の Main.cpp (行: 260 - 273) を調べており、これらのファイルを作成しているはずの行を確認できます。
cerr << "writing Final tables to Disk \n";
string t_inv_file = Prefix + ".ti.final" ;
if( !FEWDUMPS)
m1.getTTable().printProbTableInverse(t_inv_file.c_str(), m1.getEnglishVocabList(),
m1.getFrenchVocabList(),
m1.getETotalWCount(),
m1.getFTotalWCount());
t_inv_file = Prefix + ".actual.ti.final" ;
if( !FEWDUMPS )
m1.getTTable().printProbTableInverse(t_inv_file.c_str(),
eTrainVcbList.getVocabList(),
fTrainVcbList.getVocabList(),
m1.getETotalWCount(),
m1.getFTotalWCount(), true);
ログに「cerr」行も出力されていますが、これらのファイルが出力に存在しない理由がわかりません。
jakub@jakub-virtual-machine:~/Master/giza-pp_test$ cat giza.log | tail -n 25
p0_count is 4.0073 and p1 is 5.99635; p0 is 0.400584 p1: 0.599416
Model4: TRAIN CROSS-ENTROPY 0.80096 PERPLEXITY 1.74226
Model4: (10) TRAIN VITERBI CROSS-ENTROPY 0.801289 PERPLEXITY 1.74266
Dumping alignment table (a) to file:out.a3.final
Dumping distortion table (d) to file:out.d3.final
Dumping nTable to: out.n3.final
Model4 Viterbi Iteration : 10 took: 0 seconds
H3333344444 Training Finished at: Fri Oct 23 16:24:44 2015
Entire Viterbi H3333344444 Training took: 0 seconds
==========================================================
writing Final tables to Disk
Writing PERPLEXITY report to: out.perp
Writing source vocabulary list to : out.trn.src.vcb
Writing source vocabulary list to : out.trn.trg.vcb
Writing source vocabulary list to : out.tst.src.vcb
Writing source vocabulary list to : out.tst.trg.vcb
writing decoder configuration file to out.Decoder.config
Entire Training took: 0 seconds
Program Finished at: Fri Oct 23 16:24:44 2015
==========================================================
誰かが同様の問題に遭遇しましたか?これはある種のバグですか、それとも何か間違ったことをしていますか?
編集:
-DBINARY_SEARCH_FOR_TTABLE
これで、 内のオプションなしで GIZA++ 全体を再コンパイルしCFLAGS
ましたMakefile
。また、coocurrence ファイルを生成して GIZA++ に提供しないようにスクリプトを変更しました。スクリプトを再実行した後、出力にはout.actual.ti.final
andが含まれていましたout.ti.final
。この動作を説明する方法を知っている人はいますか? coocurrence ファイルを使用すると、より良いアラインメントと確率推定値が得られると教えましたが、何か必要ですか? それともパフォーマンスのスピードを向上させるためだけですか?