一、BinaryPhraseTableswithOn-demandLoading
顾名思义,就是moses具有这样一个功能:将词表(phrasetable)二值化并按所需(所需要翻译的内容)载入需要的部分。这是因为一个实际的翻译系统,其phrasetable通常会非常大,大到很难一次性将其载入内存。
首先需要将标准ascii编码的phrasetables转化成二值化的格式,以下是其一个例子(标准phrase-table,有5个得分的那种):
exportLC_ALL=C
catphrase-table|sort|bin/processPhraseTable\
-ttable00--nscores5-outphrase-table
其中参数:
·-ttableintintstring--最后的string表示的是要转换的phrasetable名称,如果从标准输入读取,该参数设为'-',如上例所示
·-outstring--自己设定的输出的二值化ttable前缀名
·-nscoresint--ttable中打分的个数(例如这里是5)
注意,若你的数据是UTF-8格式编码的,你需要先设定一下你的系统环境变量,即exportLC_ALL=C,之后再sort(排序),当然如果你输入的phrasetable是已经排序好的,可略过这一步。得到的二值化phrasetable如下所示:
phrase-table.binphr.idx
phrase-table.binphr.srctree
phrase-table.binphr.srcvoc
phrase-table.binphr.tgtdata
phrase-table.binphr.tgtvoc
二、词对词对齐输出(Word-to-wordalignment)
在做解码的时候,有两个参数可以帮助输出最后的短语对齐信息。这两个参数分别是:
-alignment-output-file[file]
这个将在做完翻译(解码)之后将对其信息写入file中。
-print-alignment-info-in-n-best
这个将在生成的n-best文件中,每一个结果之后都另起一行标明其对齐信息。
在这里又要提一下上面二值化得到的5个文件了,如果在对phrasetable二值化的时候,其中.scrtree和.tgtdata的两个文件将以.wa后缀结尾。
三、产生n-Best文件
Moses自然也支持产生n-Best结果(前n个解码时搜索算法搜索到的路径)。你只需要在解码的时候指定生产的n-Best结果存储文件即可。
例如以下是一个示例命令:
moses-fmoses.ini-n-best-listlistfile100<in
执行命令之后,解码后的前100最佳结果将存储在listfile中。
打开n-best文件,可以看到起内部结构如下所示:
0|||wemustdiscussongreatervision.|||d:0-5.5643800-7.0737600\
lm:-36.0974-13.3428tm:-39.6927-47.8438-15.4766-20.50034.99948w:-7|||-9.2298
0|||wemustalsodiscussonavision.|||d:-10-2.34550-1.92155-3.218880-1.51918\
lm:-31.5841-9.96547tm:-42.3438-48.4311-18.913-20.00865.99938w:-8|||-9.26197
0|||itisalsodiscussavision.|||d:-10-1.63574-1.60944-2.70802-1.60944-1.94589-1.08417\
lm:-31.9699-12.155tm:-40.4555-46.8605-14.3549-13.22474.99948w:-7|||-9.31777
N-best文件中的每一行都是由以下内容组成的(它们之间用|||分隔开):
Ø翻译原句编码,例如以上的0表示这些结果都是第一个句子的n-best结果。
Ø翻译结果。
Ø单独成分打分
Ø加权后总得分
这里需要注意的一点是,生成的n-best句子并非每一个都是不一样的,里面可能会完全一样的句子,但是得分不一样,这是因为他们有不同的短语组合方式。
当然,你完全可以只看不同的n-best翻译结果,这个只需要添加关键词distinct就可以完成。如下:
moses-fmoses.ini-n-best-listlistfile100<in
这样,在有相同的句子出现的时候,只出现概率最高的那句。
四、MinimumBayesRiskDecoding
最小贝叶斯风险解码由ShankarKumar和BillByrne在04年提出的HLT/NAACL上提出。大致说来,选择这种方法decoding(翻译)的时候,我们并不选择最大概率的翻译结果,此时我们输出最可能是正确结果的翻译(thetranslationthatismostsimilartothemostlikelytranslations),这需要一个相似度准则来估测相似性,Moses中使用到的是BLEU打分。
使用MBR做decoding非常简单,只需要在解码时添加参数-mbr即可。
moses-fmoses.ini-mbr<in
MBR解码默认对top200的翻译结果进行选择,选出其中满足最小贝叶斯风险的结果,当然这个数值是可以修改的,方法是通过参数-mbr-size指定,例如:
moses-fmoses.ini-decoder-type1-mbr-size100<in
MBR解码需要翻译分数转换成为概率。默认的是使用log概率,但是通过scalingscores你可能可以得到更好地结果。例如可使用以下指令:
moses-fmoses.ini-decoder-type1-mbr-scale0.5<in
五、LatticeMBRandConsensusDecoding
事实上,在EMR解码被提出后一些年内,研究人员对其进行扩展优化,使得翻译解码速度可以更快同时我们也可以得到更好的翻译结果。具体的论文可参见Trombleetal(2008),Kumaretal(2009),DeNeroetal(2009),而ngram后验(ngramposteriors,是LatticeMBR解码所需的)和ngram期望(ngramexpectations,是Consensus解码所需的)都是使用论文DeNeroetal(2010)中所描述的一个算法计算得到的。现在moses所作的latticeMBR和consensus解码都是基于n-best重排序来完成的。话句话说,我们假设最佳的翻译结果一定在我们的n-best结果中。
下面介绍一下影响latticembr和consensus解码结果的一些可设定参数:
·-lmbr--使用LatticeMBR解码
·-con--使用Consensus解码
·-mbr-size--后接数字,指明MBR解码时的n-bestlist取值大小
·-mbr-scale--后接数字,指明MBR解码时的幅度基准因子
·-lmbr-pruning-factor--meanwordspernodeinprunedlattice,如论文Trombleetal(2008)所述,默认值为30
而latticeMBR有更多的参数可以设定,也都是论文Trombleetal(2008)所提到的,可通过以下参数设定:
·-lmbr-p--后接数值表明unigram精度(缺省情况下默认值为0.8)
·-lmbr-r--后接数值表明ngram准确比率(precisionratio,默认值为0.6)
·-lmbr- thetasTHETASInsteadofspecifyingpandr,latticeMBRcanbeconfiguredbyspecifyingallthengramweightsandthelengthpenalty(5numbers).Thisisdescribedfullyinthereferences.
·-lmbr-map-weightWEIGHTTheweightgiventothemaphypothesis(default0)
从上述介绍可以发现,latticeMBR有非常多的参数需要设置,moses提供了一个字格搜索(gridsearch)的可执行文件。编译成功过后,你可以找到一个lmbrgrid存放在bin下面。一条典型的指令如下所示:
./lmbrgrid-lmbr-p0.4,0.6,0.8-lmbr-r0.4,0.6,0.8-mbr-scale0.1,0.2,0.5,1-lmbr-pruning-factor\
30-mbr-size1000-fmoses.ini-iinput.txt
运行之后得到的结果每一行的格式如下所示:
<sentence-id>|||<p><r><pruning-factor><scale>|||<translation>
就目前的mosesLatticeMBR实验结果看来,当以上参数挑选合适的时候,latticeMBR能使得系统得到的翻译结果有一个小程度的提高(阿拉伯语数据集上提高了0.4)。以下是moses团队对一定数量的句子实验得到的一个优化参数设置:
-lmbr-p0.8-lmbr-r0.8-mbr-scale5-lmbr-pruning-factor50
六、处理不认识的短语
在moses解码的时候,有可能会遇到phrasetable中没有的短语,而在默认的情况下,moses会将这未翻译的短语也放置在其余翻译好的短语中进行排序,结果可能会影响最后翻译出来的句子的短语顺序。这时候你可以选择放弃未翻译的短语(不将其放入翻译结果中)。
可以通过解码时加入参数-drop-unknown来实现该功能。
当我们实际完成翻译任务时,放弃未知的短语可以让最后的BLEU得分提高一些,但是人们对该句话的理解程度变化未知,有可能人们反而因缺失成分而更加不理解。
七、EarlyDiscardingofHypotheses
在束搜索(BeamSearch)中,许多假说被创建,但其中一些太不合理以至于甚至无法进入堆中。对于它们中的许多,甚至在建立假设之前就可以明确它是没有用的。去掉它们会对速度的提升也有帮助,当然也有可能丢掉了一种合理的翻译可能性,我们一般将阈值设在0.5和1之间。用法如下指令所示:
-early-discarding-thresholdTHRESHOLD--使用提前丢弃一部分假设信息,设定的阈值为THRESHOLD(default:0=notused)。
八、多翻译表和备选模型
Moses允许使用多个翻译表,一共有两种方法可以使用它们。
1)两个翻译短语表(translationtables)用于评分的:这意味着,每一个翻译选项在每个表中都选一次,并各自打分。同时这样的做法,也要求对于翻译的内容,两张表中都要有对应的翻译结果:如果其中一个表中没有,则这种情况下没办法得到结果。
2)其中一个翻译短语表用于评分:翻译选项先从一个表中选,再从另一张表中收集其它选项。如果相同的翻译选项在多个表中发现,则每次遇见这种情况,一个新的不同的翻译结果都会被创建,但它们的分数是不同的。
在任何情况下,每一个翻译表有它自己的一组权重。
首先,你需要的指定moses.ini配置文件的[ttable-file]选项,例如:
[ttable-file]
005/my-dir/table1
005/my-dir/table2
第二步,你需要在配置文件中[weight-t]设置适当数量的权重,在我们的例子中,总共是10个参数(每个表5个)。
第三,你需要在配置文件[mapping]下指定这些表是如何使用的。像上文提到的,有两种使用方法:
使用两个表进行打分:
[mapping]
T0
T1
任一表的得分:
[mapping]
0T0
1T1
注:这里我们使用的其实是moses使用不同解码路径的能力。“T”前面的数字定义一条解码路径,因此,在第二个例子中是两个不同的指定的路径进行解码。解码路径也可能包含额外的映射的步骤,例如使用不同的因素(factors)的生成步骤和翻译的步骤。
另外请注意,有没有办法做到让系统“在翻译选项同时出现在两张表中时,使用两张表的结果。而当结果只出现在一张表时,只使用出现的这张表”。为了有效地使用这个选项,你可能会创建第三个表,其包含的上述两个翻译短语表的交集,并从每个表中删除共享短语对。
退避模型(BackoffModels):您可能想更倾向于使用第一个表,而只在没有翻译选项在第一个表时使用第二个翻译短语表。换句话说,第二个表仅仅是回退的表格可用于未知的第一个表中的单词和短语。
例如,如果你有两个翻译表,你想使用第二个未知词,你应该指定:
[decoding-graph-backoff]
0
1
0表示对第一个表,使用全部内容,1表示,第二个表用于对未知的大小为1的n-gram,进行使用。