天天看點

MOSES統計機器翻譯系統實作過程

MOSES安裝以及初級說明

作為初學者對MOSES現在也沒有什麼深入的了解就在這裡嫌醜,淺顯的介紹一下。

首先是moses的官網:http://www.statmt.org/moses/

裡面資料很詳細,可以下載下傳說明文檔(manual.pdf)按照文檔裡面的提示一步步進行,一般來說整體隻要依照這個步驟就沒有問題

我現在本機上安裝的moses,然後又在伺服器上進行的運作,是以安裝經驗是本機的,但是兩面使用的搭配是一樣的都是moses+boost+GIZA+++IRSTLM。就是作業系統不一樣,本機是ubuntu,而伺服器是CentOS,但是基本上的過程是一樣的。

一、前期安裝準備

1、Boost【ubuntu下】

apt-get install libboost1.53-all-dev

2、GIZAA++【ubuntu下】

wget http://giza-pp.googlecode.com/files/giza-pp-v1.0.7.tar.gz

tar xzvf giza-pp-v1.0.7.tar.gz

cd giza-pp

Make

在編譯後會生成三個可執行檔案

· giza-pp/GIZA++-v2/GIZA++

· giza-pp/GIZA++-v2/snt2cooc.out

· giza-pp/mkcls-v2/mkcls

這三個檔案是在之後主要要使用的檔案,可以單獨把這三個檔案提取出來放到一個友善的位置,不覺得麻煩的話也可以每次鍵入路徑,不過使用頻率不算高還可以。

比如說建立tools\ 把這三個檔案放進去

可以在編譯的時候直接指出GIZA++的位置,也可以在編譯的時候不指出,在使用的時候再指明,我采用的是後者。

3、IRSTLM

這個我在ubuntu和centOS下都編譯了,方法都很簡單

1)【ubuntu下】

在編譯IRSTLM之前,需要安裝兩個工具。使用下面的指令來安裝這兩個工具:

$ sudo apt-get install automake

$ sudo apt-get install libtool

接下來就可以安裝IRSTLM了。先下載下傳軟體包,下載下傳位址為:

http://sourceforge.net/projects/irstlm/files/

使用下面的指令進行安裝:

tar zxvf irstlm-5.80.03.tgz

cd irstlm-5.80.03

./regenerate-makefiles.sh

./configure --prefix=$HOME/irstlm

make install

這樣就編譯安裝好了IRSTLM,記住irstlm的位置,以後用得到。

2)【centOS下】

其實在這個下面和ubuntu裡面沒有什麼差別

step 0: sh regenerate-makefiles.sh

step 1: ./configure[--prefix=/path/where/to/install]

step 2: make

step 3: make install

二、正式安裝Moses【ubuntu下】

由于moses的代碼均可用git下載下傳,是以先安裝git:

$ sudo apt-get install git

還需要gcc, zlib and bzip2以建構moses

$ sudo apt-get install build-essential libz-dev libbz2-dev      

然後就可以下載下傳moses的代碼了

git clone git://github.com/moses-smt/mosesdecoder.git

然後進入mosesdecoder目錄,編譯Moses:

./bjam -j4 \ --with-irstlm=/irstlm的位置 --with-giza=/giza的位置

-j4是利用CPU是4核的進行編譯

也可以./bjam --help擷取幫助

如果在編譯過程中遇到什麼問題也許是因為一些編譯必須的包沒有安裝成功,安裝一些影響編譯的包再進行編譯試一下。

可以從目錄下的BUILD-INSTRUCTIONS.txt擷取安裝的更多資訊。

三、使用moses

最開始除了最後翻譯一步都是在本機上進行的,但是當進行到最後一步翻譯就提醒記憶體不夠了。。是以為了不折騰最好還是一開始就在伺服器上跑的好。。

在進行實驗之前最好記住剛才安裝的幾個檔案的目錄,要不在進行接下來的步驟還要回去一個個找目錄位置還是挺麻煩的。

P.s.這裡w4tcy是我個人的使用者檔案夾

Moses:/home/w4tcy/moses/

因為這裡主要應用的就是/scripts和/bin兩個檔案夾,是以可以把這兩個檔案夾單獨提出來

/home/w4tcy/moses/scripts/

/home/w4tcy/moses/bin/

Giza++:/home/w4tcy/tools/giaz/

這個隻要把上文所說的三個執行檔案提出即可

IRSTLM:/home/w4tcy/tools/irstlm

這個我建議一開始就安裝到這裡。。我還不太清楚利用的是裡面的什麼。。

在這裡我先使用官方提供的預料進行學習測試,因為語料使用的是官方的是以很多步驟就簡單多了:

1、預料的預處理

在/home/w4tcy/建立一個corpus來存放學習集,官方網站下載下傳學習資料

cd

mkdir corpus

cd corpus

wgethttp://www.statmt.org/wmt13/training-parallel-nc-v8.tgz

tar zxvf training-parallel-nc-v8.tgz

