深度学习用的有一年多了,最近开始NLP自然处理方面的研发。刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程。
本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新ing)
- NLP机器翻译深度学习实战课程·零(基础概念)
- NLP机器翻译深度学习实战课程·壹(RNN base)
- NLP机器翻译深度学习实战课程·贰(RNN+Attention base)
- NLP机器翻译深度学习实战课程·叁(CNN base)
- NLP机器翻译深度学习实战课程·肆(Self-Attention base)
- NLP机器翻译深度学习实战课程·伍(应用部署)
本系列教程参考博客:https://me.csdn.net/chinatelecom08
在上个文章中,我们已经简单介绍了NLP机器翻译,这次我们将用实战的方式讲解基于RNN的翻译模型。
基于RNN的seq2seq架构包含encoder和decoder,decoder部分又分train和inference两个过程,具体结构如下面两图所示:
可以看出结构很简单(相较于CNN与Attention base),下面我们就通过代码的形式实现,来进一步探究理解模型内在原理。
此网站http://www.manythings.org/anki/上有许多翻译数据,包含多种语言,这里此教程选择的是中文到英语的数据集。
训练下载地址:http://www.manythings.org/anki/cmn-eng.zip
解压cmn-eng.zip,可以找到cmn.txt文件,内容如下:
可以发现,每对翻译数据在同一行,左边是英文,右边是中文使用 \t 作为英语与中文的分界。
使用网络训练,需要我们把数据处理成网络可以接收的格式。
针对这个数据,具体来说就是需要把字符转换为数字(句子数字化),句子长度归一化处理。
句子数字化
可以参考我的这博客:『深度应用』NLP命名实体识别(NER)开源实战教程,数据预处理的实现。
分别对英语与汉字做处理。
英文处理
因为英语每个单词都是用空格分开的(除了缩写词,这里缩写词当做一个词处理),还有就是标点符号和单词没有分开,也需要特殊处理一下
这里我用的是一个简单方法处理下,实现在标点前加空格:
使用这个方法来把词个字典化:
中文处理
在处理中文时可以发现,有繁体也有简体,所以最好转换为统一形式:(参考地址)
使用方法,把繁体转换为简体:
再使用jieba分词的方法来从句子中分出词来:
下面进行padding
最后统一运行处理一下:
输出结果如下:
用的是双层LSTM网络
自定义了一个acc,便于显示效果,keras内置的acc无法使用
64Epoch训练结果如下:
从训练集选取部分数据进行测试
『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
原文:https://www.cnblogs.com/xiaosongshine/p/11394918.html