如何从零开始用Keras开发一个机器翻译系统

摘要: 作者拥有大量的实战经验,快来跟着作者开发属于你自己的神经网络翻译系统吧。

点此查看原文:http://click.aliyun.com/m/42632/

机器翻译是一项非常具有挑战性的任务,按照传统方法是使用高度复杂的语言知识开发的大型统计模型。而神经网络机器翻译是利用深度神经网络来解决机器翻译问题。

在本教程中,你将了解如何开发一个将德语短语翻译成英语的神经机器翻译系统,具体如下:

如何清理和准备数据,以及训练神经机器翻译系统。

如何开发一个机器翻译的编码解码器模型。

如何使用训练过的模型对新输入短语进行推理,并评估模型技巧。

7fdff24e2c1f858cb50b68d81dbc714de4d8ad96

教程概览:

这个教程分成了以下四个部分:

1.德文转译英文的数据集

2.准备文本数据

3.训练神经翻译模型

4.评估神经翻译模型

Python开发环境:

本教程假设你已经安装了Python 3 SciPy环境

你必须安装了带有TensorFlow 或者Theano 后台 Keras (2.0或者更高版本)

如果你在开发环境方面需要帮助,请看如下的文章:

如何安装用于机器学习和深度学习的Python开发环境

德文转译英文的数据集

在本教程中,我们将使用一个德文对应英文术语的数据集。

这个数据集是来自manythings.org网站的tatoeba项目的例子。该数据集是由德文的短语和英文的对应组成的,并且目的是使用Anki的教学卡片软件。

这个页面提供了一个由包含多语言匹配对的列表:

制表符分隔的双语句对

德文–英文 deu-eng.zip

下载数据集到当前的工作目录并且解压缩;例如:

5cb490980779e28788e06013d07e6779efee562d

你将会得到一个叫 deu.txt的包含152820个英文到德文短语的匹配对,一对一行,并用一个标签把德文和英文相互分隔开。

例如,这个文件的前五行如下:

11df4022439d857ac6ed7e059ff8c04888bdf33e

我们将用给定的一组德文单词作为输入来表达预测问题,翻译或预测与其对应的英文的单词序列。

我们将要开发的模型适合一些初级德语短语。

准备文本数据:

下一步是准备好文本数据。

查看原始数据,并注意在数据清理操作中我们可能需要处理你所遇到的的问题。

例如,以下是我在回顾原始数据时的观察所得:

1.有标点

2.文本包含大小写字母

3.有德文的特殊字符

4.有用不同德文翻译的重复英文短语

5.该文件是按句子长度排列的,贯穿全文有一些很长的句子

数据准备分为两个部分:

1.清理文本

2.拆分文本

1. 清理文本

首先,我们必须以保存Unicode德文字符的方式加载数据。下面称为load_doc()的函数将要加载一个BLOB文本的文件。

b1c2374c2a95ed636161c781bdd0c43ca7dd209b

每行包含一对短语,先是英文,然后是德文,用制表符分隔。

我们必须把加载的文本按行拆分,然后用短语拆分。下面的函数to_pairs()将拆分加载的文本。

f7a94eef6a8dd02f2291ea1c42f209f070085aa7

现在准备好清理文本中的句子了,我们将执行的具体清洗操作步骤如下:

删除所有不可打印字符。

删除所有标点符号。

将所有Unicode字符标准化为ASCII(例如拉丁字符)。

标准化为小写字母。

删除不是字母的所有剩余标识符。

下面的clean_pairs()函数执行如下操作:

8bef09cf7bf8eb433a6c60a2f9f27adce18b24e4

最后,可以将短语对的列表保存到可以使用的文件中

save_clean_data()函数用API来保存清理文本列表到文件中。

下面是完整例子:

888f6e21dcf653fca3c3d837c8c8d2fc3b9b3b42

运行该示例,用清理过的english-german.pkl文本在当前目录中创建一个新文件。

打印一些清理文本的例子,以便在运行结束时对其进行评估,这样就能确认清理操作是否按预期执行的。

a2bd48e25eea05db1c8094ef61aa120c594d16d0

2. Split Text

清理过的数据包含了超过150000个短语匹配对,到文件的最后会有一些匹配对是和长的。

这是一些用来开发较小的翻译模型的例子。模型的复杂度随着实例的数量、短语长度和词汇量的增加而增加。

尽管我们有一个很好的建模翻译的数据集,但我们将稍微简化这个问题,以大幅度减少所需模型的大小,并且也相应地减少所需的训练时间来适应模型。

我们将通过减少数据集为文件中的前10000个示例来简化这个问题;此外,我们将把前9000个作为培训的例子,剩下的1000个例子来测试拟合模型。

