机器翻译之数据处理

目录

1.导包 

 2.读取本地数据

3.定义函数:数据预处理 

 4.定义函数:词元化

 5.统计每句话的长度的分布情况

6. 获取词汇表

7. 截断或者填充文本序列

 8.将机器翻译的文本序列转换成小批量tensor

 9.加载数据

10.知识点个人理解


1.导包 

#导包
import os
import torch
import dltools

 2.读取本地数据

#读取本地数据
with open('./fra-eng/fra.txt', 'r', encoding='utf-8') as f:raw_text = f.read()  #一次读取所有数据print(raw_text[:75])

 

Go.	Va !
Hi.	Salut !
Run!	Cours !
Run!	Courez !
Who?	Qui ?
Wow!	Ça alors !

3.定义函数:数据预处理 

#数据预处理
def preprocess_nmt(text):#判断标点符号前面是否有空格def no_space(char, prev_char):return char in set(',.!?') and prev_char != ' '#替换识别不了的字符,替换不正常显示的空格,将大写字母变成小写text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()#在单词和标点之间插入空格out = [' '+ char  if i>0 and no_space(char, text[i-1]) else char for i, char in enumerate(text)]return ''.join(out)  #合并out#测试:数据预处理
text = preprocess_nmt(raw_text)
print(text[:80])
go .	va !
hi .	salut !
run !	cours !
run !	courez !
who ?	qui ?
wow !	ça alors !

 4.定义函数:词元化

#定义函数:词元化
def tokenize_nmt(text, num_examples=None):"""text:传入的数据文本num_examples=None:样本数量为空,判断数据集中剩余的数据量是否满足一批所取的数据量"""source, target = [], []#以换行符号\n划分每一行for i, line in enumerate(text.split('\n')):#if num_examples  表示不是空,相当于 if num_examples != Noneif num_examples and i > num_examples:break#从每一行数据中 以空格键tab分割数据parts = line.split('\t')  #将英文与对应的法语分割开if len(parts) == 2:  #单词文本与标点符号两个元素source.append(parts[0].split(' ')) #用空格分割开单词文本与标点符号两个元素target.append(parts[1].split(' '))return source, target#测试词元化代码
source, target = tokenize_nmt(text)
source[:6], target[:6]

 

([['go', '.'],['hi', '.'],['run', '!'],['run', '!'],['who', '?'],['wow', '!']],[['va', '!'],['salut', '!'],['cours', '!'],['courez', '!'],['qui', '?'],['ça', 'alors', '!']])

 5.统计每句话的长度的分布情况

#统计每句话的长度的分布情况
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):dltools.set_figsize()  #创建一个适当的画布_,_,patches = dltools.plt.hist([[len(l) for l in xlist], [len(l) for l in ylist]])dltools.plt.xlabel(xlabel) #添加x标签dltools.plt.ylabel(ylabel)  #添加y标签for patch in patches[1].patches:  #为patches[1]的柱体添加斜线patch.set_hatch('/')dltools.plt.legend(legend) #添加标注#测试代码:统计每句话的长度的分布情况
show_list_len_pair_hist(['source', 'target'], '# tokens per sequence', 'count', source, target)

 

6. 获取词汇表

#获取词汇表
src_vocab = dltools.Vocab(source, min_freq=2, reserved_tokens=['<pad>', '<bos>', '<eos>'])
len(src_vocab)

 10012

7. 截断或者填充文本序列

def truncate_pad(line, num_steps, padding_token):"""line:传入的数据num_steps:子序列长度padding_token:需要填充的词元"""if len(line) > num_steps:return line[:num_steps]  #太长就截断#太短就补充return line + [padding_token] * (num_steps - len(line))  #填充#测试
#source[0]表示英文单词
truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>'])

 [47, 4, 1, 1, 1, 1, 1, 1, 1, 1]

 8.将机器翻译的文本序列转换成小批量tensor

def build_array_nmt(lines, vocab, num_steps):#通过vocab拿到line的索引lines = [vocab[l] for l in lines]#每个序列结束之后+一个'eos'lines = [l + [vocab['eos']] for l in lines]#对每一行文本 截断或者填充文本序列,再转化为tensorarray = torch.tensor([truncate_pad(l, num_steps, vocab['<pad>']) for l in lines])#获取有效长度valid_len = (array != vocab['<pad>']).type(torch.int32).sum(1)return array, valid_len

 9.加载数据

