目录
本文版权归Pennyyu0214所有,如需转载本文或引用、复制文中原创内容的,请注明出处。
一、引言
机器翻译任务是自然语言处理中的核心任务之一,在国际交流频繁的当今发挥着重要作用。而机器翻译中目前有很多有待优化的子问题,其中“专用词优化”是重要问题之一,也为NMT算法优化带来挑战。特殊词是指生活中不常见到的、在特定领域中使用频繁的词汇,例如法律名词“上诉程序”,其英文为“appeal procedure”,传统机器翻译模型训练时如果不针对专用词进行优化,很容易翻译成意义相近、但严重不符合行业使用习惯的表达(如“上诉步骤”),就很难保证译文准确度或流畅性。
二、现有方案
目前针对专用词的优化方法主要有如下几种:①专用词语料增量训练。即使用少量包含专用词和译文的平行语料对现有NMT模型进行增量训练,一般采用较小学习率以避免过拟合,同时也会使用冻结参数等措施,上述方法会带来一种类似“微调”的效果,既保证了模型大部分翻译能力,同时也能纠正专用词的误差;②知识修改法。用于难以获取包含专用词句对的场景,此时仅将专用词及其翻译喂入模型训练(即一次backward只计算这一条),使用很小的学习率(-5甚至-6),冻结模型绝大部分网络层(例如Transformer中,只选通Encoder最后一层或最后几层,其余不求导),重复迭代3-10步左右,使模型获得正确的专用词译文知识,也能有效纠正包含该词的句子翻译。
三、存在问题及词约束
上述方案虽能有效优化专用词的翻译,但存在一定的麻烦,那就是应用场景是即时的,即用户可能随时提交新的专用词对请求,此时如果根据新词对再对模型训练,会带来较大的时间消耗,超出了用户的等待限度;且现有方案(尤其知识修改)未必能在真正的整句翻译场景下带来效果。
3.1 词约束
为应对随需求灵活变化的专用词形态,专用词翻译的优化就不能按照传统机器翻译训练的过程进行,因此出现了词约束的专用词优化成果如Lexicon-Constraint
[
1
]
^{[1]}
[1]、Hard lexically constrained translationGBS
[
2
]
^{[2]}
[2]、DBA
[
3
]
^{[3]}
[3]等,Soft lexically constrained translation如Code-Switching
[
4
]
^{[4]}
[4]、术语表约束
[
5
]
^{[5]}
[5]等。词约束在训练过程中对模型的词理解或生成行为施加一定约束范围,确保模型生成预期的结果。例如上述例子“appeal procedure”,词约束中添加“上诉程序”作为约束,模型就会准确地翻译出目标词。从某种意义上可以理解为Prompt方法.
**解释:**模型中近义词表示在向量空间中距离更近(与汉语中的近义词概念有些不同,这里所说的近义词更倾向于同一个英文代表的多个不同中文翻译),因而词约束能够对近义词起到Prompt效果,指导模型生成预期结果。例如上述示例“appeal procedure”,其中“appeal”有上诉、申诉等解释,如果词约束时的追加项为“申诉程序”,则模型也会按新词进行翻译;但这种方式也仅限于近义词,如果两个词语义完全不同,则即使追加也无法正常翻译,如“苹果程序”,可能会导致翻译出现句法、语法错误(不一定会翻译出将原来的“申诉程序”变成“苹果程序”的效果)。
3.2 词约束训练模式
前文提到,专用词的训练模式与一般机器翻译训练不同,前者需要应对变化无常的专用词形态,因而需要加入词约束表示能力。对应的机器翻译训练方法也要有略微调整,我们通过一组示意图说明词约束的训练方式。请看下图:
这是一般机器翻译训练时的输入-输出状态。Encoder输入源语言句子,Decoder输入以BOS符号开头的目标语言句子,调整模型的约束项为目标语言句子(顶部部分)。对于专用词模式的训练,图片说明如下:
如上图,在原机器翻译训练模式基础上,词约束需要在输入状态后追加以“SEP”符分隔的部分目标片段,给予模型有效提示,因而预测译文相应位置时更倾向于参考输入中的目标片段,由此Encoder便产生了对这些片段的关注能力;在专用词预测时,如果追加项的语义同当前解码步的语义相近,则会直接将追加词赋予最大logits状态,实现专用词的正确解码。
一般词约束训练时,会采用多次拼接目标片段的方法,以实现一句话包含多个专用词的场景,如下图:
3.3 片段抽取方法
那么目标片段的选取规则是什么呢?这个没有固定方法,一般使用“泊松分布”方法抽取,即设置两个参数:跨度参数 s s s和泊松均值 λ λ λ,初始时下标为序列的第一个元素,每次抽取时做如下操作:
- 随机从 ( 1 , s ) (1,s) (1,s)的均匀分布生成一个值 m m m,作为跨越量;
- 跳转至当前位置往后的第 m m m个位置;
- 从均值 λ λ λ的泊松分布中随机生成长度p;
- 从2更新的位置开始选取长度为p的片段;
- 跳转至4中选定片段的下一个位置,从1开始。
注: 上述第2、5步跳转后的落点超出序列末尾时,退出循环,不进行任何操作;第4步选取时超出序列长度,则以实际获得的片段为准。
平均遍历长度: 定义平均遍历长度来表示单次抽取后指针沿序列增加的平均跨度,计算方法为跨越量与序列抽取长度之和的期望值,平均遍历长度与跨度参数
s
s
s和泊松均值
λ
λ
λ有紧密联系。假设某次抽取,设置
s
s
s为8,
λ
λ
λ为3.5,则执行单次抽取操作的平均遍历长度为:
E
(
S
)
=
E
(
m
+
p
)
=
E
(
m
)
+
E
(
p
)
E(S)=E(m+p)=E(m)+E(p)
E(S)=E(m+p)=E(m)+E(p)
由于
m
m
m服从
U
(
1
,
8
)
U(1, 8)
U(1,8)分布,
p
p
p服从
P
o
i
s
s
o
n
(
3.5
)
Poisson(3.5)
Poisson(3.5)分布,且相互独立,因此上式结果为:
E
(
S
)
=
E
(
m
)
+
E
(
p
)
=
(
1
+
8
)
/
2
+
3.5
=
8
E(S)=E(m)+E(p)\\=(1+8)/2 + 3.5\\=8
E(S)=E(m)+E(p)=(1+8)/2+3.5=8
得出当前设置下执行一次抽取的平均遍历长度为8.
均衡采样
如果只按上文流程执行片段抽取,很容易造成片段分布不均匀的情况,尤其是当
s
s
s较大时,容易导致起始几个字符的捕捉率较小。可能直观上难以理解,这里使用上文
s
s
s为8,
λ
λ
λ为3.5的设置为例:
对于单个待抽取序列
S
S
S,我们考虑第1个token即
s
1
s_1
s1,现在求
s
1
s_1
s1有被选取成为目标片段的期望值。很容易求出概率为0,为什么呢?因为按上文算法描述,跨度值从1~8之间的均匀分布随机选取,因此最小值为1,抽取的第二步也可以表述为向后跳转至少1个位置,而初始指针就在
s
1
s_1
s1上,因此无论如何
s
1
s_1
s1都不能被选取。
再来分析
s
2
s_2
s2,当
m
m
m为1时,且
p
>
=
1
p>=1
p>=1,
s
2
s_2
s2将会被选取,概率计算如下:
P
s
e
l
e
c
e
t
d
(
s
2
)
=
P
m
(
x
=
1
)
∗
P
p
(
x
>
=
1
)
=
(
1
/
8
)
∗
(
1
−
P
p
(
x
=
0
)
)
≈
0.12122538
P_{selecetd}(s_2)=P_m(x=1) * P_p(x>=1)\\=(1/8) *(1-P_p(x=0))\\≈0.12122538
Pselecetd(s2)=Pm(x=1)∗Pp(x>=1)=(1/8)∗(1−Pp(x=0))≈0.12122538
一般形式: 那么如何求序列中任意
s
i
s_i
si的选取概率呢?一般计算公式是一种递推形式,在泊松片段抽取—命中率的一般求解方法中详细做了介绍。本文我们只使用结论:那就是随着
i
i
i的增长,
P
s
e
l
e
c
e
t
d
(
s
i
)
P_{selecetd}(s_i)
Pselecetd(si)逐渐增大,且增速逐渐变缓(位置
i
i
i与选取概率
P
P
P对照表也在上述链接文章)。
因此为均衡序列不同位置的采样频率,为泊松抽取添加均衡采样机制,方法如下几种:
- s s s值“预热” 类似深度学习模型训练时的学习率预热(Warm_up)思想,泊松抽取的前几步使用较小的 s s s值,并逐渐增加,直到达到设定值;
- Padding前缀 既然高错失率仅发生在序列开始部分,可以抽取前在序列起始插入多个填充值,并在抽取后将误添加的填充值删除。
3.4 为什么是词约束
也许你会问,为什么在Encoder输入部分追加目标提示词,翻译时就能在准确的位置生成这个词呢?比如以下例子:
英文:the amount of this check is a lot less than I expected it to be.
中文:这张支票的金额是比我预期的少了很多。
专用词:amount(金额)
假设没有专用词追加时,“amount”的模型中文翻译会是“额度”而不是“金额”,当我在英文输入后追加“金额”时,结果如下:
英文:the amount of this check is a lot less than I expected it to be. <sep>金额
就能得到纠正后的翻译。论文1中给出的其它示例如下图所示:
为什么译文的“金额”位置的词能够得到精准约束呢?换句话说模型是怎么知道追加的“金额”是指代译文中的“支票的”和“是比我”之间的槽位,而不是如下情况:
中文:这张支票的额度是比我金额的少了很多。 #“额度”没有纠正, “预期”纠正了。
原文给出的描述如下:
可见原文作者是在分析了现有Hard / Soft lexically constrained translation的问题后,提出了当前这种自动挖掘词约束的方法,并未使用双语词典等任何对齐信息,只是简单地在源端拼接目标词,就能够同时保证一般机器翻译和词约束翻译两种任务。
训练过程: 我们还是来看上文那张约束训练时的示意图,上文提到约束训练时会随机从目标句子抽取长度不等的几个片段,追加到输入的末尾(图中的“目标片段”),训练时会参照输入中的目标片段优化输出logits. 因此不妨将这些增补的片段视作标签的另一种形式,即“输入中的标签”。模型在针对目标译文更新参数时,会不断接受来自Encoder的相关片段的向量表示,在这些向量表示作为编码知识的约束下,不断地建立到目标端相同片段的关联。
词类特性: 模型在训练的过程中对logits的主观评价是基于“表示关联的”,即向量表示的空间距离,按照Word2Vec理论也可以理解为词与词之间的相似性(近义或同义词)。解释如下:如果某个词
w
w
w为序列中的ground_truth,则一个收敛状态的生成模型会在
w
w
w的解码时刻将
w
w
w所在位置赋以最大logits,同时词义与
w
w
w相近的其它词也会排名前列,下面是我之前做NMT开发实验时,手写了个训练监视模块,作用是输出当前训练样本的模型预测值,用标签进行对比,同时计算了每个词位置的模型预测top-10结果,输出展示如下:
观察上述几个例子,其中第一个例子里的“能力”是ground_truth,而后面模型预测置信度的前十项中就包含了多个和“能力”含义相近的词,如“实力”、“本事”、“功能”等;示例二里面的“政府”也包含多项如“政府部门”、“国家”、“官方”等近义词,由此证明了模型训练时logits评价的表示关联性(其实这个特性可以解决多个任务需求,比如同义/近义词发现、数据增强等)。由此可知,模型的训练目标并非仅仅是以某个特定词作为约束,而是更符合“词类”特性,就是说当前位置的预测或解码是符合某个“词类”的,这个词类包含了多个与ground_truth含义接近的词。这种词类是模型训练时根据数据分布而自发产生的,它参考了词的用法、以及上下文等信息。
先验分布假设: 我们再从机器翻译数据的总体分布考虑,为什么平行数据喂入模型训练后,模型就获得了翻译能力呢?其中因素就是端到端的词共现性,在一般机器翻译训练时,当某一对词在源端和目标端总是同时出现,模型自然会在它们之间建立关联,从而在推理时能够根据源端词翻译目标端词,此时模型学到了两方面特征:①到底翻译什么词;②在哪个位置翻译;在词约束训练下,当源词+拼接译词和目标译词三者同时出现时,模型也会建立它们之间的特征关联,因此传统“基于源词考虑译词”的方法变成了“基于源词+拼接译词考虑译词”。原文作者在Case study中也做了类似分析,实验结果表明模型能够获得源词和拼接词的对齐信息,看下图。
那么源词和拼接译词训练时分别起到什么作用呢?当Encoder接受带有目标片段的输入后,模型会根据源词获得目标词的翻译能力,同时受到拼接部分的影响又会根据拼接词调整目标词内容。由于源词是位于符合源语言语法的上下文的,因此源词够指导模型在正确的位置输出目标词,这也是一般机器翻译模型训练时的行为;而拼接词是后缀在句尾的,它与目标词在词形上保持了一致性,此外不再包含任何的上下文等信息,因此只能指导模型生成的词形。
回到 “词类特性” 的概念, 前文提到模型在训练过程中的logits收敛是基于“表示关联的”,即相似词会倾向于聚合到临近表示空间,在logits上也会呈现相关性;而 “先验分布假设” 中又说到“源词+拼接目标词”和“目标词”在训练时同时出现会互相建立联系。由此得出的推论是:词约束训练时,模型会在源词、拼接词及目标词三者之间建立某种关联;同时根据表示关联性,模型会在源词位置、拼接词位置和目标词位置赋予词类相关性。
在推理过程中, “词类特性”会使模型将拼接词关联到源句中含义最接近的词类上,拼接词也就自然映射到该词对应的目标词。由此训练后的模型,当输入一条新样本时,如果源句子中包含和拼接词相似语义的词,则二者都会关联到目标位置,同时拼接词会指导解码器生成目标词。因此词约束训练可以联合源词与拼接目标词指导模型在合理的位置生成正确的词,且当源词、拼接词同属一个词类时,词约束方法才会生效。这种词类特性也是模型训练时向量表征收敛而产生的,即特定数据分布下模型迭代学习的产物。 源词提供了模型需要在哪个位置生成译词的指导,而目标片段即译词,指导模型在该位置生成什么词。图说明如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/79aeadde00564580b4a2760080ca6791.png
根据上述分析,我们再来回顾前文示例“这张支票的金额是比我预期的少了很多。”,由于源句中与拼接词“金额”相似的只有“amount”,因此“金额”的译文的位置便取决于它的词类,也就成功映射到“支票的”和“是比我”之间的槽位,而不是定位在“预期”词类上。那么如果要想约束“预期”的输出,该怎样做呢?读者可能也想到了,那就是将一个与“预期”同属一个词类的词作为拼接词(究竟是哪个词可能不确定,一般同义/近义词就行,例如“期望”等),模型大概率会在“预期”的位置上翻译出制定词。
3.5 效果展示
借鉴论文中自动词约束的方法(不引入位置编码、分段编码和Ptr),训练NMT模型,并使用不同的约束词测试;在我们自己的通用英中翻译测试结果(hotwords 1k)如下表:
然后对单一case进行约束测试,测试结果表明encoder会自动将约束词关联到源句中含义最相近的词,比如当约束词为“飞速”时,受限定的为“快速”,而约束词为“取得”或“获得”时,则受限定的为“得到”。效果如下:
能够看出根据不同的拼接,模型具备了准确定位槽位的能力,而没有乱加词。
四、词表和测试数据
在一般的专用词优化业务场景中,会提供大小为 N N N的测试集,以及同样大小的专用词表,测试集中的句对会包含词表中同样位置的专用词,还是之前的例子,英中对照如下:
英文:the amount of this check is a lot less than I expected it to be.
中文:这张支票的金额是比我预期的少了很多。
则专用词表对应行的词记录如下:
英文:amount
中文:金额
4.1 词表准备
一般情况下,专用词词表不能存在歧义,即不允许一词多义的情况,否则模型输出的结果可能也会不同。因此对词表的处理分为去重、长度逆排序两步,去重描述如下:
输入:专用词表C
输出:处理后词表C'
C^ ← 空列表
C' ← 空列表
lines_set ← 空列表
for each(item) in C do
if item['zh'] in lines_set then
continue
else
add(C^, item)
add(lines_set, item['zh'])
end if
end for
lines_set ← 空列表
for each(item) in C^ do
if item['en'] in lines_set then
continue
else
add(C', item)
add(lines_set, item['en'])
end if
end for
return C'
长度逆排序将词表按翻译的源语言词的长度进行递减排序(例如英翻中方向,将词表按英文部分长度递减排序),目的是匹配时如果专用词间存在包含关系,优先选取较长的词。
同长度交集情况: 专用词表中可能存在同长度词的子词交集情况,如“铁路运输”和“运输公司”,一般以词表排名靠前的词为准。
注: 去重后的词表用于匹配句子中其它专用词的情况,即如果给定句子中不仅包含专用词表对应行的词,还包含其它专用词时,由于专用词表当前行并未给出对这些词的指导译文,因此需要借助去重后的词表以确定到底生成什么内容。
4.2 英文匹配一致性
英文专用词中可能存在大小写情况,这与词在句子中的形式可能不一样,同时如果涉及到"-“或” ’ "的使用,则前后可能也会有空格。一般采用预处理(转小写、去冗余空格等)对词表和句子进行一致化。
五、专用词挖掘
5.1 源句词搜索
给定专用词表后,便开始对源输入句进行专用词搜索。搜索采用两步走策略:①从 C C C中对应行查找所有词;②从 C ′ C^{'} C′中查找所有其它词。下面逐一介绍。
5.1.1. 从一对一词表中查找所有词
一对一专用词的优先级最高,因此需要先匹配,方法即遍历句子 s s s,搜索 s s s包含的所有对应专用词 c c c。大致为:对于每一个搜索到的 c c c,记录 c c c在一对一词表的目标翻译(注意此时不是去重词表,因为一对一词是必须翻译成规定的内容,去重词表有可能在处理时将内容换成别的了),并按 c c c的位置将句子切分成左、右两个子句,将左子句添加进切分列表 S p a r t S_{part} Spart中,右子句继续执行搜索。算法描述如下:
输入:待处理句子s,专用词c,专用词译文c'
输出:匹配到的专用词译文列表W',子句切分列表S_part
W' ← 空列表
S_part ← 空列表
assert find(s, c) != Null #这里假设s中包含至少一个c,否则就不合理了。
while True do
if find(s, c) != Null then
s_left ← s[:index(s, c)] #index()为返回c在s中的索引,且必须是左起第一次出现的索引。
s_right ← s[index(s, c) + len(c):]
append(S_part, s_left)
append(W', c’)
s ← s_right
else:
append(S_part, s)
break
end if
end while
return W', S_part
5.1.2. 查找其它词
对于其它词的查找需要从1中得到的切分 S p a r t = { s 1 , s 2 , . . . , s n } S_{part}=\{s_1, s_2, ..., s_n\} Spart={s1,s2,...,sn}顺序进行。查找采用类似分治的思想,对于当前切分 s i s_{i} si,从词表 C ’ C^{’} C’中依次匹配目标词,对于匹配到的第一个目标词 w w w,记录 w w w的目标语言翻译,并将整句话按 w w w切分为左、右两个子句,分别执行匹配。算法最终得到 s i s_{i} si的带专用词界定标记的格式 s i ′ s_{i}^{'} si′,以及句子中匹配到的所有词的对应目标语言翻译列表 W i ′ W_{i}^{'} Wi′,以用于Contstrain-Lexicon开发和最终译文召回评价。
为便于后续调用,算法命名为findnonSpecific(),算法伪代码如下:
输入:待匹配片段s_part,专用词表C'
输出:包含专用词界定标记的s_part’,所有匹配词的目标语言翻译集W’
left_line ← 空串
right_line ← 空串
W' ← 空列表
s_part' ← 空串
if s_part.Length() == 0 then
return '', []
end if
for each(item) in C' do
if item['zh'] in s_part then
left_line, left_HwT ← Function(S[:indexOf(s_part, item['zh'])], C') #Function()表示递归执行当前算法块
right_line, right_HwT ← Function(S[indexOf(s_part, item['zh'])+item['zh'].Length():], C')
append(W’, item['en'])
return concat(left_line, '[B]', item['zh'], '[B]', right_line), left_HwT + W' + right_HwT #[B]代表界定标记,可以使用其他字符(要保证不能与原句混淆)
end if
end for
return s_part’, W’
算法最终得到句子的带专用词界定标记的格式 S ′ S^{'} S′,以及句子中匹配到的所有专用词的对应目标语言翻译列表,以用于Contstrain-Lexicon开发和最终译文召回评价。
5.2 整体描述
介绍了上述1、2两步的算法原理后,我们将其整合起来,将算法1改进为能在其中调用算法2,以实现整体工作流程。整体算法的输入为句子 s s s、专用词 c c c、词表 C ′ C^{'} C′,输出为带专用词界定标记的 s ′ s^{'} s′和专用词目标语言翻译集 W ′ W^{'} W′. 算法描述如下:
输入:待匹配片段s,专用词c,专用词翻译c’,专用词表C'
输出:包含专用词界定标记的s',所有匹配词的目标语言翻译集W’
W' ← 空列表
s' ← 空串
assert find(s, c) != Null #这里假设s中包含至少一个c,否则就不合理了。
while True do
if find(s, c) != Null then
s_left ← s[:index(s, c)] #index()为返回c在s中的索引,且必须是左起第一次出现的索引。
s_right ← s[index(s, c) + len(c):]
part_now, W_now ← findnonSpecific(s_left, C') #调用算法2
concat(s’, part_now, '[B]', c, '[B]') #依次拼接s_left的其它专用词界定形式、界定的专用词c
extend(W', W_now)
append(W', c’)
s ← s_right
else:
part_now, W_now ← findnonSpecific(s, C') #调用算法2
concat(s’, part_now)
extend(W', W_now)
break
end if
end while
return W', s’
5.3 界定标记
带专用词界定标记的格式举例如下:
原句S:这张支票的金额是比我预期的少了很多。
处理后S':这张支票的[BOUND]金额[BOUND]是比我预期的少了很多。
界定标记是为了防止分词时专用词中的部分内容误与前后文其它词黏合,加入标记使专用词成为一个独立整体进行编码。例如:
文本:这家人工智能科技公司是去年刚成立的。
直接分词:'这 ##家人 ##工 ##智能 ##科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。' #专用词“人工智能”与上文黏合情况。
界定专用词:'这 ##家 人工 ##智能 科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。' #使用界定标记确保“人工智能”为单独部分。
但对于分词模型本身而言,为区分专用词而强制分离其和上下文的关系,会破坏原始文本的分词语义,对模型翻译带来一定影响。实验证明加入界定标记会提升专用词准确率,但会导致译文BLEU值下降。
不进行界定的安全分词方法: 如何做到既能保持专用词和其语境的融合关系,又能防止专用词误与上下文黏连呢?方法是使用词表中一个未登录词或者非常不常用(指词表中找不到它与其它字或词的组合关系) 的字或字符暂时插入专用词的首尾,再进行分词,得到分词表示后再将插入的词对应的id删除,即得到不界定的安全分词方法。举例如下:
文本:这家人工智能科技公司是去年刚成立的。
直接分词:'这 ##家人 ##工 ##智能 ##科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。' #专用词“人工智能”与上文黏合情况。
界定专用词:'这 ##家 人工 ##智能 科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。' #使用界定标记确保“人工智能”为单独部分。
安全方法步骤如下:
1、在“人工智能”前后插入“*”,得到文本: 这家*人工智能*科技公司是去年刚成立的。 #*代表未登录或不常用字、字符等。
2、用分词器分词,得到:'这 ##家 <UNK> ##人工 ##智能 <UNK> ##科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。' #UNK代表*的分词结果,因为词表中未出现,被解码成未知词。
3、去掉分词结果中的'<UNK>'。
效果:'这 ##家 ##人工 ##智能 ##科技 ##公司 ##是 ##去年 ##刚 ##成立 ##的 。'
由于插入的字符是词表中未见的或不常见的,因此分词时无法与前后文黏连,但同时它也能够被分词器当做文本内容的一部分,因而专用词便可以安全切分,也不会破坏文本语义。
5.4 译文词搜索及打分
对于句子 s s s的译文 s ′ s^{'} s′,使用源句搜索时得到的匹配词目标语言翻译集 W ′ W^{'} W′进行逐一检查,检查前需要将译文作转小写、去除冗余空格处理以精准匹配;检查完毕后进行归一化打分,打分方法为: P = 1 h ∑ i = 1 h r i , P=\frac{1}{h}\sum_{i=1}^{h} r_i, P=h1i=1∑hri, while r i = { 1 , if w i in s ′ 0 , else \text{while }r_i= \begin{cases} 1, & \text{if } w_i \text{in } s^{'}\\ 0, & \text{else} \end{cases} while ri={1,0,if wiin s′else
算法描述为:
输入:待检查译文s’,匹配词翻译集W’
输出:专用词召回率得分p
if W'.Length() == 0: return 1
p ← 0
flags ← 空列表
for each(w') in W’ do
if w’ in s’ then
flags.append(1)
else:
flags.append(0)
p = sum(flags) / flags.Length()
return p
举例说明如下(中英翻译方向):
原句:这些货物的金额将由供应商决定。
专用词:货物(cargo)、金额(amount)、供应商(supplier)
译文:The amount of these goods will be determined by the supplier.
专用词翻译情况:The [amount √] of these [goods ×] will be determined by the [supplier √].
上述例句的翻译结果,专用词包含3个,其中2个正确、1个错误,因此专用词召回率为 2 / 3 ≈ 66.67 % 2/3≈66.67\% 2/3≈66.67%.
5.5 专用词BLEU值评价
对专用词测试集评价BLEU值存在一定的不合理性,由于专用词翻译时存在词约束,因此对于非当前句子对应的专用词(即查找其它词中匹配到的词),其在去重词表中对应的翻译不一定是专用词测试集译文中的形式,因此容易造成误差。对此通常有两种策略可以采取:①匹配专用词时仅挖掘一对一的词,这样最终得到的译文可以评价BLEU(但也有大小写误差);②重构测试集的译文部分,即统一译文中所有的专用词翻译为去重词表中的结果(不建议,资源耗费大,且容易背离上下文语境)。
六、参考文献
- Chen G, Chen Y, Wang Y, et al. Lexical-constraint-aware neural machine translation via data augmentation[C]//Proceedings of the Twenty-Ninth International Conference on International Joint Conferences on Artificial Intelligence. 2021: 3587-3593.
- [Hokamp and Liu, 2017] Chris Hokamp and Qun Liu. Lexically constrained decoding for sequence generation using grid beam search. In Proceedings of ACL, pages 1535–1546, 2017.
- [Post and Vilar, 2018] Matt Post and David Vilar. Fast lexically constrained decoding with dynamic beam allocation for neural machine translation. In Proceedings of NAACL, pages 1314–1324, 2018.
- [Song et al., 2019] Kai Song, Yue Zhang, Heng Yu, Weihua Luo, Kun Wang, and Min Zhang. Code-switching for enhancing NMT with pre-specified translation. In Proceedings of NAACL, pages 449–459, 2019.
- [Dinu et al., 2019] Georgiana Dinu, Prashant Mathur, Marcello Federico, and Yaser Al-Onaizan. Training neural machine translation to apply terminology constraints. In Proceedings of ACL, pages 3063–3068, 2019