下面是加载清理过的数据,并且将其分割,然后将分割部分保存到新文件的完整示例。

2e7f67792060260e4f889b6758fbed526eda904c

运行该示例创建三个新文件:english-german-both.pkl文件包含所有的训练和测试的例子,我们可以用这些例子来定义这些问题的参数,如最大的短语长度和词汇量,和用于训练和测试数据集的english-german-train.pkl文件和english-german-test.pkl文件。

我们目前准备好开始开发自己的翻译模型了。

训练神经翻译模型

在这部分,我们将开发一个翻译模型。

这涉及到加载和准备清理过的用于建模、定义以及训练模型的文本数据。

让我们通过加载数据集开始,这样就能准备数据了。下面被叫做load_clean_sentences()的函数,可以被用来加载训练、测试以及两种语言的数据集。

84676719397a831291dc245a93b9f7c16dc1a7bd

我们将使用“两者”或者训练和测试数据集的组合来定义此类问题的最大长度和词汇表。

另外,我们可以仅从训练数据集中定义这些属性,并缩短在测试集中过长或者不在词汇表中的示例。

我们可以使用Keras Tokenize类来映射单词到整数,如果建模需要的话。我们将为英文序列和德文序列使用分隔标记。这个create_tokenizer()函数将在一个短语列表上训练一个标记。

5994cb39d61af54fd2eef4b6b92702138694c0ca

相似地,max_length()函数将找到在短语列表中最常的序列的长度。

548fdf5e6a36ca303c51b52f66a66a06f46e6438

我们可以调用带着组合数据集的函数来准备标记、词汇量大小和最大长度,同时给英文和德文的短语。

75dfcd8d561823f2560fc07518352cc307104b3a

我们现在已经准备好训练数据集了。

每个输入和输出序列必须编码成整数,并填充到最大短语长度。这是因为我们将使用一个单词嵌入给输入序列和一个热编码输出序列。下面的函数encode_sequences()将执行这些操作并且返回结果。

db7814aef45df670444d67c80689d1e53a2c4dbe

输出序列需要是一个热编码的。这是因为该模型将预测词汇表中每个单词作为输出的概率。

下面的encode_output()函数将热编码英文输出序列。

4e9e7bd98a61ecc4b200fd3f784c8e551b5b2e1b

我们可以利用这两个函数,准备好训练和测试数据集用于训练模型。

226df5d01b7d5980fe1163ae729789d89a098c3b

关于这个问题,我们将用编解码LSTM。在这个结构中,输入序列通过一个被称作前-后的模型进行编码,然后通过一个被称作后台模型的解码器一个单词一个单词的进行解码。

下面的define_model()函数定义了模型,并且用一些参数来配置模型,如如输入出的单词表的大小,输入输出短语的最大长度,用于配置模型的存储单元的数量。

该模型采用随机梯度下降的高效的Adam方法进行训练,最大限度地减少了分类损失函数,因为我们把预测问题框架化为多类分类。

对于这个问题,模型配置没有得到优化,这意味着你有足够的机会调整它,并提高翻译的技巧。

1665e91bd5a6016902a9a5e37571b6016b32269c

最后我们可以训练模型了。

我们训练了30个时期的模型和每64个实例为一批的多个批次。

我们使用检查点确保每次测试集上的模型技术的提高,将模型保存到文件中。

8c91d01397305aab7a59748d320bc0b5600810c7

我们可以把所有这些结合在一起,并拟合神经翻译模型。

下面列出完整的示例。

146bca4d124ad881354cf4e0ca0b5112d6494965

0fe210343fee1fcb19d5cbca1454d3ee68316eaa

运行示例首先打印数据集的参数汇总,如词汇表大小和最大短语长度。

ea50ade17f36b5e2791ea535f1de2d04a8421231

接下来,打印定义的模型的一览,允许我们确认模型配置:

79998ca9a4b6873e369072d7a3a95e6870187faa

还创建了模型的一个部分,为模型配置提供了另一个视角:

26379b3b99a8eecd064b52d885e7e18522784b3b

其次,对模型进行训练。以目前的CPU硬件每一个时期大约需要30秒;

在运行过程中,将模型保存到文件model.h5中,为了准备下一步的推论。

f95c453c71a32a0f12f7ea05cbcf9ae535924c75

Evaluate Neural Translation Model

我们将在训练和测试的数据集上评估模型这个模型在训练数据集上将会表现的非常好,并且已经推广到在测试数据集上执行良好。理想情况下,我们将使用一个单独的验证数据集来帮助训练过程中的模型选择,而不是测试集。必须像以前那样加载和准备清理过的数据集。

