GIZA++ 使用说明书

来源:互联网 发布:国外的源码网站 编辑:程序博客网 时间:2024/04/20 09:08
 

首先下载1500句平行句对,作为GIZA++的实验语料

利用java程序将1500句对进行分离,注意里面有一句中文多加了一个回车符,找到并删掉,然后执行该java程序。得到汉英分离的两个文件chinese和english两个文件。接下来利用中科院的分词工具和EGYPT分别实现对中文和英文进行分词,生成两个文件chinese_segment.txt和english.segment.txt。
这里用的编译器是gcc version 4.1.3 20080704 (prerelease) (Ubuntu 4.1.2-29ubuntu1)
如果不是的话,就要用下述方法
//========
sudo apt-get install gcc-4.1
接下来,将gcc-4.1设置为默认的gcc编译器
sudo mv /usr/bin/gcc /usr/bin/gcc.bak
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
//========这样就可以了(可以通过查看 gcc--version 查看当前的默认gcc版本号)
进入giza-pp/GIZA++-v2,找到Makefile文件,将-DBINARY_SEARCH_FOR_TTABLE删掉
回到giza-pp下,运行make命令,耐心等待中~
在giza++目录下建立一个tool文件夹,用于存放等一下要用的可执行程序
cd GIZA++-v2/
将plain2snt.out,snt2cooc.out,GIZA++复制到tool中,同时把chinese_segment.txt和english.segment.txt也放进去
cd /home/administrator/Environment/giza++/tool/
接下来,执行下面的指令来完成将普通文本转化为 GIZA++ 格式
./plain2snt.out chinese_segment.txt english_segment.txt
此时tool目录下有如下内容:
chinese_segment_english_segment.snt  english_segment.txt
chinese_segment.txt                  english_segment.vcb
chinese_segment.vcb                  plain2snt.out
english_segment_chinese_segment.snt
对上述新生成的文件做一下说明:
chinese_segment.vcb(english_segment.vcb)
• 单词编号
• 汉语句子中的单词
• 单词的出现次数
• chinese_segment_english_segment.snt(english_segment_chinese_segment.snt)
• 每个句子对出现的次数
• 汉语句子中的单词编号
• 英语句子中的token编号
注: 0是保留给特殊的“空”token。
接下来是获得共线文件
./snt2cooc.out chinese_segment.vcb english_segment.vcb chinese_segment_english_segment.snt > chn_eng.cooc
./snt2cooc.out english_segment.vcb chinese_segment.vcb english_segment_chinese_segment.snt > eng_chn.cooc
接下来构建GIZA++所需的mkcls文件,首先把mkcls-v2下的mkcls拷贝到tool里面,执行下面命令
./mkcls -pchinese_segment.txt -Vchinese.vcb.classes opt
./mkcls -penglish_segment.txt -Venglish.vcb.classes opt
其中对上述的两个命令的参数做一些说明:
• 参数设置
• -n:表示训练迭代次数,默认1次
• -p:需要聚类的已分词文本
• -V:输出信息
• opt:优化运行
生成的文件
• chinese.vcb.classes(english.vcb.classes)
• 按字母表序的单词
• 单词词类
• chinese.vcb.classes.cats(english.vcb.classes.cats)
• 单词词类
• 对应词类的一组单词
接下来运行GIZA++来实现对齐操作
./GIZA++ -S chinese_segment.vcb –T english_segment.vcb –C chinese_segment_english_segment.snt -CoocurrenceFile chn_eng.cooc  -O c2e
./GIZA++ -S english_segment.vcb –T chinese_segment.vcb –C english_segment_chinese_segment.snt -CoocurrenceFile eng_chn.cooc  -O e2c
这个时候遇到这个问题
administrator@ubuntu:~/Environment/giza++/tool$ ./GIZA++ -S english_segment.vcb –T chinese_segment.vcb –C english_segment_chinese_segment.snt -CoocurrenceFile eng_chn.cooc  -O e2c
*** buffer overflow detected ***: ./GIZA++ terminated
解决方法是
修改原文件 GIZA++-V2/file_spec.h
将第40行:char time_stmp[17];
修改为: char time_stmp[20];
重新编译即可。
然后将新的GIZA++拷贝到tool里面,执行刚才那两条命令就可以了,最后在tool中存放这么一些结果
c2e.a3.final                         e2c.actual.ti.final
c2e.A3.final                         e2c.d3.final
c2e.actual.ti.final                  e2c.d4.final
c2e.d3.final                         e2c.D4.final
c2e.d4.final                         e2c.Decoder.config
c2e.D4.final                         e2c.gizacfg
c2e.Decoder.config                   e2c.n3.final
c2e.gizacfg                          e2c.p0_3.final
c2e.n3.final                         e2c.perp
c2e.p0_3.final                       e2c.t3.final
c2e.perp                             e2c.ti.final
c2e.t3.final                         e2c.trn.src.vcb
c2e.ti.final                         e2c.trn.trg.vcb
c2e.trn.src.vcb                      e2c.tst.src.vcb
c2e.trn.trg.vcb                      e2c.tst.trg.vcb
c2e.tst.src.vcb                      eng_chn.cooc
c2e.tst.trg.vcb                      english_segment_chinese_segment.snt
chinese_segment_english_segment.snt  english_segment.txt
chinese_segment.txt                  english_segment.vcb
chinese_segment.vcb                  english.vcb.classes
chinese.vcb.classes                  english.vcb.classes.cats
chinese.vcb.classes.cats             GIZA++
chn_eng.cooc                         mkcls
e2c.a3.final                         plain2snt.out
e2c.A3.final                         snt2cooc.out
以c2e开头的作为从中文对齐英文的相关数据,以e2c开头的作为英文到中文的相关数据,下面以(汉-英为例),说明一些生成结果的意义:
• Decoder.config
• 用于ISI Rewrite Decoder解码器