1)tokenisation:在預料的單詞和單詞之間或者單詞和标點之間插入空白,然後進行後續操作。

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl-l en < training/news-commentary-v8.fr-en.en >news-commentary-v8.fr-en.tok.en

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl-l fr < training/news-commentary-v8.fr-en.fr >news-commentary-v8.fr-en.tok.fr

2)Truecaser:提取一些關于文本的統計資訊

/home/w4tcy/moses/scripts/recaser/train-truecaser.perl--model truecase-model.en --corpus news-commentary-v8.fr-en.tok.en

/home/w4tcy/moses/scripts/recaser/train-truecaser.perl--model truecase-model.fr --corpus news-commentary-v8.fr-en.tok.fr

3)truecasing:将語料中每句話的字和詞組都轉換為沒有格式的形式,減少資料稀疏性問題。

/home/w4tcy/moses/scripts/recaser/truecase.perl--model truecase-model.en < news-commentary-v8.fr-en.tok.en >news-commentary-v8.fr-en.true.en

/home/w4tcy/moses/scripts/recaser/truecase.perl--model truecase-model.fr < news-commentary-v8.fr-en.tok.fr >news-commentary-v8.fr-en.true.fr

4)cleaning: 将長語句和空語句删除,并且将不對齊語句進行處理。

/home/w4tcy/moses/scripts/training/clean-corpus-n.perlnews-commentary-v8.fr-en.true fr en news-commentary-v8.fr-en.clean 1 80

2、語言模型訓練

語言模型(LM)用于確定流利的輸出,在這一步使用Irstlm進行處理。

/home/w4tcy/tools/irstlm/bin/add-start-end.sh< news-commentary-v8.fr-en.true.en > news-commentary-v8.fr-en.sb.en

export IRSTLM=$HOME/irstlm;/home/w4tcy/tools/irstlm/bin/build-lm.sh -i news-commentary-v8.fr-en.sb.en -t./tmp -p -s improved-kneser-ney -o news-commentary-v8.fr-en.lm.en

/home/w4tcy/tools/irstlm/bin/compile-lm --textnews-commentary-v8.fr-en.lm.en.gz news-commentary-v8.fr-en.arpa.en       經過這一步之後我們會得到一個*.arpa.en格式的語言模型檔案,接下來為了程式的更快載入,使用KenLM對其進行二值化。

/home/w4tcy/moses/bin/build_binarynews-commentary-v8.fr-en.arpa.en news-commentary-v8.fr-en.blm.en

我們可以在這一步之後測試一下訓練的模型是否正确,運用如下的linux指令:

$ echo "is this an English sentence?" | /home/w4tcy/moses/bin/query news-commentary-v8.fr-en.blm.en

3、翻譯模型的訓練

mkdir working

cd working

nohup nice/home/w4tcy/moses/scripts/training/train-model.perl -root-dir train -corpus/home/w4tcy/corpus/news-commentary-v8.fr-en.clean -f fr -e en -alignmentgrow-diag-final-and -reordering msd-bidirectional-fe -lm0:3:/home/w4tcy/corpus/news-commentary-v8.fr-en.blm.en:8 -external-bin-dir/home/w4tcy/tools/giza >& training.out &

(朱老師的修改)【特别說明先退出目前目錄然後進入根目錄‘../’或者退出直接到根目錄去用’./’】

./mosesdecoder/scripts/training/train-model.perl - root train -corpus corpus/news-commentary-v8.fr-en.clean -f fr -e en -alignment grow-diag-final-an -reordering msd-bidirectional-fr -lm 0:3:/home/trainer1/lm/news-commentary-v8.fr-en.blm.en:8 -external-bin-dir bin/

4、Tunning翻譯模型

回到corpus,下載下傳開發集

wget http://www.statmt.org/wmt12/dev.tgz

tar zxvf dev.tgz

Corpus内對開發集預料進行處理

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl-l en < dev/news-test2008.en > news-test2008.tok.en

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl-l fr < dev/news-test2008.fr > news-test2008.tok.fr

/home/w4tcy/moses/scripts/recaser/truecase.perl--model truecase-model.en  <news-test2008.tok.en > news-test2008.true.en

/home/w4tcy/moses/scripts/recaser/truecase.perl--model truecase-model.fr < news-test2008.tok.fr > news-test2008.true.fr

在進行了和學習集相同的處理之後,對原本的moses.ini進行調優

進入working檔案夾然後運作

nohup nice/home/w4tcy/moses/scripts/training/mert-moses.pl/home/w4tcy/corpus/news-test2008.true.fr/home/w4tcy/corpus/news-test2008.true.en /home/w4tcy/moses/bin/mosestrain/model/moses.ini --mertdir /home/w4tcy/moses/bin/ &> mert.out &

可在最後加上--decoder-flags="-threads 8"以使用多個線程,因為這個過程非常非常緩慢。

5、測試

可以直接運作進行單句翻譯

/home/w4tcy/moses/bin/moses -f /home/w4tcy/corpus/working/mert-work/moses.ini

當然,這樣很慢,是以我們可以在進行一定的處理加快

在working檔案夾下進行建立

mkdir binarised-model

/home/w4tcy/moses/bin/processPhraseTable -ttable 0 0train/model/phrase-table.gz -nscores 5 -out binarised-model/phrase-table

