GIZA++实现了IBM模型1~5 IBM Model 1详解
IBM model是统计机器翻译中的经典翻译模型,也是基于词的统计机器翻译系统的基础。IBM翻译模型共有5个复杂度依次递增的统计翻译模型,IBM model1是其中最简单的模型,也是其他模型进行计算的基础。IBM模型1仅仅考虑词对词的互译概率,模型2引入了词的位置变化概率,而模型3加入一个词翻译成多个词的概率。
为翻译模型建模
假设任意一个英语句子e和法语句子f,定义f翻译成e的概率为P(e|f),于是将f翻译成e的问题则变成求解
(1)
根据噪声信道模型,统计机器翻译要寻找e使得满足公式(1)。
IBM模型注意到翻译模型中的一个隐含变量信息,及即句子中词语的对位信息:对齐A。于是有:
(2)
假设英文串e的长度为l,记做。法语串f的长度为m,记做。则对齐a可以由一串包含有个值的位置信息记录,表示法语句子中单词对应英语句子单词的位置。,每个值的取值范围为。因此,
(3)
具体的证明参考http://luowei828.blog.163.com/blog/static/31031204201123010316963/
该公式可以理解为:根据英文句子生成一个法语句子以及对齐过程。首先根据英文句子选择法语句子长度,其次选择第一个法语词串的链接位置,然后根据英语句子、法语句子长度、法语句子第一个词对应英语句子的位置选择法语句子的第一个词(比较拗口-_-!)。由此类推,则可以生成整个法语句子。
引出IBM模型1
IBM模型1对公式(3)进行化简,并做出如下假设:
1)假设P(m|e)与目标语言e和源语言长度m无关。
2)假设仅仅依赖于目标语言e的长度l,则
3)假设仅仅依赖于和。
则,。其中叫做给定,的翻译概率。
带入(3)中可得
(4)
由于每个对齐变量的取值范围均为 ,则(2)可改写为
(5)
在引入拉格朗日因子后,求解翻译概率极大值问题转换为求辅助函数在无限定条件下的极大值问题。辅助函数的形式为
(6)
上式对t(f|e)求偏导,得
(7)
令(7)为0,则有
(8)
借助(4)式,则(8)式可改写为
(9)
其中表示在对位中e链接到f的次数。
定义为在给定e的前提下,e链接到f次数的期望为
(10)
同时由替代,则(10)可以表示为
(11)
实际训练数据往往由一系列的翻译对组成,如。因此等式(11)变为
(12)
式中,仅仅作为归一化系数。
公式(5)的右侧部分可以进行化简,具体方法解释参见[Brown, 2003]。根据模型1的特点,可得
(13)
于是,公式(5)则改写为
(14)
将上式带入(8)求偏导,得到
(15)
其中,表示翻译对f在句子f中的count数。同理,表示翻译对e在句子e中的count数。
IBM模型的EM算法
利用公式(12)和(15)即可完成对参数t(f|e)的估计。具体方法如下:
1) 选择的t(f|e)的初始概率。
2) 对每一个句对,使用公式(15)计算的count数。
3) 为每个在句子中的单词e
a) 根据等式计算的取值;
b) 为每个在句子中的单词f,利用公式(12)计算得到新的t(f|e)。
4)重复2)、3)步骤,直到t(f|e)趋于期望值。
GIZA++实现了IBM模型1~5的所有代码,在生成源语言与目标语言之间翻译概率的同时,也产生相应的副产品——“词对齐”。这个副产品成为各种统计机器翻译系统的基石,直到今天,大部分系统仍然首先使用GIZA++对大量平行语料进行词对齐。在阿拉伯语、中文等语言与印欧语系语言的对齐中错误率仍然很高。特别是中文,错误率常常达到30%以上。
这里主要对GIZA++开源代码中的IBM model1实现部分进行总结,同时对词对齐技术进行简单的介绍。
GIZA++中的IBM model1源代码解析
通过对GIZA++开源代码进行剥离,仅仅保留IBM model1相关部分的代码。则训练部分的核心代码为
double StartTraining(int& result) { //开始训练对齐……
读取中英文词汇表 //eTrainVcbList.readVocabList();
读取中英文平行语料信息
新建辞典
构造IBM model1
EM算法迭代
生成词对齐信息
输出计算结果
}
其中,EM算法迭代是整个训练过程的核心代码。在介绍算法迭代源码之前,首先对IBM模型1的数据结构进行简单的介绍。
IBM model1主要数据结构
class model1 : public report_info{
public:
string efFilename;
vcbList& Elist ;
vcbList& Flist ;
float eTotalWCount ; // size of source copus in number of words
float fTotalWCount ; // size of target corpus in number of words
int noEnglishWords;
int noFrenchWords;
tmodel<COUNT, PROB>&tTable;
Vector<WordEntry>& evlist ;
Vector<WordEntry>& fvlist ;
public:
void initialize_table_uniformly();
int em_with_tricks();
private:
void em_loop();
};
模型1最重要(应该是唯一)的参数就是词汇的翻译概率,其数据保存在tmodel类中。tmodel类的核心数据为hash_map ef。
hash_map的每个单元可以简单表示为
struct{
WordIndex;
WordIndex;
Prob;
Count;
}
即源语言、目标语言词汇ID,二者的翻译概率以及同现count数目。
其它诸如vcbList表示词汇列表信息,而Vector<WordEntry>& evlist则表示该词汇列表中对应的概率信息。
IBM model1核心算法
int em_with_tricks(int noIterations, bool seedModel1, Dictionary& dictionary, bool useDict)
em_with_tricks()是整个迭代算法的核心部分。输入变量noIterations表示循环迭代次数,默认值为5;seedModel1还不是很清楚;useDict表示是否加入词典。该函数的代码部分主要包括
int em_with_tricks(){
for(int it = 1; it <= noIterations; it++){
初始化对齐信息 //initAL();
em迭代 //em_loop();
归一化条件概率 // tTable.normalizeTable(Elist, Flist);
}
}
在每次循环过程中,均会调用em_loop()函数,对读入的每一个句子对,根据tTable中的prob值,计算在这个句子对中,互为翻译对出现的count数目,进而改变tTable中的count值。当所有句子对读完后,根据count改变prob信息,从而完成一次循环。
void em_loop(int it, Perplexity& perp, sentenceHandler& sHandler1, bool seedModel1,
bool dump_alignment, const char* alignfile, Dictionary& dict, bool useDict, Perplexity& viterbi_perp, bool test)
em_loop()在每次循环的过程中均会被调用,一次迭代过程在em_loop()中实现。it表示迭代次数id,perp表示概率信息,viterbi_perp表示viterbi概率。函数的主要实现部分包括
void em_loop(){
while(sHandler1.getNextSentence(sent)){ //获得句子对信息
for(j=1; j <= m; j++){
//entries that map fs to all possible ei in this sentence.
if (it == 1 && !seedModel1){
第一次迭代则获得默认的初始概率
}
else{
for((i=0),(sPtrCachePtr=&sPtrCache[0]); i <= l; i++,sPtrCachePtr++){
修改对应的翻译概率,并记录最优概率对应的位置
}
}
记录最优概率位置并计算交叉熵
cross_entropy += log(denom); //这里的log是以e为底
for(i=0, (sPtrCachePtr=&sPtrCache[0]); i <= l; i++,sPtrCachePtr++){
统计翻译对增加的count数目
}
}
增加prep以及viterbi_perp困惑度因子
计算句子的词对齐
}
}
以上是
GIZA++实现了IBM模型1~5 IBM Model 1详解相关推荐
- 【深度学习】扩散模型(Diffusion Model)详解
[深度学习]扩散模型(Diffusion Model)详解 文章目录 [深度学习]扩散模型(Diffusion Model)详解 1. 介绍 2. 具体方法 2.1 扩散过程 2.2 逆扩散过程 2. ...
- 数仓-维度模型之维度迟到问题处理详解
数仓-维度模型之维度迟到问题处理详解 摘要:在数据仓库项目中,从贴源层(ODS)更新到数据仓库层(DW)时,出现了拉链形式的维表数据更新不及时的情况,从而导致事实表中的该维度列值为空或旧值.需要根据维 ...
- 数据库系统模式(schema)和模型(model)详解
数据库系统模式(schema)和模型(model)详解 数据(data)是描述事物的符号记录. 模型(Model)是现实世界的抽象. 数据模型(Data Model)是数据特征的抽象,是数据库管 ...
- Tribon模型数据抽取之sx700.exe详解
Tribon模型数据抽取之sx700.exe详解 一:简介 网络上关于Tribon模型数据抽取的论文最早流传的是2006哈尔滨工程大学姚竞争的工学硕士学位论文<TRIBON模型的数据抽取及二次开 ...
- 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解
这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...
- 机器学习模型评估指标ROC、AUC详解
我是小z ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的问题(80%都会问到).其实,理解它并不是非常难,但是好多朋友都遇到了一个相同的问题,那就是:每次看书的时候都很明白,但回过 ...
- IBM AIX 5.3 系统管理 -- 系统启动过程详解
一. 启动过程 启动过程包含下面的一些步骤: 1.1启动一个系统的初始步骤是上电自检(Power On Self Test,POST).其目的是验证基本硬件是否处于正常的工作状态.同时初始化内存.键盘 ...
- KVM 虚拟机在 IBM System x 上应用_图文详解桥接网络配置
来自: http://www.ibm.com/developerworks/cn/linux/l-cn-kvm/index.html 文章里值得注意的地方: 虚拟机网卡配置为 virtio,能提高I/ ...
- IBM服务器win7系统忘记密码,图文详解Win7系统忘记开机密码的处理方法
许多小伙伴都遇到过Win7系统忘记开机密码的问题,虽说设置开机密码能保护系统安全,但偶尔也会出现忘记密码的情况,这要怎么办?难道没办法操作系统了吗?别着急,这里图文详解一下Win7系统忘记开机密码的处 ...
最新文章
- Android巩固之事件分发机制
- vuejs兄弟组件之间的通信
- AVEVA软件编程是C语言么,AVEVA PDMS 三维文字工具
- LoadRunner中的参数与变量-产生20位的随机数
- 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
- linux -- 三剑客 |grep - sed -awk
- 模式匹配算法逐步精简
- 《数字图像处理 第三版》(冈萨雷斯)——第十二章 目标识别
- Workbench中直接调用ICEM CFD进行网格划分
- 20210928 | Python案例:构建税费计算函数
- littlevgl教程 Linux,正点原子-手把手教你学LittlevGL
- 虚幻开发工具包发布版本的版本信息
- 解决Github下载速度慢的问题
- php 错误503的原因,CentOS + Apache2.4 + PHP5.6 FPM报503错误
- 【stata】如何快速上手stata软件
- 斯坦福NLP名课带学详解 | CS224n 第15讲 - NLP文本生成任务(NLP通关指南·完结)
- Vue+SpringBoot实现Excel在线预览功能(PS:添加样式比较费劲)
- 4.再模仿一个算术题
- [记录] android源码下载编译
- 教师资格证科目二客观题汇总
热门文章
- Emgucv4.4.0.4099版本PCB开发板纠偏(直线倾斜角度计算方法、确定参考点坐标)MinEnclosingCircle(拟合圆函数)
- 【附源码】计算机毕业设计java中小型医院综合管理系统设计与实现
- XCTF Mary_Morton
- 碎纸片的拼接复原算法及MATLAB实现
- MPAndroidchart,折线图LineChart自定义x轴,使x轴上的值与折线上的点对应
- 计算机机房地砖铺设施工工艺,地砖铺设的方法及铺设施工流程
- 干了一年区块链,工作没了,负债累累
- JavaScript 中的作用域(scope)是指什么?
- 那年漯河曾出走一少年
- 一个matlab遗传算法源程序