使用GIZA++进行词对齐

本文记录一下使用词对齐工具 GIZA++ 进行词对齐的操作过程。

为什么要做词对齐

GIZA++ 是基于统计方法的词对齐模型,通过它我们可以对两个句子中相关性最高的词进行对齐操作,具体可见下图的例子:

img

为什么要做词对齐呢?由于目前我在做 paraphrase 相关的工作,所谓 paraphrase,也即复述,分为 paraphrase detectionparaphrase generation,就是给你两个句子,要求判断这两个句子是不是表达了同一个语义(paraphrase detection, 句对匹配任务)或者给你一个句子,要求生成另外一个与之意思相同的句子(paraphrase generation, 生成类任务),那么跟黄老师讨论了之后,他的想法是咱们可不可以通过一些 data augmentation 的手段,找到或者生成更多的 paraphrase 句对,从而让模型能够从这些数据中学到更多的 pattern,进而提高模型的泛化能力。那么其中一个 idea 就是:通过词对齐,得到其他 paraphrase 数据集中的对齐信息,然后随机 mask 掉两个句子中的部分词语,得到一些新的数据,然后将这些数据作为原始 paraphrase 数据集的扩充。当然这只是最初的一个想法,后期还有很大的改进空间,具体可以参考 ACL 2019 的论文《Decomposable Neural Paraphrase Generation》。

使用 GIZA++ 进行词对齐操作

准备平行语料

首先,我们准备一下要进行词对齐的文件,这里为了演示的方便,就简单的使用只有两个句对的文件。按理说要进行对齐的文件应该包含源语言和目标语言 (对于机器翻译来说),由于我们这里是单语 paraphrase 的任务,因此呢可以认为源语言和目标语言都是英语。

text_a.txt: 可以认为是源语言

1
2
Can anyone read minds ?
How do I lose weight faster ?

text_b.txt: 可以认为是目标语言,其中的句子与 text_a.txt 中的句子按行对应

1
2
How can we read someone 's mind ?
How do I reduce weight rapidly ?

下载并编译 GIZA++

1
2
3
$ git clone https://github.com/moses-smt/giza-pp.git.git
$ cd giza-pp
$ make

上面三步分别是克隆模型到本地(默认下载到 /home/username 下)、进入 giza-pp 文件夹、编译文件。编译完会在 GIZA++-v2/ 和 mkcls-v2/ 目录下生成以下可执行文件:
plain2snt.outsnt2cooc.outGIZA++mkcls,将这四个程序移动到工作目录workspace下。

img

运行命令

运行命令构建 GIZA++ 所需的文件

plain2snt.out 命令

plain2snt.out 命令将普通文本转化为 GIZA++ 格式

1
./plain2snt.out text_a.txt text_b.txt

将会生成 text_a.vcb、text_b.vcb、text_a_text_b.snt、text_b_text_a.snt 四个文件。

text_a.vcb (text_b.vcb):词汇文件,统计句子中单词出现的次数,格式为 id || token || count

1
2
3
4
5
6
7
8
9
10
11
2 Can 1
3 anyone 1
4 read 1
5 minds 1
6 ? 2
7 How 1
8 do 1
9 I 1
10 lose 1
11 weight 1
12 faster 1
1
2
3
4
5
"""
• 单词id
• 单词id所对应的单词
• 单词的出现次数
"""

text_a_text_b.snt (text_b_text_a.snt):

1
2
3
4
5
6
1
2 3 4 5 6
2 3 4 5 6 7 8 9
1
7 8 9 10 11 12 6
2 10 11 12 13 14 9
1
2
3
4
5
6
"""
• 每个句子对出现的次数
• text_a.txt 句子中的单词编号
• text_b.txt 句子中的单词编号
• 其中0是保留给特殊的"空" token
"""

snt2cooc.out 命令

snt2cooc.out 命令生成共现文件

1
2
./snt2cooc.out text_a.vcb text_b.vcb text_a_text_b.snt > text_a_text_b.cooc
./snt2cooc.out text_b.vcb text_a.vcb text_b_text_a.snt > text_b_text_a.cooc

