机器翻译 深度学习预处理实战(中英文互译)一

2023-11-06

深度学习预处理实战(中英文互译)



前言

基于深度学习的机器翻译学习分为三步:
(1)解决自动将一种自然语言文本(源语言)翻译为另一种自然语言文本(目标语言)的问题。
(2)准备人工翻译的数据集,将其分成训练集和测试集。使用训练集的数据来训练深度神经网络。
(3)使用测试集的数据来评估模型表现。
深度学习机器翻译其实是用神经网络去学习人工翻译的数据集,使数学世界的神经网络成为取代真实世界中人工翻译的可计算模型。


一、获取中英互译的数据集

要进行深度学习的预训练和后续的训练,需要寻找一个合适的数据集。本数据集来自Manythings.org一家公益英语学习网站。这里我们可以看一下数据集的结构:
在这里插入图片描述
资源一直传不上去,给大家分享一个百度网盘链接提取链接:https://pan.baidu.com/s/1crPPSXtzaY1efyBLWprm-g?pwd=17eh
提取码:17eh

二、具体步骤

这里分步为讲解来大家容易理解,文章结尾附上完整代码,大家可以直接运行

1.首先引入相关库

代码如下(示例):库的下载直接pip即可,这里我不多赘述,由于是预处理,大家可以直接在cpu上运行不需要GPU

import tensorflow as tf
from sklearn.model_selection import train_test_split
import re
import io
import jieba
jieba.initialize()  # 手动初始化jieba资源,提高分词效率。
jieba.enable_paddle() # 启动paddle模式。 0.40版之后开始支持,早期版本不支持

2.中英文预处理

代码如下(示例):
这里判断是否为中文或者英文,再对中英文预处理为我们需要的格式,将中文按照字处理。

判断是否包含中文

#判断是否包含中文
def is_chinese(string):
    """
    检查整个字符串是否包含中文
    :param string: 需要检查的字符串
    :return: bool
    """
    for ch in string:
        if u'\u4e00' <= ch <= u'\u9fa5':
            return True
    return False
  
#中英文预处理
def preprocess_sentence(w):
    if is_chinese(w):
        w = re.sub(r"[^\u4e00-\u9fa5,。?!]+", "", w)
        w = w.strip()
        #seg_list = jieba.cut(w,use_paddle=True) # 使用paddle模式分词
        #w= ' '.join(list(seg_list))
        w=分字(w)
        # 给句子加上开始和结束标记
        # 以便模型知道每个句子开始和结束的位置
        w = '<start> ' + w + ' <end>'
    else:
        w = w.lower()
        # 除了 (a-z, A-Z, ".", "?", "!", ","),将所有字符替换为空格
        w = re.sub(r"[^a-zA-Z?.!,]+", " ", w)
        w = w.rstrip().strip()
        # 给句子加上开始和结束标记
        # 以便模型知道每个句子开始和结束的位置
        w = '<start> ' + w + ' <end>'
    

对中文进行分字处理


def 分字(str):
    line = str.strip()  
    pattern = re.compile('[^\u4e00-\u9fa5,。?!]') 
    zh = ''.join(pattern.split(line)).strip()
    result=''
    for character in zh:
        result+=character+' '
    return result.strip() 
  
#调用预处理方法,并返回这样格式的句子对:[chinese, english]
def create_dataset(path, num_examples):
    lines = io.open(path, encoding='UTF-8').read().strip().split('\n')
    word_pairs = [[preprocess_sentence(w) for w in l.split('\t')[0:2]]  for l in lines[:num_examples]]
    return zip(*word_pairs)
    

def max_length(tensor):
    return max(len(t) for t in tensor)
#词符化
def tokenize(lang):
    lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(filters='')
    lang_tokenizer.fit_on_texts(lang)
    tensor = lang_tokenizer.texts_to_sequences(lang)
    tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,padding='post')
    return tensor, lang_tokenizer
  

加载数据集,返回输入张量(中文、英文)目标张量(中文、英文)4个张量

# 创建清理过的输入输出对
def load_dataset(path, num_examples=None):
    targ_lang, inp_lang = create_dataset(path, num_examples)
    input_tensor, inp_lang_tokenizer = tokenize(inp_lang)
    target_tensor, targ_lang_tokenizer = tokenize(targ_lang)
    return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer

3.主函数运行