/home/w4tcy/moses/bin/processLexicalTable -intrain/model/reordering-table.wbe-msd-bidirectional-fe.gz  -out binarised-model/reordering-table

然後将working/mert-work/moses.ini複制到binarised-model的檔案夾内,做一下改變

1. 将PhraseDictionaryMemory改為PhraseDictionaryBinary

2. 将PhraseDictionary特征的路徑改為$HOME/corpus/working/binarisedmodel/phrase-table

3. 将LexicalReordering特征的路徑改為$HOME/corpus/binarisedmodel/reordering-table

這樣程式的運作就快了很多。

如果要進行全文翻譯,在進行翻譯前同樣要把語句進行預處理

這一步可以到corpus下進行

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl -l en <dev/newstest2011.en > newstest2011.tok.en

/home/w4tcy/moses/scripts/tokenizer/tokenizer.perl -l fr <dev/newstest2011.fr > newstest2011.tok.fr

/home/w4tcy/moses/scripts/recaser/truecase.perl --modeltruecase-model.en  <newstest2011.tok.en > newstest2011.true.en

/home/w4tcy/moses/scripts/recaser/truecase.perl --modeltruecase-model.fr  <newstest2011.tok.fr > newstest2011.true.fr

進行翻譯

nohup nice /home/w4tcy/moses/bin/moses-f /home/w4tcy/corpus/working/binarised-model/moses.ini< newstest2011.true.fr > newstest2011.out

最後進行BLEU評分

/home/w4tcy/moses/scripts/generic/multi-bleu.perl -lc newstest2011.true.en< newstest2011.out

得到BLEU評分,整個翻譯過程就結束了。

最後BLEU評分-lc是無視大小寫的BLEU評分,不使用參數-lc是大小寫敏感的BLEU評分

在tuning和最終test的時候參考譯文的數量以及分詞等預處理,語言模型是n-gram的都會影響到最終BLEU分數

四、補充

1、所有training參數

1.1 基本選項

--root-dir-- 存放輸出檔案的根目錄

--corpus-- 語料庫檔案名 (全路徑名),不包含擴充

--e-- 英文語料庫的拓展檔案

--f-- 外文語料庫的拓展檔案

--lm-- 語言模型: <factor>:<order>:<filename>(選項可重複)

1.2 翻譯模型設定

--alignment-factors--

--translation-factors--

--reordering-factors--

--generation-factors--

--decoding-steps--

1.3 詞彙化文法重排模型

--reordering-- 指定重排模型訓練一個使用以逗号分隔的config-strings的清單, 參見FactoredTraining.BuildReorderingModel.(default distance)

--reordering-smooth-- 指定參數用在訓練詞彙化文法重新排序模型。如果字母"u" 跟随着常數, 平滑基于實際數量。(default 0.5)

1.4 部分training

因為MOSES是子產品化的可以隻使用部分功能,而使用更優異的其他方法

1. 準備資料

2. 運作GIZA++

3. 字對齊

4. 得到詞彙轉換表

5. 提取短語

6. 短語評分

7. 建構重排序模型

8. 建構生成模型

9. 建立配置檔案

--first-step-- 訓練過程的第一步 (default 1)

--last-step-- 訓練過程的最後一步 (default7)

1.5 檔案路徑

--corpus-dir-- 語料庫的目錄 (default$ROOT/corpus)

--lexical-dir-- 詞彙翻譯機率的目錄 (default$ROOT/model)

--model-dir-- 模型目錄 (default$ROOT/model)

--extract-file-- 抽取的檔案 (default$ROOT/model/extract)

--giza-f2e-- GIZA++ 目錄 (default$ROOT/giza.$F-$E)

--giza-e2f-- 倒轉的 GIZA++ 目錄 (default $ROOT/giza.$E-$F)

1.6 對齊的啟發式

--alignment-- 用于詞對齊的啟發式:intersect, union, grow, grow-final, grow-diag, grow-diag-final (default),grow-diag-final-and, srctotgt, tgttosrc

intersect-- 兩個GIZA++算法使用後的交集。這通常産生大量被提取的短語, 因為未對齊短語産生大量自由對齊的短語。

union-- 兩個GIZA++算法使用後的并集。

grow-diag-final-- 預設的啟發式

grow-diag-- 同上,但是不運作FINAL()功能

grow-- 同上,但是使用不同的臨近定義。現在對角相鄰對齊點被排除在外。 grow -- 沒有對角相鄰對齊點,但是有FINAL()

1.7 最大短于長度

--max-phrase-length-- 加入短于表中的最大短于長度(default7)

1.8 GIZA++選項

--giza-option-- GIZA++ 訓練的額外選項

1.9 大型訓練語料的處理

--parts-- 通過部分運作snt2cooc為GIZA++準備資料

--direction-- 僅在1、2的指導下運作訓練步驟 2  (并行化的)

1.10 其他

--verbose-- 列印附加的詞對齊資訊

--no-lexical-weighting-- 對于短語表僅使用條件機率不使用詞彙權重

繼續閱讀