如何为机器翻译准备一个法语-英语数据集

机器翻译是一项具有挑战性的任务,旨在将源语言文本转换为目标语言中连贯且匹配的文本。

神经网络机器翻译系统,例如编码器-解码器循环神经网络,通过直接在源语言和目标语言上进行训练的单一端到端系统,在机器翻译方面取得了最先进的结果。

需要标准数据集来开发、探索和熟悉如何开发神经网络机器翻译系统。

在本教程中,您将了解 Europarl 标准机器翻译数据集以及如何准备数据以供建模。

完成本教程后,您将了解:

  • Europarl 数据集包含欧洲议会会议记录,有 11 种语言。
  • 如何加载和清理平行法语和英语文本,为神经网络机器翻译系统做好建模准备。
  • 如何减小法语和英语数据的词汇量,以降低翻译任务的复杂性。

快速启动您的项目,阅读我的新书 《自然语言处理深度学习》,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

How to Prepare a French-to-English Dataset for Machine Translation

如何为机器翻译准备一个法语-英语数据集
照片作者:Giuseppe Milo,部分权利保留。

教程概述

本教程分为5个部分,它们是:

  1. Europarl 机器翻译数据集
  2. 下载法语-英语数据集
  3. 加载数据集
  4. 清理数据集
  5. 减小词汇量

Python 环境

本教程假设您已安装带有 Python 3 的 Python SciPy 环境。

本教程还假设您已安装 scikit-learn、Pandas、NumPy 和 Matplotlib。

如果您在环境方面需要帮助,请参阅此帖子

需要深度学习处理文本数据的帮助吗?

