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

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

相关文章

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]