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.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 newstest2011.tok.en

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

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

/home/w4tcy/moses/scripts/recaser/truecase.perl --modeltruecase-model.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-- 语言模型: ::(选项可重复)

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-- 对于短语表仅使用条件概率不使用词汇权重

你可能感兴趣的:(自然语言处理)