if __name__=="__main__":
    num_examples = 100
    #读取中英互译文件
    path_to_file = 'cmn.txt'
    print('英文预处理效果')
    print('转换前:'+'he is a "Editor-in-Chief".')
    print('转换后:'+ preprocess_sentence('he is a "Editor-in-Chief".'))
    print('中文预处理效果')
    print('转换前:'+'人工智能程序员这种职业太*&¥%的厉害了!?Are you ok')
    print('转换后:'+ preprocess_sentence('人工智能程序员这种职业太*&¥%的厉害了!?Are you ok'))
    en,chs = create_dataset(path_to_file, num_examples)
    print('处理后的文本数据集示例:')
    print(en)
    print(chs)
 # # 为了快速演示,先处理num_examples条数据集
    # input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)
    # # 计算目标张量的最大长度 (max_length)
    # max_length_targ, max_length_inp = max_length(target_tensor), max_length(input_tensor)
    # # 采用 80 - 20 的比例切分训练集和验证集
    # input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)
    # # 显示长度
    # print(len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val))
    # print('经过编码后的源语言(中文)张量数据集示例:')
    # print(input_tensor)
    # print('源语言(中文)字典内的单词编码:')
    # print(inp_lang.word_index)
    # print('格式化显示一条源语言(中文)字典内的单词编码:')
    # convert(inp_lang, input_tensor_train[20])
    # print('经过编码后的目标语言(英文)张量数据集示例:')
    # print(target_tensor)
    # print('目标语言(英文)字典内的单词编码:')
    # print(targ_lang.word_index)
    # print('格式化显示一条目标语言(英文)字典内的单词编码:')
    # convert(targ_lang, target_tensor_train[20])
    # #创建一个tf.data数据集
    # BUFFER_SIZE = len(input_tensor_train)
    # BATCH_SIZE = 64
    # dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)
    # dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)
    # example_input_batch, example_target_batch = next(iter(dataset))
    # print('数据集尺寸:')
    # print(example_input_batch.shape, example_target_batch.shape)

这里注释了部分代码的输出,主要展示翻译部分,如果自行需要可以在文章尾部复制全文自行测试
部分运行结果:我们可以观察到对应的中英文翻译
在这里插入图片描述

在这里附上实战整体代码,可直接下载相关库后运行。

# 创建清理过的输入输出对
import tensorflow as tf

from sklearn.model_selection import train_test_split

import re

import io

import jieba
jieba.initialize()  # 手动初始化jieba资源,提高分词效率。
jieba.enable_paddle() # 启动paddle模式。 0.40版之后开始支持,早期版本不支持
#判断是否包含中文
def is_chinese(string):
    """
    检查整个字符串是否包含中文
    :param string: 需要检查的字符串
    :return: bool
    """
    for ch in string:
        if u'\u4e00' <= ch <= u'\u9fa5':
            return True
    return False
#中英文预处理
def preprocess_sentence(w):
    if is_chinese(w):
        w = re.sub(r"[^\u4e00-\u9fa5,。?!]+", "", w)
        w = w.strip()
        #seg_list = jieba.cut(w,use_paddle=True) # 使用paddle模式分词
        #w= ' '.join(list(seg_list))
        w=分字(w)
        # 给句子加上开始和结束标记
        # 以便模型知道每个句子开始和结束的位置
        w = '<start> ' + w + ' <end>'
    else:
        w = w.lower()
        # 除了 (a-z, A-Z, ".", "?", "!", ","),将所有字符替换为空格
        w = re.sub(r"[^a-zA-Z?.!,]+", " ", w)
        w = w.rstrip().strip()
        # 给句子加上开始和结束标记
        # 以便模型知道每个句子开始和结束的位置
        w = '<start> ' + w + ' <end>'
    return w
def 分字(str):
    line = str.strip()  
    pattern = re.compile('[^\u4e00-\u9fa5,。?!]') 
    zh = ''.join(pattern.split(line)).strip()
    result=''
    for character in zh:
        result+=character+' '
    return result.strip() 
# 调用预处理方法,并返回这样格式的句子对:[chinese, english]
def create_dataset(path, num_examples):
    lines = io.open(path, encoding='UTF-8').read().strip().split('\n')
    word_pairs = [[preprocess_sentence(w) for w in l.split('\t')[0:2]]  for l in lines[:num_examples]]
    return zip(*word_pairs)
#判断词序列长度
def max_length(tensor):
    return max(len(t) for t in tensor)