立即参加我的免费7天电子邮件速成课程(附代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

Europarl 机器翻译数据集

Europarl 是用于统计机器翻译的标准数据集,以及最近用于神经网络机器翻译的数据集。

它包含欧洲议会的会议记录,因此数据集的名称是“Europarl”的缩写。

会议记录是欧洲议会发言人的文字记录,并被翻译成 11 种不同的语言。

这是自 1996 年以来欧洲议会会议记录的集合。总而言之,语料库包含欧盟 11 种官方语言中每种语言约 3000 万个单词。

Europarl: A Parallel Corpus for Statistical Machine Translation, 2005。

原始数据可在欧洲议会网站上以 HTML 格式获取。

数据集的创建由“统计机器翻译”一书的作者Philipp Koehn 牵头。

该数据集可在“European Parliament Proceedings Parallel Corpus 1996-2011”网站上免费提供给研究人员,并经常出现在机器翻译挑战中,例如 2014 年统计机器翻译研讨会上的机器翻译任务

数据集的最新版本是 2012 年发布的第 7 版,包含 1996 年至 2011 年的数据。

下载法语-英语数据集

我们将专注于法语-英语平行数据集。

这是一个已处理好的语料库,包含 1996 年至 2011 年间的法语和英语对齐句子。

数据集具有以下统计数据:

  • 句子:2,007,723
  • 法语单词:51,388,643
  • 英语单词:50,196,035

您可以从此处下载数据集

下载完成后,您应该在当前工作目录中看到文件“fr-en.tgz”。

您可以使用 tar 命令解压此存档文件,如下所示:

现在您将获得两个文件,如下所示:

  • 英语:europarl-v7.fr-en.en (288MB)
  • 法语:europarl-v7.fr-en.fr (331MB)

下面是英语文件的一个示例。

下面是法语文件的一个示例。

加载数据集

让我们开始加载数据文件。

我们可以将每个文件加载为字符串。由于文件包含 Unicode 字符,因此在将文件加载为文本时必须指定编码。在这种情况下,我们将使用 UTF-8,它可以轻松处理这两个文件中的 Unicode 字符。

下面的函数名为 load_doc(),它将加载给定文件并将其返回为文本块。

接下来,我们可以将文件分割成句子。

通常,一个话语存储在一行中。我们可以将它们视为句子,并通过换行符分割文件。下面的 to_sentences() 函数将分割加载的文档。

在稍后准备我们的模型时,我们需要知道数据集中句子的长度。我们可以编写一个简短的函数来计算最长和最短的句子。

我们可以将所有这些内容结合起来,加载并汇总英语和法语数据文件。完整的示例列在下面。

运行示例将汇总每个文件中的行数或句子数,以及每个文件中最长和最短行的长度。

重要的是,我们可以看到行数 2,007,723 与预期相符。

清理数据集

在用于训练神经网络翻译模型之前,数据需要进行一些最小的清理。

查看一些文本样本,一些最小的文本清理可能包括:

  • 按空格分词。
  • 将大小写规范化为小写。
  • 从每个单词中删除标点符号。
  • 删除不可打印字符。
  • 将法语字符转换为拉丁字符。
  • 删除包含非字母字符的单词。

这些只是一些基本的入门操作;您可能知道或需要更复杂的 数据清理 操作。

下面的 clean_lines() 函数实现了这些清理操作。一些说明:

  • 我们使用 Unicode API 来规范化 Unicode 字符,这会将法语字符转换为拉丁字符。
  • 我们使用反向正则表达式匹配来保留单词中所有可打印的字符。
  • 我们使用翻译表来逐个翻译字符,但排除所有标点符号。

规范化后,我们使用 pickle API 以二进制格式直接保存清理后的行列表。这将加速加载,以便将来进行进一步操作。

重用前面几节中开发的加载和分割函数,完整的示例列在下面。

运行后,清理后的句子分别保存在 english.pklfrench.pkl 文件中。

作为运行的一部分,我们还打印了每行清理后的句子列表的前几行,如下所示:

English

French

我对法语的阅读能力非常有限,但至少在英语方面,还可以进行进一步改进,例如删除或连接悬挂的“s”作为复数。

减小词汇量

作为数据清理的一部分,限制源语言和目标语言的词汇量非常重要。

翻译任务的难度与词汇量的大小成正比,而词汇量的大小又会影响模型训练时间以及使模型可行的所需数据集的大小。

在本节中,我们将减小英语和法语文本的词汇量,并使用特殊标记标记所有词汇量之外 (OOV) 的单词。

我们可以从加载上一节保存的 pickle 清理行开始。下面的 load_clean_sentences() 函数将加载并返回给定文件名的列表。

接下来,我们可以计算数据集中每个单词的出现次数。为此,我们可以使用 Counter 对象,它是一个以单词为键的 Python 字典,并在每次添加单词的新出现时更新计数。

下面的 to_vocab() 函数为给定的句子列表创建词汇表。

然后,我们可以处理创建的词汇表,并从 Counter 中删除所有出现次数低于特定阈值的单词。

下面的 trim_vocab() 函数执行此操作,它接受最小出现次数作为参数,并返回更新的词汇表。

最后,我们可以更新句子,删除所有不在修剪词汇表中的单词,并使用特殊标记标记它们的删除,在本例中是字符串“unk”。

下面的 update_dataset() 函数执行此操作,并返回一个可以保存到新文件的更新行列表。

我们可以将所有这些内容结合起来,减小英语和法语数据集的词汇量,并将结果保存到新的数据文件中。

我们将使用最小出现次数为 5,但您可以随意探索适合您应用程序的其他最小出现次数。

完整的代码示例如下所示。

首先,报告英语词汇量的大小,然后是更新后的大小。更新后的数据集保存在名为‘english_vocab.pkl’的文件中,并打印了一些用“unk”替换了词汇量之外单词的更新示例。

我们可以看到词汇量的大小缩小了大约一半,只剩下了略多于 40,000 个单词。

接下来对法语数据集执行相同的过程,并将结果保存到文件 ‘french_vocab.pkl‘ 中。

我们看到法语词汇量的大小也类似地缩小了。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

总结

在本教程中,您了解了 Europarl 机器翻译数据集以及如何准备数据以供建模。

具体来说,你学到了:

  • Europarl 数据集包含欧洲议会会议记录,有 11 种语言。
  • 如何加载和清理平行法语和英语文本,为神经网络机器翻译系统做好建模准备。
  • 如何减小法语和英语数据的词汇量,以降低翻译任务的复杂性。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发文本数据的深度学习模型!

Deep Learning for Natural Language Processing

在几分钟内开发您自己的文本模型

...只需几行python代码

在我的新电子书中探索如何实现
用于自然语言处理的深度学习

它提供关于以下主题的自学教程
词袋模型、词嵌入、语言模型、标题生成、文本翻译等等...

最终将深度学习应用于您的自然语言处理项目

跳过学术理论。只看结果。

查看内容

56 条回复《如何准备法语到英语数据集以进行机器翻译

  1. Gerrit Govaerts 2018 年 1 月 8 日下午 6:54 #

    有点离题,但对于循环神经网络和卷积神经网络的显着成功以及为什么基本的多层感知器可能不值得努力,我有一些非常敏锐的观察:http://www.stochasticlifestyle.com/algorithm-efficiency-comes-problem-information/

  2. Klaas 2018 年 1 月 9 日上午 6:20 #

    Jason,这又是出色的工作。非常感谢分享。这对像我这样缺乏科学/数学背景但仍然对学习这些内容非常感兴趣的人非常有帮助。
    非常感谢您的工作!
    此致

    • Jason Brownlee 2018 年 1 月 9 日下午 3:17 #

      谢谢,很高兴对您有帮助。

      • riyaj atar 2020 年 12 月 10 日上午 3:27 #

        谢谢 Jason。又一个很棒的教程。
        我有一个关于为机器翻译任务创建并行语料库的 tfds 格式数据集的问题。
        您能给出一些关于如何为我们自己的数据集创建这种格式的步骤吗?
        感谢您的时间和努力。
        谢谢。保持健康。

        • Jason Brownlee 2020 年 12 月 10 日上午 6:30 #

          谢谢。

          抱歉,我不明白您的问题。您能详细说明您遇到的问题吗?

  3. Vidyush Bakshi 2018 年 1 月 9 日晚上 9:38 #

    又一次很棒的工作,解释得很好!

  4. Canbey Bilgili 2018 年 1 月 13 日上午 1:25 #

    很棒的文章。这是准备数据的好资源。谢谢!

  5. LeeX 2018 年 1 月 22 日上午 2:28 #

    中国研究人员非常感谢您的教程!

  6. Nixon 2018 年 2 月 7 日上午 4:13 #

    嗨,兄弟,我是一名新手学习者,如何轻松学习机器学习,请帮助我

  7. mzeid 2018 年 2 月 26 日上午 11:48 #

    嗨,Jason,

    这确实是一篇很棒的文章。我正在尝试遵循您关于英语>阿拉伯语数据的指南,但当与阿拉伯语文本一起使用时,函数 ‘clean_lines(lines)’ 没有任何结果。对于阿拉伯语,有什么解决办法吗?

    提前感谢!

    • Jason Brownlee 2018 年 2 月 26 日下午 2:55 #

      抱歉,我没有处理过阿拉伯语。也许需要更新该函数以支持 unicode 字符?

  8. machine_translator 2018 年 4 月 6 日晚上 9:19 #

    非常感谢您关于如何准备机器翻译数据的清晰教程。接下来的步骤是什么?是否有针对这些步骤的类似教程?

  9. Zayed 2018 年 4 月 11 日上午 8:45 #

    很棒且有用的教程。

    我想将文件保存为纯文本文件 ‘.txt’,UTF-8 格式,我不需要 pickle 文件。

    我需要更改上面的代码才能输出文本文件吗?

    • Jason Brownlee 2018 年 4 月 11 日下午 4:15 #

      也许您可以将词汇表保存为每行一个单词。

      您可以将翻译保存为每行一个。

      要做到这一点,您可以使用标准的 Python API 编写一个函数将列表保存到 ASCII 文件,并调用它而不是 pickle 函数。

      • Zayed 2018 年 4 月 12 日上午 2:53 #

        感谢 Jason 的回复。我甚至不需要词汇表。我卡在这个函数上了。

        # 将清理后的句子列表保存到文件
        def save_clean_sentences(sentences, filename)
        dump(sentences, open(filename, ‘wb’))
        print(‘Saved: %s’ % filename)

        我尝试了这个,可以在 PyCharm 中看到抽查结果(每种语言 10 行),但文件中没有写入任何内容。

        def save_clean_sentences(sentences, filename)
        f = open(filename, ‘r+’)
        for line in f
        f.write(line[i], ‘r+’)
        f.write(‘\n’)

        我错过了什么?

        再次感谢您抽出宝贵时间支持我。

  10. Zayed 2018 年 4 月 14 日上午 3:38 #

    我有一个关于从数据中删除标点符号的问题。在上面的示例中,您会看到像这样的句子

    “please rise then for this minute s silence”
    “the house rose and observed a minute s silence”

    正如您所见,句子中的撇号被删除了。那么,这是否意味着我尝试翻译同一个句子,但带有撇号“please rise then for this minute’s silence”,神经解码器将无法挑选出正确的法语翻译,或者由于源文本略有不同,翻译会不同?

    如果同一个源句子末尾有一个句号或开头是一个大写字母,翻译会有所不同吗?例如

    Please rise then for this minute’s silence
    Please rise then for this minute’s silence.

    从训练数据中删除标点符号是标准做法吗?它会提高整体质量吗?有什么建议吗!

    • Jason Brownlee 2018 年 4 月 14 日上午 6:50 #

      我删除了它(或者它在之前从训练数据中被删除了,我不记得了),以简化问题。

      我建议将其添加回来(如果存在则不要从训练数据中剥离,或者获取带标点符号的数据),以学习带标点符号的翻译。

      当专注于翻译部分时,这是标准做法,但对于实际工作的模型则不是。

      或者,您可以开发一个模型来添加标点符号。

      • Zayed 2018 年 4 月 14 日上午 7:17 #

        谢谢 Jason!这很有道理。

        我还有一个关于小写的问题。如果将所有训练数据小写,神经解码器能否在目标句的开头进行大写,或者将训练数据中未出现的未知词保持原样?或者它会在解码/翻译过程中将所有单词都小写吗?例如,我们有这个句子

        IBM is providing AI services.

        如果只用小写数据进行训练,神经解码器能否保持 IBM 和 AI 的原样?

        再次感谢您的支持,希望您不介意我频繁提问。另外,请告诉我您的哪本书详细介绍了神经机器翻译?我主要对创建神经机器翻译系统和神经拼写检查器感兴趣。您的书中是否涵盖了神经拼写检查?

        再次感谢!

        • Jason Brownlee 2018 年 4 月 15 日上午 6:17 #

          如果所有训练数据都是小写的,那么模型只认识小写。

          如果大小写很重要,您可以保留大小写进行训练,或者训练一个模型来为小写字符串添加大小写,或者其他巧妙的想法……

  11. Dominique Lahaix 2018 年 9 月 20 日上午 7:50 #

    嗨 Jason – 我有个问题也许你能帮忙?

    我们建立了一个使用 ML 自动对短文档进行分类的系统。我们是用英语完成的,现在需要为法语做同样的事情。我们使用了大量手动标注的文档进行了监督学习。

    不幸的是,我们的法语训练集要小得多……所以我想知道我们是否可以

    – 翻译训练集并将其用作法语的训练集(补充)
    – 翻译模型本身(我甚至不知道这是否是一个选项)

    您听说过人们使用翻译的训练集来构建模型吗?它效果如何?
    谢谢

    • Jason Brownlee 2018 年 9 月 20 日上午 8:11 #

      听起来是不错的主意!

      也许生成新的数据来训练,作为您现有文档的增强版本。

      另外,在使用较小的数据集时,请考虑使用正则化方法以确保您不会过度拟合训练数据。

  12. simran 2018 年 12 月 26 日下午 3:44 #

    问候,先生,
    我正在使用机器学习进行语料库语言学的博士研究。我需要帮助为翻译前的语料库开发预处理算法。

    • Jason Brownlee 2018 年 12 月 27 日上午 5:39 #

      这不是一个算法,而是一系列最适合您特定数据集的预处理步骤。

  13. Prashant Kumar Singh 2019 年 3 月 14 日晚上 9:45 #

    嗨 Jason,是否可以将语言从英语翻译成其他语言,例如法语?

    我的项目示例如下;

    我在 existdb 中工作并生成 PDF 文件,这些文件在全球范围内发布在网页上。但我希望按国家/地区更改 PDF 内容的语言。那么,这是否可以通过您的博客来实现?

    转换任务是如何将 Python(在您的博客中)与 existdb(开源数据库)结合起来?或者有什么其他方法可以做到这一点?请帮助我理解。

    谢谢,
    Prashant

    • Jason Brownlee 2019 年 3 月 15 日上午 5:30 #

      感谢您的建议。

      • Prashant Kumar Singh 2019 年 3 月 20 日下午 4:07 #

        嗨,Jason,

        您能否回答我以下几点,这将对我有所帮助;

        问题:是否可以将机器学习模型连接到我的网页,该网页基于 exist (XML) 数据库内容?请建议我遵循的步骤。

        谢谢,
        Prashant

        • Jason Brownlee 2019 年 3 月 21 日上午 7:58 #

          我看不出为什么不。

          这听起来像一个工程问题,并且取决于您生产环境的具体情况。我没有实际的示例,抱歉。

  14. anvesh 2019 年 6 月 10 日晚上 7:27 #

    我们可以使用一个英语到法语的预训练模型在我自己的小型数据集上进行训练,然后将英语翻译成任何其他语言吗?

    • Jason Brownlee 2019 年 6 月 11 日上午 7:52 #

      这可能有助于作为起点,但需要进一步的训练。

  15. Dani Gross 2019 年 6 月 15 日晚上 6:44 #

    嗨,Jason,
    感谢您的教程!

    如何处理该语料库的句子对齐,考虑到它包含空字符串?

    • Jason Brownlee 2019 年 6 月 16 日上午 7:12 #

      抱歉,我没有关于句子对齐的教程,我无法为您提供好的现成建议。

  16. Rishai 2019 年 8 月 27 日上午 9:07 #

    嗨 Jason,感谢所有这些教程。您是否有关于如何进行下一步,将词元/单词转换为整数向量,以便它们可以传递到 Embedding 层?

  17. Sreenivas Kashyap 2019 年 10 月 26 日上午 3:45 #

    嗨,Jason,
    工作出色,我正在开发卡纳达语到英语的翻译模型,但分词器在分割文本时不起作用。
    输出如下

    Saved: english-kannada.pkl
    [tom woke up] => []
    [give me half] => []
    [we needed it] => []
    [tom liked you] => []
    [just go inside] => []
    [do you remember] => []
    [i just got back] => []
    [see you at] => []
    您能为我解决上述问题提供建议吗?

  18. Nithin 2019 年 12 月 5 日上午 5:58 #

    你好 Jason,

    感谢教程和良好的解释。
    如果您能澄清以下疑问,我将不胜感激
    1) 将频率较低的单词标记为“unk”会如何影响模型准确性,因为现在“unk”标记可能会占数据的重要比例。
    2) 您对使用字符级编码与单词级编码有什么看法?
    3) 对于更大的词汇量(约 0.1M),是否有技术和软件可以使用单词的稀疏表示,而不是独热编码,以在训练期间减少内存需求?

    谢谢

    • Jason Brownlee 2019 年 12 月 5 日上午 6:44 #

      从词汇表中删除这些单词,然后在为模型预处理文本时将不在词汇表中的单词标记为 unk。

      据我所知,目前按单词级别进行建模更有效。

      100K 的词汇量适中。不用担心。

      • Nithin 2019 年 12 月 7 日上午 4:55 #

        你好 Jason,

        感谢您的回答。
        我们正在使用 Europarl 的编码器-解码器模型。我们使用 2 个 GRU 层,每个层有 128 个单元格和一个时间分布式层。根据教程,法语词汇量约为 50K(阈值为 5)。我们想在具有 12GB GPU 内存的单 GPU 上训练此模型,但使用批次大小为 16 或 32 时,GPU 内存会填满并报错内存不足。
        我们怀疑最可能的原因是每个单词的独热表示,维度为 50K。
        时间分布式层的形状也为 (None, 528 (法语句子最大长度), 50K (输出向量大小 = 法语词汇量)。
        我们想知道是否有任何方法可以避免这种情况(例如 libSVM),或者是否有更有效的表示方法来用于具有大词汇量的 RNN,以帮助训练大批次大小?

        谢谢你

        • Jason Brownlee 2019 年 12 月 7 日上午 5:41 #

          也许可以尝试使用生成器来实现批次的渐进加载?

          • Nithin 2019 年 12 月 7 日上午 7:59 #

            是的,我们正在使用生成器。模块在创建大小为 [19136,58802]([(法语句子最大长度)*批次大小, 法语词汇量大小])的张量时遇到内存不足的问题,其中法语句子最大长度约为 600,批次大小为 1024。这似乎是正确的,因为对于 8 字节浮点表示,该矩阵将接近 8GB。所以我们想知道是否有任何方法可以解决这个问题,以及解决这些问题的最先进方法是什么。

            谢谢你

          • Jason Brownlee 2019 年 12 月 8 日上午 6:03 #

            也许可以尝试使用小词汇量?
            也许可以尝试使用更小的批次大小?
            也许可以尝试使用更短的句子长度?
            也许可以尝试在内存更多的机器上进行训练?

  19. Jane 2020 年 1 月 16 日下午 1:28 #

    这是否被认为是一个 seq2seq 模型?

  20. S.Gowri pooja 2020 年 5 月 17 日上午 11:09 #

    嗨,Jason。感谢分享这篇文章。这个预处理模型对于不同的语言是如何变化的?

  21. ARABA AMAN 2021 年 12 月 24 日下午 6:12 #

    我正在进行阿姆哈拉语和阿法语的机器翻译。
    我准备了数据集,放在不同的工作表中,并附有相应的目标语言。

    那么,我如何从两个文件名来训练神经机器翻译模型呢?
    也就是说,如何将这些清理过的句子输入模型进行训练?

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。