b5dc9867328f9429f0e57a063bd59fe8c6c417cb

其次,必须在训练过程中保存最佳模型。

0e50acaa0c42681c445f7d867810eda62e1e0a6d

评估过程包括两个步骤:首先生成一个翻译过的输出序列,然后为许多输入示例重复这个过程,并在多个案例中总结该模型的技巧。

从推论开始,该模型可以一次性地预测整个输出序列。

3511147a7170528b2e9930e286361b07bf8fd2fb

这将是一个我们能在标记(tokenizer)中枚举和查找的整数序列,以便映射回到对应的单词。

下面称为word_for_id()的函数,将执行此反向映射。

fb2d6bd12259938ca077501c0b0f66eac74d1c94

我们可以对转换中的每个整数执行此映射,并将返回一个单词字符串结果。

下面的函数predict_sequence()给一个单一编码过的源短语执行此操作。

e6b008fecbc0db5e4178d24cd3031e862e1ffa0a

接下来,可以对数据集中的每个源短语重复操作,并将预测结果与预期的目标短语进行比较。

可以将这些比较打印到屏幕上,以了解模型在实践中的执行情况。

我们也计算了BLEU得分以得到量化了的概念模型执行的质量。

下面的evaluate_model()函数实现这个功能,为在提供的数据集中的每个短语调用上述predict_sequence()函数。

b21f49a98b19dc4155b916fe90af0221cbede38c

将所有这些结合起来,并在训练和测试数据集上评估所加载的模型。

以下是完整的代码清单:

349625801ebdcc1e822d801b162ecc1ddee73333

e284a1dcda2985d039611db8ab8775fcc60b1124

运行示例首先打印源文本、预期和预测翻译的示例,以及训练数据集的分数,然后是测试数据集。考虑到数据集的随机重排和神经网络的随机性,你的具体结果会有所不同。

首先查看测试数据集的结果,我们可以看到翻译是可读的,而且大部分是正确的

例如:“ich liebe dich”被正确地翻译成了“i love you”。我们也能看到这些翻译的结果不是太完美,“ich konnte nicht gehen”被翻译成了“i cant go”,而不是希望的“i couldnt walk”。

3995ac8455d8e0dfa3ba8f5c7e573bd4952c7188

查看测试集上的结果,确实看到可接受的翻译结果,这不是一项容易的任务。

例如,我们可以看到“ich mag dich nicht”正确地翻译为“i dont like you”。也看到一些比较差的翻译,一个可以让该模型可能受到进一步调整的好例子,如“ich bin etwas beschwipst”翻译成了“i a bit bit”,而不是所期望的“im a bit tipsy”。

实现了bleu-4得分为0.076238,提供一个基本的技巧来对模型进行进一步的改进。

41afab9756483408c5e9e578342829415d19e657

扫描二维码,获取更多资讯:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第1篇:Flowable快速工作流脚手架Jsite_克隆项目

JSite 快速开发框架,内置Flowable工作流引擎 五大基础模块 前后端基础代码自动生成 权限精确控制。 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本。 文章目录一、克隆/打开项目1. 搜索项…

基于阿里云MaxCompute实现游戏数据运营

摘要: 一、总览 一个游戏/系统的业务数据分析,总体可以分为图示的几个关键步骤: 1、数据采集:通过SDK埋点或者服务端的方式获取业务数据,并通过分布式日志收集系统,将各个服务器中的数据收集起来并送到指…

Spark精华问答 | 为什么选择Spark作为流计算引擎?

总的来说,Spark采用更先进的架构,使得灵活性、易用性、性能等方面都比Hadoop更有优势,有取代Hadoop的趋势,但其稳定性有待进一步提高。我总结,具体表现在如下几个方面。1Q:为什么选择Kafka去承担类似数据总…

linux c调用wcf服务,Silverlight+WCF实现跨域调用

在这篇文章中,WCF扮演服务器,向外提供LoginVaild服务;Silverlight扮演客户端,调用WCF提供的LoginVaild服务。思路有了,下面进行代码实现。数据库脚本实现新建T_User表,在表中添加两个字段username、passwor…

第3篇:Flowable快速工作流脚手架Jsite_关闭演示模式

接上一篇:第2篇:Flowable快速工作流脚手架Jsite_配置项目 https://blog.csdn.net/weixin_40816738/article/details/103387623 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本。 文…

从单租户IaaS到多租户PaaS——金融级别大数据平台MaxCompute的多租户隔离实践

摘要:在2017年云栖大会•北京峰会的大数据专场中,来自阿里云的高级技术专家李雪峰带来了主题为《金融级别大数据平台的多租户隔离实践》的演讲。在分享中,李雪峰首先介绍了基于传统IaaS单租户架构做隔离时面临的问题;然后&#xf…

