利用开源工具搭一套汉英翻译系统(二):词对齐

来源:互联网 发布:c语言表达式的值 编辑:程序博客网 时间:2024/06/10 14:49

训练语料是句子级别对齐的,词对齐工具用来从句子对齐中学习到词对齐,对齐这个概念可以理解成为两个词的翻译对应关系。理论知识不再介绍,感兴趣的看《统计机器翻译》

对齐工具有多个,这里选择使用GIZA++,


下载与编译

下载地址:github

下载完,解压后的路径结构:

其实,这里包含了两个工具,一个是GIZA++,一个是mkcls。make一下,编译。我的编译环境是:gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)。

编译完后,看到产生了多个可执行文件:mkcls,GIZA++,snt2cooc.out,plain2snt.out, snt2plain.out,同时看到有一个运行脚本trainGIZA++.sh。为方便使用,可以把这些可执行文件集中到一个bin文件夹中。

运行:


运行trainGIZA++.sh,看到Usage: trainGIZA++.sh vcb1 vcb2 snt,运行该脚本需要三个输入,前两个是两个语言的词汇表,第三个是两种语言的统计信息。下面就来构建所需的三个参数。

plain2snt.out工具是用来得到词汇表vcb的,调用方法:./plain2snt.out  train.ch.seg_stanford.half  train.en.token.half,运行后出现4个新文件。

其中两个vcb文件保存的是词汇表信息,包括:词id,词,词频。


两个snt是对词进行编号后表示的句子,每个句对对应snt文件中的三行,第一行是该句对出现的次数,下面两行是编码后的句子,两个snt不同之处在于一个句对的上下顺序颠倒,这取决于对齐方向。




脚本中的语句

./snt2plain.out $1 $2 $3 PLAIN,根据词汇表把编码文件映射回字符串语料的形式。$1是源端词汇表,$2是目标端词汇表,$3是源端到目标端的snt文件,PLAIN是输出文件名。命令执行完后,出现两个文件。如果语料没有什么问题的话,应该得到的是与训练语料一样的。如果训练语料中有空行,会被处理掉,造成行数减少,但不影响对应关系。如果对自己的训练语料比较自信,可以省去上面的该步。

如果想使用IBM Model 4 或是HMM Model,那就需要使用mkcls对词做聚类,相关文章见 Franz Josef Och, An Efficient Method for Determining Bilingual Word Classes

mkcls

常用参数:

-n 训练迭代次数,默认1次,较大的数值会得到较好的结果

-m 最低词频限制

-c 指定类别的数量

-p 待聚类的训练语料

-V 输出文件名,一般后缀是.vcb.classes

opt 优化运行

还有许多其他的参数,可以看其cpp文件。

聚类完后,得到两个文件,一个是.vcb.classes(词和类别的映射),另一个是.vcb.classes.cats(类别和词的映射),保存的都是聚类信息。

GIZA++是词语对齐算法,参数:

-S 源端词汇表

-T 目标端词汇表

-C 源端到目标端的snt文件

-CoocurrenceFile  共现文件 .cooc

-o 输出文件名的前缀

-d 指定字典文件名(字典文件的格式是两列,第一列是目标词id(Targetwordid),第二列是sourcewordid,词典按目标词编号排序,词典用来在model1中做计数和对齐的初始化)

-l(小写L) 指定日志文件名

-log 0代表写日志,1代表不写日志

-m1 ...-m6 :IBM model n 的迭代次数,m1默认5次,m2默认0次,m3默认5次,m4默认5次,m5默认0次,m6默认0次,mh默认5次。

-mh HMM model 的迭代次数

-p0 IBM-3/4 中的p0参数值

-m5p0 IBM model 5 中p_0参数值

其他的参数,见cpp文件


trainGIZA++.sh所需要的三个参数都有了,就可以跑了。修改脚本中每个可执行程序的路径,调用该sh,由于时间比较长,使用nohup提交比较合适:

nohup ./trainGIZA++.sh  train.ch.seg_stanford.half.vcb  train.en.token.half.vcb  train.ch.seg_stanford.half_train.en.token.half.snt &。发现GIZA++.log会报错,ERROR: NO COOCURRENCE FILE GIVEN!  这个时候就要用另一工具snt2cooc.out来做共现统计了。

snt2cooc.out 共现统计,Usage: ./snt2cooc.out vcb1 vcb2 snt12 >ch_en.cooc ,执行完毕会得到共现文件,文件内容是所有的共现词对,第一列是源端词id,第二列是目标端词id。


这个时候重新跑GIZA++程序,nohup ./GIZA++ -S  train.ch.seg_stanford.half.vcb -T train.en.token.half.vcb -C train.ch.seg_stanford.half_train.en.token.half.snt -p0 0.98 -o GIZA++ -CoocurrenceFile  ch_en.cooc > GIZA++.log 2>&1 & 

程序执行完毕后,出现了多个文件:

GIZA++.A3.final :IBM model3 的对齐结果,第一行是句对信息,第二行是目标语言句子,第三行是源语言中每个词与目标语言词的对应关系(1对多)


GIZA++.a3.final:记录的是源端词位置和目标端词位置的概率关系,第一列是源端词位置i,第二列是目标端词位置j,第三列是源端句子长度l,第四列是目标端句子长度m,第五列是概率P(i|j,l,m)。位变(distortion)模型。


GIZA++.n3.final:繁衍率(fertility)文件,第一列是词编号,第n列是该单词被翻译成n-2个目标单词的概率p(n|id)。


GIZA++.t3.final:翻译概率表。第一列是源语言词编号,第二列是目标语言词编号,第三列是翻译概率P(t|s)。


GIZA++.d3.final:反向的位变模型,与a3类似,i和j交换。

GIZA++.D4.final:IBM model4中的位变模型,


GIZA++.d4.final:IBM model4 翻译表



GIZA++.trn.src.vcb:源端词汇表

GIZA++.trn.trg.vcb:目标端词汇表

GIZA++.Decoder.config:用作解码的配置文件,我们用GIZA++作词对齐功能,但它是一套翻译系统。

GIZA++.gizacfg:保存了所有的配置参数

GIZA++.perp:保存了训练过程中,多个模型每轮迭代的困惑度perlexity

GIZA++.p0_3.final:保存了p0参数值,不插入空值的概率

GIZA++.tst.src.vcb:由于没设置测试集,为空文件

GIZA++.tst.trg.vcb:由于没设置测试集,为空文件







0 0
原创粉丝点击