Fast-align/subword-nmt 使用记录
###### 在Linux系统下运行 #######
实验步骤:
Step 1:
从github上下载工具包
wget https://github.com/clab/fast_align/archive/master.zip
Step 2:
将语料处理成 “ 源语言 ||| 目标语言 ” 的形式。
Step 3:
安装必要的工具包:
sudo apt-get install libgoogle-perftools-dev libsparsehash-dev
Step 4:
分步执行:
mkdir build
cd build
cmake ..
make
Step 5:
运行代码如下:
##### 生成 源==>目标 的对其方式:
./fast_align -i text.fr-en -d -o -v > forward.align
##### 生成 目标==>源 的对其方式:./fast_align -i text.fr-en -d -o -v -r > reverse.align
##### 可以atools
使用各种标准对称启发法,使用包含的命令来对称化这些参数,例如:
./atools -i forward.align -j reverse.align -c grow-diag-final-and
Step 6:
输出结果为:
####其中一对i-j
表示左语言(按照惯例,源语言)的第i个单词(零索引)与右句的第j个单词(按照约定,目标语言)
0-0 1-1 2-4 3-2 4-3 5-5 6-6
0-0 1-1 2-2 2-3 3-4 4-5
0-0 1-2 2-1 3-3 4-4 5-5
subword--nmt:
安装subword-nmt:
pip install subword-nmt
生成一个字典:
subword-nmt learn-joint-bpe-and-vocab -i en.text -o code --write-vocabulary voc.txt
参数说明如下:
(1) -i 后面的参数是输入的文件名
(2) -o 后面输出的是code文件的文件名
(3) --write-vocabulary 后面是输出字典的文件名
使用BPE解码:
subword-nmt apply-bpe -i e.txt -v code -o result.txt
参数说明如下:
(1) -i 后面是输入的待解码文件名
(2) -c 后面跟着learn-bpe步骤得到的code文件
(3) -o 结果输出文件
文章地址:https://blog.csdn.net/jmh1996/article/details/89286898
Fast-BPE使用文档:
### 问题引出
在做机器翻译时会对语料进行预处理,生成一个词典。为了不让词典太大,一般会通过设置一个阈值,将出现频次大于这个阈值的词加入到
字典当中,但是在神经机器翻译中,如果验证集和测试集中出现了训练集中没有见到过的词,则会严重影响机器翻译的性能。
解决一:back-off表,当出现低频词的时候就去查表
缺点:严重依赖 back-off 表的质量,无法解决未登录词的问题。
解决二:以字符级为单位建模
缺点:模型颗粒度太细,效果不好。
Subword模型:
该模型结合了词级和字符集的有时,从语料中学习到频次高的字符串字串,然后将其形成一个字典,字典中既有词级又有单词级的子串,然后
将这个字典应用到训练的过程中。
在寻找频次高的子串时,使用了bpe编码,但只是将子串进行了编码而已,在解码的时候根据生成的词表做相应的替换。
Fast-BPE工具使用:
1、下载Fast-bpe工具
2、分别运行以下代码:
./fast getvocab input1 input2 > vocab ## extract the vocabulary from one or two text files
./fast learnbpe ncodes input1 input2 > codes ## learn BPE codes from one or two text files
3、调用python接口进行bpe编码:
import fastBPE
bpe = fastBPE.fastBPE(codes_path,vocab_path)
bpe.apply(['hahahahahahahahaha'])