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

2024-01-17 19:10

本文主要是介绍机器翻译 深度学习预处理实战(中英文互译)一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


文章目录

  • 深度学习预处理实战(中英文互译)
  • 前言
  • 一、获取中英互译的数据集
  • 二、具体步骤
    • 1.首先引入相关库
    • 2.中英文预处理
    • 3.主函数运行


前言

基于深度学习的机器翻译学习分为三步:
(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 Truereturn 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 tffrom sklearn.model_selection import train_test_splitimport reimport ioimport 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 Truereturn 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深度神经网络训练实战中英文互译(完结篇)

这篇关于机器翻译 深度学习预处理实战(中英文互译)一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/616928

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