Moses工具的配置和小语种平行语料训练SMT完整实现
文章目录
- 一、Moses开源工具安装与基础配置
- 1.1 安装步骤
- 1.2 基础配置
- 二、用小语料训练统计翻译模型完整实现
- 2.1 准备平行语料
- 2.2 训练流程
- 2.3 测试翻译模型
- 2.4 性能评估
- 2.5 注意事项
一、Moses开源工具安装与基础配置
1.1 安装步骤
- 环境准备
# 安装依赖包(以Ubuntu为例)
sudo apt-get update
sudo apt-get install build-essential git subversion libboost-all-dev libxml2-dev \liblzma-dev python3-dev zlib1g-dev libbz2-dev libzstd-dev# 安装cmake(如果版本过低)
sudo apt-get install cmake
- 下载和编译Moses
# 克隆Moses代码仓库
git clone https://github.com/moses-smt/mosesdecoder.git
cd mosesdecoder# 编译Moses
make -f contrib/Makefiles/install-dependencies.gmake
./compile.sh
- 环境变量配置
# 添加到~/.bashrc
export MOSES_ROOT=/path/to/mosesdecoder
export PATH=$MOSES_ROOT/bin:$PATH
source ~/.bashrc
1.2 基础配置
- 创建工作目录结构
moses-training/
├── corpus/ # 存放训练语料
├── model/ # 存放训练模型
├── working/ # 工作目录
└── moses.ini # Moses配置文件
二、用小语料训练统计翻译模型完整实现
2.1 准备平行语料
# 创建训练目录
mkdir -p moses-training/corpus
cd moses-training/corpus# 准备示例小语种平行语料(这里以英语-世界语为例)
# source language (en)
cat > corpus.en << EOF
the cat sat on the mat
the dog ran fast
cats and dogs are pets
the weather is nice today
i like to read books
she went to the market
they are playing football
he bought a new car
we visited the museum
the children are sleeping
EOF# target language (eo - 世界语)
cat > corpus.eo << EOF
la kato sidis sur la mat
la hundo kuris rapide
katoj kaj hundoj estas dorlotbestoj
la vetero estas bela hodiau
mi sxatas legi librojn
sxi iris al la bazaro
ili ludas futbalon
li acxetis novan auxton
ni vizitis la muzeon
la infanoj dormas
EOF
2.2 训练流程
- 预处理语料
# Tokenization(分词)
$MOSES_ROOT/scripts/tokenizer/tokenizer.perl -l en < corpus.en > corpus.tok.en
$MOSES_ROOT/scripts/tokenizer/tokenizer.perl -l en < corpus.eo > corpus.tok.eo# 清理长度差异过大的句子对
$MOSES_ROOT/scripts/training/clean-corpus-n.perl corpus.tok en eo corpus.clean 1 80
- 训练语言模型
# 安装KenLM(语言模型工具)
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir build && cd build
cmake ..
make -j4# 训练3-gram语言模型
cd ../../../moses-training
mkdir -p lm
cat corpus/corpus.tok.eo | $MOSES_ROOT/scripts/tokenizer/lowercase.perl > lm/eo.lowercase
kenlm/build/bin/lmplz -o 3 < lm/eo.lowercase > lm/eo.3gram.arpa
- 训练翻译模型
# 创建训练目录
mkdir -p working# 运行Moses训练脚本
nohup nice $MOSES_ROOT/scripts/training/train-model.perl \--root-dir working \--corpus corpus/corpus.clean \--f en --e eo \--alignment-file --lexical-file \--translation-f2e-file --translation-e2f-file \--cores 4 \>& training.out &
- 创建Moses配置文件
# 创建moses.ini配置文件
cat > moses.ini << EOF
#########################
### MOSES CONFIG FILE ###
########################## input factors
[input-factors]
0# mapping steps, either (T) translation or (G) generation
[mapping]
T 0[distortion-limit]
6# feature functions
[feature]
UnknownWordPenalty
WordPenalty
Distortion
PhraseDictionaryMemory name=TranslationModel0 table-limit=20: 0 0 0 0 path=working/model/phrase-table.gz
LexicalReordering name=LexicalReordering0 num-features=6 type=wbe-msd-bidirectional-fe-allff: 0 0 0 0 0 0 path=working/model/reordering-table.wbe-msd-bidirectional-fe.gz
KENLM name=LM0 factor=0 path=lm/eo.3gram.arpa order=3# dense weights for feature functions
[weight]
UnknownWordPenalty0= 1
WordPenalty0= -1
Distortion0= 0.3
LM0= 0.5
TranslationModel0= 0.2 0.2 0.2 0.2
LexicalReordering0= 0.3 0.3 0.3 0.3 0.3 0.3
EOF
2.3 测试翻译模型
# 使用训练好的模型进行翻译
echo "the cat sat on the mat" | \$MOSES_ROOT/scripts/tokenizer/tokenizer.perl -l en | \$MOSES_ROOT/bin/moses -f moses.ini | \$MOSES_ROOT/scripts/tokenizer/detokenizer.perl -l eo# 批量翻译测试
cat test.en | \$MOSES_ROOT/scripts/tokenizer/tokenizer.perl -l en | \$MOSES_ROOT/bin/moses -f moses.ini | \$MOSES_ROOT/scripts/tokenizer/detokenizer.perl -l eo > translation.eo
2.4 性能评估
# 使用BLEU评分评估翻译质量
# 准备参考译文
cat > reference.eo << EOF
la kato sidis sur la mat
la hundo kuris rapide
katoj kaj hundoj estas dorlotbestoj
EOF# 计算BLEU分数
$MOSES_ROOT/scripts/generic/multi-bleu.perl reference.eo < translation.eo
2.5 注意事项
- 语料规模:对于小语种,需要尽可能收集更多平行语料
- 预处理:根据具体语言特点调整分词和清理策略
- 调参:根据翻译效果调整特征权重和模型参数
- 资源限制:对于资源受限的情况,可减少n-gram阶数或使用更小的模型
这个完整流程展示了如何使用Moses工具训练一个简单的统计机器翻译模型,虽然使用的是示例小语料,但同样的方法可以应用于实际的小语种翻译任务。