#词符化
def tokenize(lang):
    lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(filters='')
    lang_tokenizer.fit_on_texts(lang)
    tensor = lang_tokenizer.texts_to_sequences(lang)
    tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,padding='post')
    return tensor, lang_tokenizer
# 创建清理过的输入输出对
def load_dataset(path, num_examples=None):
    targ_lang, inp_lang = create_dataset(path, num_examples)
    input_tensor, inp_lang_tokenizer = tokenize(inp_lang)
    target_tensor, targ_lang_tokenizer = tokenize(targ_lang)
    return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer
#格式化显示字典内容
def convert(lang, tensor):
      for t in tensor:
        if t!=0:
            print("%d ----> %s" % (t, lang.index_word[t]))
if __name__=="__main__":
    num_examples = 100
    #读取中英互译文件
    path_to_file = 'cmn.txt'
    print('英文预处理效果')
    print('转换前:'+'he is a "Editor-in-Chief".')
    print('转换后:'+ preprocess_sentence('he is a "Editor-in-Chief".'))
    print('中文预处理效果')
    print('转换前:'+'人工智能程序员这种职业太*&¥%的厉害了!?Are you ok')
    print('转换后:'+ preprocess_sentence('人工智能程序员这种职业太*&¥%的厉害了!?Are you ok'))
    en,chs = create_dataset(path_to_file, num_examples)
    print('处理后的文本数据集示例:')
    print(en)
    print(chs)
    # # 为了快速演示,先处理num_examples条数据集
    # input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)
    # # 计算目标张量的最大长度 (max_length)
    # max_length_targ, max_length_inp = max_length(target_tensor), max_length(input_tensor)
    # # 采用 80 - 20 的比例切分训练集和验证集
    # input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)
    # # 显示长度
    # print(len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val))
    # print('经过编码后的源语言(中文)张量数据集示例:')
    # print(input_tensor)
    # print('源语言(中文)字典内的单词编码:')
    # print(inp_lang.word_index)
    # print('格式化显示一条源语言(中文)字典内的单词编码:')
    # convert(inp_lang, input_tensor_train[20])
    # print('经过编码后的目标语言(英文)张量数据集示例:')
    # print(target_tensor)
    # print('目标语言(英文)字典内的单词编码:')
    # print(targ_lang.word_index)
    # print('格式化显示一条目标语言(英文)字典内的单词编码:')
    # convert(targ_lang, target_tensor_train[20])
    # #创建一个tf.data数据集
    # BUFFER_SIZE = len(input_tensor_train)
    # BATCH_SIZE = 64
    # dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)
    # dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)
    # example_input_batch, example_target_batch = next(iter(dataset))
    # print('数据集尺寸:')
    # print(example_input_batch.shape, example_target_batch.shape)

本部分实战为深度学习的预处理部分,下一文我们将进行深度学习实现机器翻译中英互译
机器翻译:引入注意力机制的Encoder-Decoder深度神经网络训练实战中英文互译(完结篇)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器翻译 深度学习预处理实战(中英文互译)一 的相关文章

