本文是在Niutrans论坛中的系列教程中总结出来的。
1、语料预处理
预处理的结果是生成双语分词之后的文件,该步需要注意的是对规则短语,比如数字、日期、网址等,进行泛化处理。可以用正则方法或者其它方法。注意日期中的点和外文人名中的点和网址中的点和句末标点要区分开来,数字和日期也要区分开来。
其中变化比较大的,比较难处理的,应该是中文的日期,因为它的格式比较多变。从文本中抽取出来中文日期时间(或者更进一步的转化成标准的时间格式),有一个办法,就是用trie树进行抽取,相较于写一大堆翻乱的正则表达式而言,它具有逻辑清晰,扩展简单,代码复杂度低的优点。具体算法过程会在后续的文章中详细解说。就SMT的具体功能而言,在这一步其实只要把稍微规则的时间格式,比如2014-11-7,13:15这类的格式泛化出来就可以了;像诸如【三月8号下午6点半】【后天晚上7点】这类的,没必要也泛化出来,其中包含的数字泛化出来即可,对结果的准确性影响不大。
在泛化之后的双语中(特指不同种语言,比如中英文),最好检查一下泛化的一致性,比如在中文中有多少个数字,英文中也要有对应的数目,时间日期网址等的个数也要相等。
而在文白双语中,因为古文的语法语义跟现在有出入,可以不做处理。这一步可以弱化甚至不做。即只需要简单的分词即可,古文的分词方法也需要斟酌,在实践中我们采取的是一元分词,即一字一词。
2、词对齐
词对齐阶段使用GIZA++进行单向对齐(实现了IBM model 1~5,具体算法我也在学习中),然后结合两个单向对齐结果,利用对称算法生成最终的对齐结果。
对称算法大概是这样的,先根据两个结果生成一个矩阵。Mij保存对齐结果:1)i与j双向对齐;2)i对齐j;3)j对齐i;4)i与j没有对齐。
1,把所有的1)节点加入结果集;
2,检查结果集的每个节点的前后左右邻居,有孤立无主的(即只与它相邻的2或者3情况),吸附过去;
3,剩下的孤立的2)或者3)也加入结果集。
完毕。图就不画了。