本文是在Niutrans论坛中的系列教程中总结出来的。

1、语料预处理

预处理的结果是生成双语分词之后的文件,该步需要注意的是对规则短语,比如数字、日期、网址等,进行泛化处理。可以用正则方法或者其它方法。注意日期中的点和外文人名中的点和网址中的点和句末标点要区分开来,数字和日期也要区分开来。

其中变化比较大的,比较难处理的,应该是中文的日期,因为它的格式比较多变。从文本中抽取出来中文日期时间(或者更进一步的转化成标准的时间格式),有一个办法,就是用trie树进行抽取,相较于写一大堆翻乱的正则表达式而言,它具有逻辑清晰,扩展简单,代码复杂度低的优点。具体算法过程会在后续的文章中详细解说。就SMT的具体功能而言,在这一步其实只要把稍微规则的时间格式,比如2014-11-7,13:15这类的格式泛化出来就可以了;像诸如【三月8号下午6点半】【后天晚上7点】这类的,没必要也泛化出来,其中包含的数字泛化出来即可,对结果的准确性影响不大。

在泛化之后的双语中(特指不同种语言,比如中英文),最好检查一下泛化的一致性,比如在中文中有多少个数字,英文中也要有对应的数目,时间日期网址等的个数也要相等。

而在文白双语中,因为古文的语法语义跟现在有出入,可以不做处理。这一步可以弱化甚至不做。即只需要简单的分词即可,古文的分词方法也需要斟酌,在实践中我们采取的是一元分词,即一字一词。

2、词对齐

词对齐阶段使用GIZA++进行单向对齐(实现了IBM model 1~5,具体算法我也在学习中),然后结合两个单向对齐结果,利用对称算法生成最终的对齐结果。

对称算法大概是这样的,先根据两个结果生成一个矩阵。$M_{ij}$保存对齐结果:1)i与j双向对齐;2)i对齐j;3)j对齐i;4)i与j没有对齐。

1,把所有的1)节点加入结果集;

2,检查结果集的每个节点的前后左右邻居,有孤立无主的(即只与它相邻的2或者3情况),吸附过去;

3,剩下的孤立的2)或者3)也加入结果集。

完毕。图就不画了。

3、短语抽取

第二步词对齐结果生成一个bit矩阵,1代表对齐,2代表不对齐,其基本单位是第一步分词后的单个词。

该步可算是广义的词对齐,其单位是第二步的对此词对,基于生成的bit矩阵。目标是抽取出双语中的短语对。

短语对需要满足一致性要求。所谓一致性,可简单概括为封闭性和非空性。封闭性指的是短语中包含的词汇的对齐方必在另一个短语中,不外漏;非空性指短语对中至少含有一对单词是对齐了的。

在满足一致性要求下,给出短语对大长度,即可找出所有满足一致性要求的短语对。算法如下:

若要找出长度为len的短语对,对bit矩阵以len为窗口大小水平滑动,逐个check窗口中的短语对是否满足一致性要求,check的标准是窗口框定的集合中没有外部邻居即可。若遇到某列全0,以上列非零列所在行为行。

4、计算短语概率

上一步抽取出来满足一致性的短语对,这一步对短语对的概率进行估计,用极大似然估计,公式大概如下(第一次用mathjax书写公式,看看效果):

\[ p\left(f|e\right)=\frac{count\left(e,f\right)}{count\left(e\right)}\]

这是短语翻译概率,出来两个概率。另外还有双向词汇化翻译概率,再出来两个概率。共4个概率。

5、最大熵调序

这一步根据上一步的结果对短语进行调序,用到了语言模型。

统计机器翻译(SMT)步骤总结的更多相关文章

  1. 自然语言处理(四)统计机器翻译SMT

    1.统计机器翻译三要素 1.翻译模型 2.语言模型 3.排序模型 2.翻译流程 1.双语数据预处理 2.词对齐 3.构造短语翻译表 4.对短语翻译表进行概率估计 5.解码,beam search 6. ...

  2. 基于短语的统计机器翻(PBMT) 开源工具 :Moses

    如何运行Moses 1. Moses的历史 Moses是Pharaoh的升级版本,增加了许多功能.它是一个基于短语的统计机器翻译系统,整个系统用C++语言写成,从训练到解码完全开放源代码,可以运行在L ...

  3. NLP教程(6) - 神经机器翻译、seq2seq与注意力机制

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

  4. 神经机器翻译(NMT)相关资料整理

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 简介 自2013年提出了神经机器翻译系统之后,神经机器翻译系统 ...

  5. 验证Oracle收集统计信息参数granularity数据分析的力度

    最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, ---所有者名字 tabname ...

  6. jacoco统计server端功能测试覆盖率

    jacoco可以统计,功能测试时,server代码调用的覆盖情况.这里对服务器端的java代码进行统计.   操作步骤如下:   第一步:更改server的启动脚本,使用jacocoagent.jar ...

  7. 神经机器翻译 - NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

    论文:NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE 综述 背景及问题 背景: 翻译: 翻译模型学习条件分布 ...

  8. 李航《统计学习方法》CH01

    CH01 统计学方法概论 前言 章节目录 统计学习 监督学习 基本概念 问题的形式化 统计学习三要素 模型 策略 算法 模型评估与模型选择 训练误差与测试误差 过拟合与模型选择 正则化与交叉验证 正则 ...

  9. 测试Oracle统计信息的导出导入

    背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入.比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计 ...

随机推荐

  1. Eclipse中查找接口实现类快捷键

    就是点击某个接口某个方法名字的时候,直接跳到它的某个实现类里面,一般我们习惯对着那个接口的方法按F3,但是这会直接跳到接口类的源码中,那么呵呵,我们换一个ctrl+T 然后自己选择一下实现类就进去了. ...

  2. Mysql分页查询

    取前5条数据 select * from table_name limit 0,5 或 select * from table_name limit 5 取第11条到第15条数据,共5条 select ...

  3. 【POJ】2418 Hardwood Species

    简单字典树. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 128 ty ...

  4. 【HDOJ】2266 How Many Equations Can You Find

    简单DFS. #include <cstdio> #include <cstring> #define MAXN 15 char str[MAXN]; __int64 x; i ...

  5. 《深入Linux内核》 UNIX的一些故事

    Unix文件的类型1.普通文件2.目录3.符号链接4.面向块的设备文件5.面向字符的设备文件6.管道和命名管道7.套接字 点评:不明觉厉 打开文件进程只能访问“打开的”文件.为了打开一个文件,进程调用 ...

  6. Qt入门(17)——组装复杂的控件

    下面是如何把两个窗口部件封装成一个新的组件.首先,我们使用一个自定义的窗口部件作为一个子窗口部件. #include <qapplication.h> #include <qpush ...

  7. NOI题库1814 恼人的青蛙

    1814:恼人的青蛙 总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB 描述 在韩国,有一种小的青蛙.每到晚上,这种青蛙会跳越稻田,从而踩踏稻子.农民在早上看到 ...

  8. BFS 10.1.5.253 1502

    http://10.1.5.253/acmhome/problemdetail.do?&method=showdetail&id=1502 //1502 #include <st ...

  9. JDBC连接SQLServer的几种方式

    第一种:JDBC-ODBC数据库连接桥(需要配置ODBC数据源,不需下载驱动) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con ...

  10. 根据类名查所属jar包

    在开发时经常会参考一些现有的例子,但有些例子只有代码,代码中引用的类所属的jar包却没有明确说明,如何找到一个类所属的jar包,可以通过访问以下网址解决:http://www.findjar.com