1. Moses的歷史c++
Moses是Pharaoh的升級版本,增長了許多功能。它是一個基於短語的統計機器翻譯系統,整個系統用C++語言寫成,從訓練到解碼徹底開放源代碼,能夠運行在Linux平臺和Windows平臺。它有兩大特色:算法
1.1 Factored Translation Modelubuntu
在Factored Translation Model中,一個單詞不單單是一個符號(token),而是一個包含多個因子的向量,例如表面詞形、詞幹、詞性等。這些因子共同做用來刻畫一個單詞。app
1.2 Confusion Network Decoding框架
當前的機器翻譯系統可以接受的輸入通常是純文本形式的一串單詞(一句話或者一篇文章),而如今將機器翻譯系統做爲一個大的信息處理系統的組成部分的需求日益增加,它的輸入可能再也不是純文本的形式,而是其它模塊的輸出結果,例如命名實體(NE)識別的結果,或者語音識別的結果。這樣的輸入再也不是單一的,而是可能含有錯誤的、多種可能性的輸入。Confusion Network Decoding容許這種多可能性的輸入,最終選擇最優譯文。svn
2. Moses基本框架工具
Moses核心框架還是Philipp Koehn的基於短語的SMT框架。平臺採用GIZA++進行翻譯模型的訓練,SRILM進行語言模型的訓練,Moses進行生成模型的訓練及解碼,mteval對實驗結果進行BLEU評分。測試
2.1 總調用部分:moses-cmd/src/Main.cppui
2.2 解碼器初始入口部分spa
i. 參數設置:
moses/src/Parameter.cpp
ii. 模型數據加載:
moses/src/StaticData.cpp
2.3 句子翻譯處理部分
i. 解碼器算法實現總調度:
Manager.cpp
ii. 翻譯選項處理:
TranslationOptionCollection.cpp
iii. 部分翻譯處理:
Hypothesis.cpp
iv. 包含翻譯假設,實現剪枝:
HypothesisStack.cpp
2.4 結果輸出:moses-cmd/src/Main.cpp
i. 輸出最佳翻譯結果:
moses-cmd/src/IOStream::OutputBestHypo
ii. n-best生成及輸出:
n-best lists generated in Manager.cpp, output in IOStream.cpp
3. Moses測試平臺搭建
3.1 安裝SRILM
參考http://www.leexiang.com/how-to-configure-srilm-on-ubuntu
補充:語言模型訓練工具除了SRILM可選外,還可使用IRSTLM
3.2 安裝GIZA++
參考http://www.leexiang.com/gizapp-report
3.3 安裝Moses
3.3.1 安裝和編譯
在編輯Moses以前必定要安裝全部的依賴包,不然沒法編譯經過,請安裝如下軟件包:
$sudo apt-get install autoconf automake texinfo zlib1g zlib1g-dev zlib-bin zlibc libtool libboost-all-dev libxmlrpc-c3-dev build-essential
推薦經過Subversion下載並管理Moses:
svn co https://mosesdecoder.svn.sourceforge.net/svnroot/mosesdecoder/trunk moses
進入moses,運行./regenerate-makefiles.sh
注:若是gcc 是4.4版本,可能會出現錯誤,須要修改moses/src,moses-cmd/src,misc三個文件夾中的Makefile.am文件,在AM_CPPFLAGS=…..後面加上-std=c++0x,並修改configure文件中3870行,將MY_ARCH=${with_srilm}/sbin/machine-type
改成MY_ARCH=「i686-gcc4「,從新編譯一次。
./configure –with-srilm=MT/srilm (SRILM的絕對路徑)
再運行命令make -j 4
則Moses的解碼器編譯成功。
3.3.2 安裝Moses訓練腳本:
進入moses/scripts目錄,查看Makefile文件。該文件須要指定兩個目錄TARGETDIR和BINDIR。其中,TARGETDIR會存放編譯後的文件,BINDIR須要事先存放3個可執行程序:GIZA++, snt2cooc.out,mkcls(Makefile會調用check-dependencies.pl以檢查是否指定目錄和包含可執行程序)。
咱們在scripts目錄下新建兩個目錄:target和bin,將以前編譯好的GIZA++、snt2cooc.out和mkcls拷貝到bin目錄 下,並將Makefile文件的第13-14行修改成:
TARGETDIR=/home/user/MT/moses/scripts/target
BINDIR=/home/user/MT/moses/scripts/bin
在scripts目錄下輸入命令:
make release
注:運行命令後,可能出現錯誤:/bin/sh: ./check-dependencies.pl: not found,此時須要將scripts/Makefile文件中的@./check-dependencies.pl修改成perl check-dependencies.pl,經過moses郵件列表發現的,至於緣由我暫時也不知道,若是您明白請告訴我,謝謝
編譯完成後,會在TARGETDIR 目錄下建立一個scripts-timestamp目錄,這個目錄中存放編譯後的腳本。編譯後的文件名寫入released-files。編譯後的腳本路徑:SCRIPTS_ROOTDIR=/home/user/MT/moses/scripts/target/scripts- 20100105-1600
至此,Moses安裝成功。
使用時須要聲明環境:
export SCRIPTS_ROOTDIR=/home/user/MT/moses/scripts/target/scripts-YYYYMMDD-HHMM
3.3.3 安裝Moses附加腳本:
(1) 下載相關腳本
從http://www.statmt.org/wmt07/scripts.tgz下載scripts.tgz並解壓:
tar xzf scripts.tgz
這些腳本包括:
Tokenizer scripts/tokenizer.perl
Lowercaser scripts/lowercase.perl
SGML-Wrapper scripts/wrap-xml.perl
(2) 下載中科院計算所ICTCLAS中文分詞工具
(3) 準備數據
中英雙語平行語料庫:train.chn和train.eng(測試集);dev.chn和ref0~3(開發集);
要求已完成英文token及英文句首字母大寫轉小寫。
若是沒有進行預處理,可參考下面:
英文切分:scripts/tokenizer.perl -l en < data/english > data/train.seg.eng.upper
中文切分:使用ICTCLAS實現中文語料分詞,得到切分語料庫train.seg.chn
大小寫轉換:scripts/lowercase.perl < data/ train.seg.eng.upper > data/train.seg.eng
過濾長句:bin/moses-scripts/scripts-YYYYMMDD-HHMM/training/clean-corpus- n.perl data/train.seg chn eng data/train 1 100
4. 構建語言模型
此處訓練一個5元的語言模型,用kndiscount平滑方法,命令以下:
./ngram-count -text train.chn -lm train.chn.gz -order 5 -unk -interpolate -kndiscount -tolower
參數說明:
-text:要訓練的文本,一行一句
-lm:輸出文件名
-order n:語言模型的元數
-unk:未登陸詞,默認是移除未登陸詞
-kndiscount:平滑
-interpolate:插值
至此,語言模型訓練完成。
5. 訓練模型
運行:/home/user/MT/moses/scripts/target/scripts-20100105-1600/training/train-model.perl (舊版是train-factored-phrase-model.perl)
-scripts-root-dir /home/user/moses/scripts/target/scripts-20100105-1600
-root-dir /home/user/MT/moses/data/
-corpus /home/user/MT/moses/data/train -e eng -f chn
-max-phrase-length 10
-alignment-factors grow-diag-final-and
-reordering msd-bidirectional-fe
-lm 0:5:/home/user/moses/data/train.chn.gz
程序會在/home/user/MT/moses/data下創建corpus、giza.eng-chn、giza.chn-eng和model四個目錄。
在model目錄裏,存放着最終結果:配置文件moses.ini、短語表phrase-table.0-0.gz和重排序表reordering- table.msd-fe.0.5.0-0.gz。
這一步耗時較長,慢慢等待,期間能夠上個廁所……..
至此,短語抽取完成。
6. 最小錯誤率訓練
執行最小錯誤率訓練時,必需要採用Moses規定的文件格式。輸入文件是純文本文件,一行一句,沒有任何標記。參考譯文文件也是相同格式。
須要注意的是,Moses規定每一個參考譯文單獨存放在一個文件中。
這裏咱們使用的參考譯文有四個,即ref0~3,運行如下命令:
/home/user/MT/moses/scripts/target/scripts-20100105-1600/training/mert-moses-new.pl \
/home/user/MT/moses/data/dev.eng \
/home/user/MT/moses/data/ref \
/home/user/MT/moses/moses-cmd/src/moses \
/home/user/MT/moses/data/model/moses.ini \
-working-dir /home/MT/moses/data/mert \
-root-dir /home/user/MT/moses/scripts/target/scripts-20100105-1600 \
-nbest 200 \
訓練完成,生成一系列文件。
tail -n 1 run*.cmert.log查看全部迭代的BLEU結果,選擇最好的runXX.moses.ini
用生成的最好的配置文件覆蓋moses.ini,輸入
cp runXX.moses.ini moses.ini
最終生成moses.ini文件,至此,最小錯誤率訓練完成。
7. 解碼
echo "I have a book ." | moses –config moses-tuned.ini
輸出結果含有以下一行:
BEST TRANSLATION: 我 有 一本 書?
說明翻譯成功。