• NLP - GIZA++ 实现词对齐



    关于 GIZA++


    安装

    # 下载
    $ git clone https://github.com/moses-smt/giza-pp.git
    
    
    # 进入主目录
    $ cd giza-pp
    
    # 编译
    $ make
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将会在 giza-pp/GIZA++-v2 文件夹下生成 GIZA++, snt2cooc.out 等文件


    使用

    1、将平行语料转化为 GIZA++ 格式(plain2snt.out)

    我在根目录创建 data 文件夹(和 GIZA++-v2 平级),放置平行语料文件:
    data.en, data.zh ,注意需要是分词后的文件。

    $ cd GIZA++-v2/ 
    $ ./plain2snt.out ../data/data.en ../data/data.zh
    
    • 1
    • 2

    这样每个文件都将额外生成两个文件:

    $ tree
    .
    ├── data.en
    ├── data.en.vcb  # 词汇文件 
    ├── data.en_data.zh.snt
    ├── data.zh
    ├── data.zh.vcb
    └── data.zh_data.en.snt
    
    0 directories, 6 files
    
    
    $ wc -l data.e*
    100 data.en
    1495 data.en.vcb
    300 data.en_data.zh.snt
    1895 total
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    $ head data.en.vcb 
    2 Singapore 7
    3 exchange 1
    4 to 96
    5 allow 3
    
    $ head data.en_data.zh.snt 
    1
    2 3 4 5 6 7 
    2 3 4 5 6 
    1
    8 9 10 11 12 13 14 15 4 5 16 17 18 4 19 
    7 8 9 10 11 12 4 13 14 15 6 16 17 3 18 19 20 21 22 23 24 25 26 27 28 16 29 30 
    1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    .snt 文件:
    • 每个句子对出现的次数
    • text_a.txt 句子中的单词编号
    • text_b.txt 句子中的单词编号
    • 其中0是保留给特殊的"空" token


    2、获取共现文件(snt2cooc.out)

    # 查看用法
    $ ./snt2cooc.out -h
    Usage: ./snt2cooc.out vcb1 vcb2 snt12 
    
    • 1
    • 2
    • 3

    经文件保存到

    $ ./snt2cooc.out ../data/data.en.vcb  ../data/data.zh.vcb  ../data/data.en_data.zh.snt  > ../data/en_zh.cooc
    END.
    
    $ ./snt2cooc.out ../data/data.zh.vcb   ../data/data.en.vcb ../data/data.zh_data.en.snt  > ../data/zh_en.cooc
    END.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    $ tail /Users/luyi/Documents/nlp/giza-pp/data/en_zh.cooc 
    1244 1271
    1244 1272
    1244 1273 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、创建 mkcls 文件(mkcls)

    mkcls 位于 giza-pp/mkcls-v2 文件夹
    语法:

    mkcls [-nnum] [-ptrain] [-Vfile] opt

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

    
    $ ./mkcls -p../data/data.en -V../data/data.en.vcb.classes opt
    
    $ ./mkcls -p../data/data.zh -V../data/data.zh.vcb.classes opt
    
    • 1
    • 2
    • 3
    • 4
    • 注意 -p,-V 是和路径连在一起的,中间没有空格。如果路径为相对路径:../data/data.zh,也是连在一起,写作:-p../data/data.zh
    • 运行完成后,每个语种将生成 *.vcb.classes, *.vcb.classes.cats 文件

    *.vcb.classes 格式为:单词 || 单词所属类别
    *.vcb.classes.cats 格式为:单词词类 || 对应词类的一组单词


    4、运行GIZA++

    创建 en2zh, zh2en 两个文件,方便存储结果文件:

    ./GIZA++ -S  ../data/data.en.vcb -T ../data/data.zh.vcb -C ../data/data.en_data.zh.snt  -CoocurrenceFile ../data/en_zh.cooc  -o en2z -OutputPath ../data/en2zh 
    
    ./GIZA++ -S ../data/data.zh.vcb -T ../data/data.en.vcb -C ../data/data.zh_data.en.snt  -CoocurrenceFile ../data/zh_en.cooc -o zh2en -OutputPath ../data/zh2en
    
    • 1
    • 2
    • 3

    将在上述创建的结果文件中,每个目录下会生成 13 个文件。如:

    en2zh $ tree
    .
    ├── en2z.A3.final
    ├── en2z.Decoder.config
    ├── en2z.d3.final
    ├── en2z.d4.final
    ├── en2z.gizacfg
    ├── en2z.n3.final
    ├── en2z.p0_3.final
    ├── en2z.perp
    ├── en2z.t3.final
    ├── en2z.trn.src.vcb
    ├── en2z.trn.trg.vcb
    ├── en2z.tst.src.vcb
    └── en2z.tst.trg.vcb
    
    0 directories, 13 files
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    $ head  en2z.A3.final  en2z.d3.final  en2z.d4.final  en2z.Decoder.config  en2z.gizacfg  en2z.n3.final  en2z.p0_3.final  en2z.perp  en2z.t3.final  en2z.trn.src.vcb  en2z.trn.trg.vcb  en2z.tst.src.vcb  en2z.tst.trg.vcb 
    ==>  en2z.A3.final <==
    1 1 6 100 1
    2 2 6 100 1
    4 3 6 100 1
    5 4 6 100 1
    6 5 6 100 1
    4 1 7 100 1
    4 2 7 100 0.5
    6 2 7 100 0.5
    1 3 7 100 0.5
    4 3 7 100 0.5
    
    ==>  en2z.d3.final <==
    1 1 100 5 1
    2 2 100 5 1
    3 4 100 5 1
    4 5 100 5 1
    5 6 100 5 1
    5 0 100 8 1
    1 1 100 8 1
    2 2 100 8 0.49842
    3 2 100 8 0.00315911
    7 2 100 8 0.49842
    
    ==>  en2z.d4.final <==
    0 74 2 1
    58 74 1 0.500002
    58 74 2 0.499998
    66 74 1 1
    83 74 -40 4.52691e-05
    83 74 2 0.999955
    97 74 -3 1
    89 74 -2 0.499858
    89 74 1 0.500142
    56 74 -11 1
    
    ==>  en2z.Decoder.config <==
    # Template for Configuration File for the Rewrite Decoder
    # Syntax:
    #         <Variable> = <value>
    #         '#' is the comment character
    #================================================================
    #================================================================
    # LANGUAGE MODEL FILE
    # The full path and file name of the language model file:
    LanguageModelFile =
    #================================================================
    
    ==>  en2z.gizacfg <==
    adbackoff 0
    c ../data/data.en_data.zh.snt
    compactadtable 1
    compactalignmentformat 0
    coocurrencefile ../data/en_zh.cooc
    corpusfile ../data/data.en_data.zh.snt
    countcutoff 1e-06
    countcutoffal 1e-05
    countincreasecutoff 1e-06
    countincreasecutoffal 1e-05
    
    ==>  en2z.n3.final <==
    2 0.0950195 0.534289 0.254623 0.0757677 0.017334 0.011483 0 0 0.00574151 0.00574151 
    3 0.0513258 0.618243 0.203737 0.0925842 0.0194914 0.00487292 0.00974571 0 0 0 
    4 0.858273 0.114323 0.0169254 0.00733 0.00210072 0.00104782 0 0 0 0 
    5 0.176389 0.52529 0.180916 0.0587039 0.0240148 0.00800389 0.00800471 0.0153497 0.00332792 0 
    6 0.341513 0.504811 0.0555389 0.0531367 0.0276125 0.0128884 0 0 0.00445369 4.61406e-05 
    7 0.0513258 0.618243 0.203737 0.0925842 0.0194914 0.00487292 0.00974571 0 0 0 
    8 0.498432 0.461809 0.0231669 0.00754107 0.0060336 0 0.00301661 0 0 0 
    9 0.793663 0.149055 0.0281555 0.0239287 0.00346756 0.00172953 0 0 0 0 
    10 0.717249 0.269367 0.00779881 0.00253858 0.00203111 0 0.00101549 0 0 0 
    11 0.173795 0.54683 0.148991 0.0725464 0.0236616 0.00788618 0.007887 0.015124 0.00327898 0 
    
    ==>  en2z.p0_3.final <==
    0.871654
    ==>  en2z.perp <==
    #trnsz	tstsz	iter	model	trn-pp		test-pp		trn-vit-pp		tst-vit-pp
    100	0	0	Model1	1430.24		N/A		52239.7		N/A
    100	0	1	Model1	74.4319		N/A		1192.51		N/A
    100	0	2	Model1	62.5537		N/A		767.593		N/A
    100	0	3	Model1	56.5553		N/A		536.391		N/A
    100	0	4	Model1	53.1902		N/A		416.789		N/A
    100	0	5	HMM	45.7351		N/A		348.286		N/A
    100	0	6	HMM	47.3091		N/A		175.379		N/A
    100	0	7	HMM	40.4043		N/A		99.9964		N/A
    100	0	8	HMM	32.5132		N/A		59.9214		N/A
    
    ==>  en2z.t3.final <==
    0 16 0.468297
    0 18 0.42654
    0 30 0.0609917
    0 31 0.0380113
    0 34 0.00376838
    0 47 0.00239139
    2 2 1
    3 3 0.5
    3 61 0.5
    4 47 1
    
    ==>  en2z.trn.src.vcb <==
    2 Singapore 7
    3 exchange 2
    4 to 73
    5 allow 3
    6 Spac 2
    7 listings 2
    8 SGX 4
    9 is 19
    10 the 138
    11 first 4
    
    ==>  en2z.trn.trg.vcb <==
    2 新加坡 8
    3 交易所 5
    4 允许 3
    5 SPAC 4
    6 上市 9
    7 新交所 5
    8 由此 1
    9 成为 6
    10 亚洲 2
    11 第一 3
    
    ==>  en2z.tst.src.vcb <==
    
    ==>  en2z.tst.trg.vcb <==
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126

    伊织 2022-06-29(三)

  • 相关阅读:
    阿里巴巴内部:2022年全技术栈(架构篇+算法篇+大数据)你值得拥有
    AVL树四种旋转的详细图解
    SpringIOC是什么?
    Spring Boot 邮件发送(五种类型的邮件)
    uniapp 使用图表
    服务service
    java实现物流查询(使用阿里云物流查询接口)
    NCCL源码解析④:建图过程
    DenseNet网络论文学习笔记
    sealos一键部署K8S环境(sealos3.0时代教程过时了,目前已经4.0了,请移步使用Sealos一键安装K8S)
  • 原文地址:https://blog.csdn.net/lovechris00/article/details/125517311