机器翻译(Machine Translation)指的是将一种语言的文本序列自动转换为另一种语言的文本序列。它不仅是自然语言处理中的一个重要应用,而且还是检验语言模型能力的经典基准。在历史上,早期的机器翻译方法依赖统计学(称为统计机器翻译),例如著名的Brown等人提出的方法;而近年来,随着神经网络技术的发展,端到端的神经机器翻译(Neural Machine Translation)成为主流。在神经机器翻译中,我们的任务可以看作是一个 序列转换(sequence transduction) 问题:即将输入序列(源语言)映射成输出序列(目标语言)。这与单一语言的语言模型任务不同,因为这里每个样本是一个语言对。
在本例中,我们使用 Tatoeba 项目的“英-法”双语句子对数据集。数据集中,每一行由制表符分隔,第一部分为英文文本,第二部分为翻译后的法语文本。需要注意的是,每个文本序列既可以是一个单独的句子,也可以是包含多个句子的段落。
下面的代码展示了如何下载数据集并读取原始文本内容:
输出:
下载后,我们需要对原始文本数据进行预处理:
预处理代码示例如下:
通过替换为普通的空格,可以使文本在后续的处理(例如分词、标点符号处理等)时更加统一,避免因空格类型不同而引发的意外问题。
输出:
在机器翻译中,我们更倾向于使用单词级词元化而非字符级词元化。这意味着我们把句子切分成单词或标点符号,而不是单个字符。下面的函数对预处理后的文本数据进行词元化,将数据分为源语言(英文)和目标语言(法语)两部分。
输出:
让我们绘制每个文本序列所包含的词元数量的直方图。在这个简单的“英-法”数据集中,大多数文本序列的词元数量少于20个。
由于机器翻译数据集由语言对构成,我们需要分别为源语言和目标语言构建词表。注意: 单词级词元化生成的词表会比字符级词元化大得多。为此,我们将出现次数少于2次的词元统一视为“<unk>”(未知词元),同时还添加了以下特殊词元:
在机器翻译任务中,每个样本是一个包含源语言和目标语言的文本序列对,而且每个序列的长度通常不一致。为提高计算效率,我们需要将同一小批量内的所有序列调整为相同长度,这通常通过截断和填充实现。
假设我们设定固定长度为 num_steps,对于每个序列:
这一过程可以用下面的数学公式描述:
输出:
为了方便模型训练,我们还需要构建一个函数,将处理好的文本序列转换成小批量数据。这里的操作包括:
有效长度可以用以下公式表示:
对应代码如下:
接下来,我们定义一个函数来加载数据并返回数据迭代器,同时输出源语言和目标语言的词表:
读取一个小批量数据示例
输出示例可能为:
在完成上述数据预处理、词元化、词表构建以及批量数据加载之后,就可以利用这些数据来训练神经机器翻译模型。在训练过程中,模型会一个词一个词地生成输出序列,当生成到 <eos> 时,就认为输出完成。