def load_data_nmt(batch_size, num_steps, num_examples=600):# 需要返回数据集的迭代器和词表text = preprocess_nmt(raw_text)source, target = tokenize_nmt(text, num_examples)src_vocab = dltools.Vocab(source, min_freq=2, reserved_tokens=['<pad>', '<bos>', '<eos>'])tgt_vocab = dltools.Vocab(target, min_freq=2, reserved_tokens=['<pad>', '<bos>', '<eos>'])src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)data_iter = dltools.load_array(data_arrays, batch_size)return data_iter, src_vocab, tgt_vocab

 

#测试代码
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)for X, X_valid_len, Y, Y_valid_len in train_iter:print('X:', X.type(torch.int32))print('X的有效长度:', X_valid_len)print('Y:', Y.type(torch.int32))print('Y的有效长度:',Y_valid_len)break
X: tensor([[17, 20,  4,  0,  1,  1,  1,  1],[ 7, 84,  4,  0,  1,  1,  1,  1]], dtype=torch.int32)
X的有效长度: tensor([4, 4])
Y: tensor([[ 11,  61, 144,   4,   0,   1,   1,   1],[  6,  33,  17,   4,   0,   1,   1,   1]], dtype=torch.int32)
Y的有效长度: tensor([5, 5])

10.知识点个人理解

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序

2016年国赛高教杯数学建模 A题 系泊系统的设计 近浅海观测网的传输节点由浮标系统、系泊系统和水声通讯系统组成&#xff08;如图1所示&#xff09;。某型传输节点的浮标系统可简化为底面直径2m、高2m的圆柱体&#xff0c;浮标的质量为1000kg。系泊系统由钢管、钢桶、重物球、…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

solidwork找不到曲面

如果找不到曲面 则右键找到选项卡&#xff0c;选择曲面

Pybullet 安装过程

Pybullet 安装过程 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件&#xff0c;直接装之前检查下&#xff0c;要不会报缺少某版本MVSC的error&#xff0c;最好的方式是直接下载visual studio&#xff0c;直接按默认的来装。 2. 安装Pybullet 这里…

Mycat中间件

一、案例目标 &#xff08;1&#xff09;了解Mycat提供的读写分离功能。 &#xff08;2&#xff09;了解MySQL数据库的主从架构。 &#xff08;3&#xff09;构建以Mycat为中间件的读写分离数据库集群。 二、案例分析 1.规划节点 使用Mycat作为数据库中间件服务构建读写分…

聚观早报 | 小米三折叠手机专利曝光;李斌谈合肥投资蔚来

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月20日消息 小米三折叠手机专利曝光 李斌谈合肥投资蔚来 索尼PS5 Pro包装亮相 新一代Spectacles AR眼镜发布 通…

媒体专访 | CertiK首席安全官李康教授:变化中的加密资产监管环境带来了新机遇

在2024韩国区块链周期间&#xff0c;CertiK首席安全官李康教授接受了韩国媒体E-Today的独家专访。采访中&#xff0c;李康教授探讨了加密资产监管环境的最新动态及其为行业带来的新机遇。同时&#xff0c;他也表达了对加密资产生态系统所面临的安全挑战的担忧&#xff0c;并强调…

无人机视角应急救援(人)数据集

无人机视角应急救援&#xff08;人&#xff09;&#xff0c;两个数据集 part1&#xff0c;使用DJI Phantom 4A拍摄&#xff0c;分辨率为19201080像素。山区场景&#xff0c;图像中人员姿势分为站立、坐着、躺着、行走、奔跑。共1981张图像6500个不同姿势的标记&#xff0c; par…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…

Vue使用代理方式解决跨域问题

1、解决跨域问题 如果 Vue 前端应用请求后端 API 服务器&#xff0c;出现跨域问题&#xff08;CORS&#xff09;&#xff0c;如下图&#xff1a; 解决方法&#xff1a;在 Vue 项目中&#xff0c;打开 vue.config.js 配置文件&#xff0c;在配置文件中使用代理解决跨域问题。 …