随机推荐

  • 一文理解pytorch张量概念和tensor的三种创建方式!

    1 张量是什么 张量是一个多维数组 它是标量 向量 矩阵的高维拓展 1 1 Variable Variable是 torch autograd中的数据类型 主要用于封装 Tensor 进行自动求导 data 被包装的Tensor grad
  • 超实用的IDEA插件推荐,百万级下载量

    超实用的30多款idea插件 有百万级下载量的优秀插件 你值得拥有 好的工具助你事半功倍 快速协助敲出更漂亮更有效率的代码 搬运工这里收集了很不错的IDEA插件 相信你一定会喜欢的 必备插件列表 Grep Console 自定义控制台输出格
  • C#常用代码

    最近学习用C 写了几个程序 记录一下常用的几个操作 方便以后Copy 文件操作 FileStream fs null try byte buf FileStream fs new FileStream strSampleFileName F
  • Ubuntu16.04下opencv2与ROSkinetic中自带opencv3不兼容问题总结

    1 背景 从ROSindigo换到ROSkinetic ROSkinetic中自带的opencv3 与原来indigo中opencv2不一样 所以原来的涉及opencv的程序都出了问题 最近这两天就一直在改兼容性 清明节最后一天了 总结一下
  • WebStorm2016.2 注册码及激活,2018.6.14亲测有效

    License server激活 这可能是最简单的了 在激活框 选择 License server 输入 http idea iteblog com key php 2018 6 14可用
  • table自定义表格的封装

    前言 对原生的table进行封装 让他满足我们一行显示不同个的需求 实现效果 如图所示 一行显示不同数量的内容 实现代码 1 封装的组件 custom table vue 源码看下面 1 一行显示几个td 2 表头数据 表格数据 3 js封
  • 深度学习python图像标记工具labelTool

    深度学习训练需要标记图像位置和类别 之前用的时候是叫做BBox Label Tool master 遇到大图像就显示不完整了 没有自适应缩放 这是改进后的Python脚本 目录结构 图片目录名images 标签目录名labels 图像目录下
  • JDK 新特性篇:JDK 8 新特性详解

    Java8新特性简介 Java 8 又称为 JDK 1 8 是 Java 语言开发的一个主要版本 Java 8 是 Oracle 公司于 2014 年 3 月发布 可以看成是自 Java 5 以来最具革命性的版本 Java 8 为 Java
  • 函数重载和缺省参数

    函数重载 C 允许在同一作用域类声明几个功能类似的同名函数 但是这些同名函数的形式参数 指参数的个数 类型或者顺序 必须不同 也就是说用同一个运算符完成不同的运算功能 函数重载必须是参数的个数或者类型不同 与返回值无关 在C语言当中是不支持
  • 李宏毅机器学习——梯度下降详细讲解

    文章目录 梯度下降 1 学习率 1 1自适应学习率 1 2 Adagrad算法 2 随机梯度下降 3 特征缩放 3 1 特征缩放原因 3 2 特征缩放方法 4 梯度下降的限制 梯度下降 梯度下降是为了解决回归方程中参数的最优化问题 即表现为
  • STM32F446+OLED12864做贪吃蛇游戏

    上面是我的微信和QQ群 欢迎新朋友的加入 闲暇之余发现看了下OLED12864的数据手册 发现他的显示在Y轴上只有页写 也就是一次写8个点 突然想到 如果自己程序需要精准定位到某个点 那这不是会很艹蛋么 去网上搜索 基本上都是页写的代码 也
  • mysql 自动备份(windows 环境)

    windows环境设置mysql自动备份 测试成功 要实现数据库的自动备份就需要一下两步 一 利用MySQL提供的备份命令mysqldump 结合Windows的任务计划程序 实现步骤 编写脚本 说明 该脚本不会关闭数据库 并且可以按每一天
  • C#强制杀进程

    通过cmd命令实现 using System using System Collections Generic using System Linq using System Text using System Threading Tasks
  • 小波矩特征提取matlab代码

    这是我上研究生时写的小波矩特征提取代码 新归一化方法小波矩特征提取 F imread a1 bmp F im2bw F F imresize F 128 128 求取最上点for i 1 128 for j 1 128 if F i j 1
  • AVPlayer 播放在线视频和本地文件的设置区别

    http blog csdn net u012671808 article details 30500595 comments
  • 动态文件版通讯录及C语言中的文件的读写操作

    上一期我们编写了一个C语言版本的简易通讯录 但是我们的之前的通讯录是没有记忆功能的 也就是说 一旦关闭了程序我们存储在里面的数据也就消失了 那么今天我们就来实现一个附带数据储存的通讯录 在此之前 我们先来了解一下C语言中文件的读写函数 1
  • QT-通过控件ObjectName获取控制

    QT 通过控件ObjectName获取控制 示例 1 说明解释 示例 1 说明解释 代码如下 QString strObjectName QString lineEditDev5IP QLineEdit pLineEdit this gt
  • KVM中的ballooning详解

    KVM中的ballooning详解 1 Ballooning简介 通常来说 要改变客户机占用的宿主机内存 是要先关闭客户机 修改启动时的内存配置 然后重启客户机才能实现 而内存的ballooning 气球 技术可以在客户机运行时动态地调整它
  • kibana数据导入导出_怎么实现kibana的数据导入导出

    匿名用户 1级 2016 10 19 回答 logstash好说 client只需要在代码逻辑改下redis地址就可以了 logstash server直接docker pull镜像就可以了 elasticsearch需要我们自己写脚本迁移
  • 机器翻译 深度学习预处理实战(中英文互译)一

    深度学习预处理实战 中英文互译 文章目录 深度学习预处理实战 中英文互译 前言 一 获取中英互译的数据集 二 具体步骤 1 首先引入相关库 2 中英文预处理 3 主函数运行 前言 基于深度学习的机器翻译学习分为三步 1 解决自动将一种自然语