text_a_text_b.cooc (text_b_text_a.cooc)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10
0 11
0 12
0 13
0 14
...

mkcls 命令

mkcls 命令构建 GIZA++ 所需的mkcls文件,生成词类

1
2
./mkcls -ptext_a.txt -Vtext_a.vcb.classes opt
./mkcls -ptext_b.txt -Vtext_b.vcb.classes opt

一些参数:

1
2
3
4
5
6
7
"""
• -c: 词类数目
• -n: 表示训练迭代次数,默认1次
• -p:需要聚类的已分词文本 (输入文件)
• -V:输出文件
• opt:优化运行
"""

生成 text_a.vcb.classes、text_b.vcb.classes、text_a.vcb.classes.cats、text_b.vcb.classes.cats 四个文件

text_a.vcb.classes (text_b.vcb.classes),格式为:单词 || 单词所属类别

1
2
3
4
5
6
7
8
9
10
11
?	6
Can 7
How 8
I 9
anyone 10
do 4
faster 12
lose 13
minds 2
read 3
weight 5

text_a.vcb.classes.cats (text_b.vcb.classes.cats), 格式为:单词词类 || 对应词类的一组单词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0:$,
1:
2:minds,
3:read,
4:do,
5:weight,
6:?,
7:Can,
8:How,
9:I,
10:anyone,
11:
12:faster,
13:lose,

运行GIZA++

先在当前目录新建两个输出文件夹a2b、b2a (可以随便起,最好对应起来)

1
2
$ ./GIZA++ -S text_a.vcb -T text_b.vcb -C text_a_text_b.snt -CoocurrenceFile text_a_text_b.cooc -o a2b -OutputPath a2b
$ ./GIZA++ -S text_b.vcb -T text_a.vcb -C text_b_text_a.snt -CoocurrenceFile text_b_text_a.cooc -o b2a -OutputPath b2a

其中 -o 参数是文件前缀。然后会生成很多文件,这里就不一一细讲了 (可以参考文末给出的链接,里面有对生成的文件的详细解释),这里呢我们主要关注一下对齐句子的可视化。

词对齐对称化和可视化

注:对称化和可视化方法参考并修改自 加勒比海鲜 的 CSDN 博客 使用GIZA++进行词对齐,不过由于博客中的 Python 文件是基于 Python 2.x 的,我这里对其进行了一些修改,使其能够在 Python 3.x 上运行。这是我修改后的 Github 链接:align_sym_plot,包含 align_sym.py 和 align_plot.py 两个脚本,分别用于对齐的对称化和可视化。

对称化

上面的得到的 *.A3.final 文件是单向对齐的,我们这里需要对称化,对称化方法有很多,我们这里使用最流行的 “grow-diag-final-and“ 方法。

1
python align_sym.py a2b.A3.final b2a.A3.final > aligned.grow-diag-final-and

生成 aligned.grow-diag-final-and 文件:

1
2
1-5 2-1 2-3 3-4 6-2 7-1 8-5
1-7 2-1 2-3 3-5 3-6 4-6 5-1 5-2 6-2 7-7

可视化

将两个文件中第一个句子的词对齐结果进行可视化

1
python align_plot.py text_a.txt text_b.txt aligned.grow-diag-final-and 0

可视化效果如下图所示

img

从图中我们可以看出,对齐的效果不是很好,因为 GIZA++ 是基于统计的无监督的模型,因此对齐效果会受到数据量的影响。

参考链接

  1. 使用GIZA++进行词对齐

  2. GIZA++ 实验报告

  3. Using GIZA++ to Obtain Word Alignment Between Bilingual Sentences

  4. GIZA++ Installation and Running Tutorial

-------------本文结束感谢您的阅读-------------

本文标题:使用GIZA++进行词对齐

文章作者:丁鹏

发布时间:2019年08月09日 - 19:08

最后更新:2019年08月09日 - 22:08

原始链接:http://deepon.me/2019/08/09/使用GIZA-进行词对齐/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

给博主投币,共同实现开源世界
0%