NMT十篇必读论文(二)Neural Machine Translation of Rare Words with Subword Units

清华大学NLP整理的神经机器翻译reading list中提到了十篇必读论文

https://github.com/THUNLP-MT/MT-Reading-List

 

GitHub地址:https://github.com/rsennrich/subword-nmt

本文介绍了一种处理oov词的方法(out-of-vocabulary words),将未知词表示为其子词的序列

首先,用字符词汇表初始化符号词汇表,并将每个单词表示为一个字符序列,加上一个特殊的词尾符号'·',这允许我们在翻译后恢复原始的标记。 我们迭代地计算所有符号对,并用新符号“AB”替换最频繁对('A','B')的每次出现。 每个合并操作都会生成一个代表字符n-gram的新符号。 频繁的字符n-gram(或整个单词)最终合并为单个符号,最终的符号词汇量大小等于初始词汇表的大小,加上合并操作的数量 - 后者是算法的唯一超参数。

 

作者还附加了一段示例代码,表示其从字典{‘low’, ‘lowest’, ‘newer’, ‘wider’}中学到的合并字对

import re, collections
def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i],symbols[i+1]] += freq
    return pairs

def merge_vocab(pair, v_in):
    v_out = {}
    bigram = re.escape(' '.join(pair))
    p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
    for word in v_in:
        w_out = p.sub(''.join(pair), word)
        v_out[w_out] = v_in[word]
    return v_out

vocab = {'l o w </w>' : 5, 'l o w e r </w>' : 2,
'n e w e s t </w>':6, 'w i d e s t </w>':3}
num_merges = 10
for i in range(num_merges):
    pairs = get_stats(vocab)
    best = max(pairs, key=pairs.get)
    vocab = merge_vocab(best, vocab)
    print(best)

最终输出的出现频率最高的前十个字对为:

('e', 's')
('es', 't')
('est', '</w>')
('l', 'o')
('lo', 'w')
('n', 'e')
('ne', 'w')
('new', 'est</w>')
('low', '</w>')
('w', 'i')

通过一系列的实验对比,说明了这种方法确实提高了翻译的质量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值