IDC 2019Q1云市场报告重磅出炉;英特尔与百度签署3年新协议;谷歌收购云存储公司 Elastifile,增强自家……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go ChinaJoy中任天堂亮相&#…

可靠度理论中“设计基准期”、“设计使用年限”、“使用寿命”几个概念的区分

文章目录 0. 背景1. 重现期2. 设计基准期3. 设计使用年限调整系数4. 一把杆秤5. 调整系数的补充说明Last 0. 背景 在可靠度理论中,经常遇见“设计基准期”、“设计使用年限”、“使用寿命”几个概念。这些概念搞不清楚对于梳理结构荷载组合而言就是致命的。本文也是…

第4篇:Flowable快速工作流脚手架Jsite_启动项目

接上一篇:第3篇:Flowable快速工作流脚手架Jsite_关闭演示模式 https://blog.csdn.net/weixin_40816738/article/details/103388349 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本…

基于MaxCompute搭建社交好友推荐系统

摘要:本次由阿里云驻云科技资深架构师翟永东带来了“基于MaxCompute搭建社交好友推荐系统”为主题的分享,主要对大数据在好友推荐系统中的应用、好友推荐系统的分析模型、好友推荐系统在阿里云上的实现方式和MaxCompute技术进行了精彩的介绍。 点此查看原…

高德地图基于阿里云MaxCompute的最佳实践

摘要: 云计算带来的变革不言而喻,作为一种新型的IT交付模式,切实为企业节省IT成本、加快IT与企业业务结合效率、提升创新能力、加强管理水平以及增强系统本身的可靠性等方面提供巨大支持,是企业实现新发展的重要途径,它…

如何从零开始设计一颗芯片?

戳蓝字“CSDN云计算”关注我们哦!来源:陌上风骑驴看IC作者:陌上风骑驴在各方助力下,集成电路成了时代热点,有大量文章在写芯片设计之复杂之困难,老驴打算从EDA 使用角度捋一遍芯片设计流程。在老驴画出第一…

第5篇:Flowable快速工作流脚手架Jsite_请假实战_部署流程和发起流程

接上一篇:第4篇:Flowable快速工作流脚手架Jsite_启动项目 https://blog.csdn.net/weixin_40816738/article/details/103388465 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本…

离线计算中的幂等和DataWorks中的相关事项

摘要: 概念 幂等这个词在软件研发中经常被提到。比如消息发送时不应该同时给同个用户推送多次相同的消息,针对同一笔交易的付款也不应该在重试过程中扣多次钱。曾见过一个案例,有个对于一个单据的确认模块没有考虑到幂等性,导致对…

解决在待办任务菜单中都会抛出异常,由于definitionId=undefined导致的问题

文章目录一、部门经理流转1. 登录dept账号2. 在待办任务中,签收任务3. 在待办任务中,办理任务3.1. 响应码5003.2. 请求的url3.3. 页面传递的参数3.4. 控制台报错信息提取3.5. 在获取代办列表FlowTaskService的104行3.6. 在获取代办列表FlowTaskService的…

程序员竟以身试“色”,只因给女友选七夕礼物!看完我酸了

戳蓝字“CSDN云计算”关注我们哦!作者 | 伍杏玲出品 | 程序人生(ID:coder_life)铛铛档,你知道 8 月 7 号是什么日子吗?除了是工作日的星期三,它还是七夕情人节!在程序员一片哀嚎“我…

第6篇:Flowable快速工作流脚手架Jsite_请假实战_部门经理审批

接上一篇:第5篇:Flowable快速工作流脚手架Jsite_请假实战_部署流程和发起流程https://blog.csdn.net/weixin_40816738/article/details/103388680 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因…

华为正式发布方舟编译器,相关源码已开放下载;微软开源量子开发工具包 QDK;GitHub回应突然断供:也很无可奈何的样子……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 本田1.34亿份文档&#xff0…

【MPS最佳实践】媒体工作流转码

摘要:背景 1个输入文件对应多个输出文件(不同分辨率,不同格式等),通过控制台的图形化界面,快速搭建常用视频处理流程。 优势 简单易用,视频上传完成自动触发转码任务。 功能强大,支持…

解决由于没有办理权限导致的403,权限不足

接上一篇:解决在待办任务菜单中都会抛出异常,由于definitionIdundefined导致的问题 https://blog.csdn.net/weixin_40816738/article/details/103389663 文章目录一、问题现象二、问题定位三、解决方案3.1. 登录jsite系统管理员账号,给dept用…