腾讯云ssl证书到期,续期免费证书并部署

首先咱用的免费证书&#xff0c;现在最长90天有效期&#xff0c;今天又到期了&#xff0c;得及时续期避免关联资源访问受限。 我这个证书是关联了一个负载均衡和两个容器服务的&#xff08;如果您的应用是ngnix或其他的应用那和本文操作可能有点不一样&#xff09; 所以需要做…

SpringCloud (1) 服务拆解

1 服务拆解和治理 1.1 服务拆解 微服务的核心就是服务拆分,将传统的大项目拆分为多个微型服务(服务或微服务),实现服务之间"高内聚(微服务职责单一),低耦合(微服务功能相对独立)"的目的 (1) 水平(横向)拆分:先搭出拆分框架,比如【公共服务】(比如:common服务,client…

Redis作为单线程模型,为什么效率高、速度快呢?

前言&#xff1a; 效率高、速度快是相较于数据库来说的&#xff08;MySQL、Orcale、SQL server&#xff09; 文章目录 一、单线程模式的工作流程二、为什么快&#xff1f; 一、单线程模式的工作流程 这里我们所说的单线程是指&#xff1a;Redis只使用一个线程&#xff0c;来处…

从零到一:打造安全高效敦煌测评自养号体系

敦煌测评自养号是一种提升店铺销售和排名的有效策略&#xff0c;卖家可以自行注册并管理买家账号&#xff0c;通过模拟真实买家行为为自家店铺进行测评和补单。以下是一些关键技巧&#xff0c;帮助卖家快速提升销售和排名&#xff1a; 一、账号注册与养号 环境搭建&#xff1…

prober found high clock drift,Linux服务器时间不能自动同步,导致服务器时间漂移解决办法。

文章目录 一、场景二、问题三、解决办法&#xff08;一&#xff09;给服务器添加访问网络能力&#xff08;二&#xff09;手动同步1. 检查有没有安装ntp2. 没有安装ntp则离线安装ntp2.1 下载安装包2.2 安装2.3 启动 ntp 3. 设置内部时钟源3.1 编辑/etc/ntp.conf3.1 重启ntp服务…

【vmware】vmware中手动安装vmwaretools

问题: vmware中点击安装vmwaretools时出现如下&#xff1a; VMware Tools 不再随旧版客户机操作系统的 VMware Workstation 一起提供。 请从 https://packages-prod.broadcom.com/tools/frozen/windows/winPreVista.iso 下载&#xff0c;并参阅 https://knowledge.broadcom.co…

海外大带宽服务器连接失败怎么办?

在全球化日益加深的今天&#xff0c;海外大带宽服务器已成为企业拓展国际市场、提升业务效率的重要工具。然而&#xff0c;面对复杂多变的网络环境和技术挑战&#xff0c;服务器连接失败的问题时有发生&#xff0c;这不仅影响了企业的正常运营&#xff0c;还可能带来经济损失和…

VM虚拟机使用的镜像文件下载

文章目录 Windows系统进入微软官网下载工具以Windows10为例下载镜像文件 Windows系统 进入微软官网下载工具 微软中国官网&#xff1a;https://www.microsoft.com/zh-cn/ 以Windows10为例下载镜像文件 选择下载的路径 开始下载 安装windows10操作系统出现Time out问题及解决办…

WPF DataGrid 动态修改某一个单元格的样式

WPF DataGrid 动态修改某一个单元格的样式 <DataGrid Name"main_datagrid_display" Width"1267" Height"193" Grid.Column"1"ItemsSource"{Binding DataGridModels}"><DataGrid.Columns><!--ElementStyle 设…

得物自建 Redis 无人值守资源均衡调度设计与实现

目录&#xff1a; 一、为什么要做资源均衡调度 二、为什么要做自动化资源均衡调度 三、如何合理选择迁移节点 四、如何保障迁移过程中可靠性1. 添加从节点2. 检查同步数据正常3. 执行主从切换4. 检查主从切换正常5. 删除待迁移节点6. 消息通知 五、迁移任务管理展示 六、总结 …