•  trn.src.vcb,trn.trg.vcb
• 类似于chinese.vcb和english.vcb文件

•  tst.src.vcb,tst.trg.vcb
• 空文件

• ti.final
• 从英文到中文的词语对齐

• 词语对齐通过token编号表示,并在每组数字后给出相应的对齐概率
• 例如:
3 0 0.237882
11 0 0.900132

• actual.ti.final
• 从英文到中文的词语对齐
• 词语对齐通过实际 token 表示,并在每组 token 后给出相应的对齐概率
• 例如:
polished 闪闪 1
pain 割 0.0173626

• A3.final
• 记录了在 IBM Model 3迭代训练后,每个句对的一个最佳对齐 (Viterbi Alignment)。
• 第一行是一个可用于作为对齐可视化工具的标题的一个标签,包含训练的语料库中的有关该句编号的信息在训练语料,句子长度和对齐概率。
• 第二行是目标语言,第三行是源语言,源语言中的每个记号之后是一个零或多个数字的集合,这些数字代表的与源语言记号连接的目标语言记号位置。
• perp
• 在训练的最后生成,提出了每次训练迭代的困惑度值的列表
• a3.final
• 包含的形式如下的表
• i j l m p ( i / j, l, m)
• j = position of target sentence
• i = position of source sentence
• l = length of the source sentence
• m = length of the target sentence
• p( i | j, l, m) = is the probability that a source word in position i is moved to position j in a pair of sentences of length l and m  
• d3.final
• 类似于a3.final文件,只是 交换了i 和 j 的位置
• n3.final
• 源语言 token 的 fertility 分别为 0,1,…,n 时的概率表,形式如下:
source__id p0 p1 p2 …. pn,p0 是fertility为0时的概率
• 例如:
1 0.475861 0.282418 0.133455 0.0653083 0.0329326 0.00844979 0.0014008
10 0.249747 0.000107778 0.307767 0.192208 0.0641439 0.15016 0.0358886
11 0.397111 0.390421 0.19925 0.013382 2.21286e-05 0 0
12 0.0163432 0.560621 0.374745 0.00231588 0 0 0
•  t3.final
• IBM Model 3训练后的翻译表,形式如下:
s_id t_id P(t_id/s_id)
s_id:源语言token编号
t_id:目标语言token编号
P(t_id / s_id):源语言token翻译为目标语言token的概率
• D4.final
• IBM Model 4的distortion表
• gizacfg
• 包含训练当中所用的所用参数设置
• 训练可以精确复制
到此,giza++使用完毕~