机器翻译之数据处理

server/2024/9/22 3:12:07/

目录

1.导包 

 2.读取本地数据

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

 4.定义函数:词元化

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

6. 获取词汇表

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

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

 9.加载数据

10.知识点个人理解


1.导包 

python">#导包
import os
import torch
import dltools

 2.读取本地数据

python">#读取本地数据
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.定义函数:数据预处理 

python">#数据预处理
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.定义函数:词元化

python">#定义函数:词元化
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.统计每句话的长度的分布情况

python">#统计每句话的长度的分布情况
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. 获取词汇表

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

 10012

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

python">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

python">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.加载数据

python">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

 

python">#测试代码
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.ppmy.cn/server/120094.html

相关文章

linux 基础知识 什么是僵尸进程?有什么影响?如何解决?

linux 系统僵尸进程 在Linux系统中&#xff0c;僵尸进程&#xff08;Zombie Process&#xff09;是一种特殊的进程状态&#xff0c;它指的是一个已经完成执行的进程&#xff0c;其父进程尚未通过wait()或waitpid()系统调用来回收其资源和状态信息。 僵尸进程本身并不占用CPU和…

智能自行车码表:基于2605C语音芯片的创新开发方案

一、开发背景 随着科技的飞速发展和人们对健康生活的追求&#xff0c;自行车骑行已成为一种广受欢迎的绿色出行方式。智能自行车码表作为骑行者的得力助手&#xff0c;不仅记录骑行数据&#xff0c;还逐渐融入了更多智能化功能。然而&#xff0c;传统码表在语音提示、多语种支持…

使用python-pptx将PPT转换为图片:将每张幻灯片保存为单独的图片文件

哈喽,大家好,我是木头左! 本文将详细介绍如何使用python-pptx将PPT的每一张幻灯片保存为单独的图片文件。 安装python-pptx库 需要确保已经安装了python-pptx库。可以通过以下命令使用pip进行安装: pip install python-pptx导入所需库 接下来,需要导入一些必要的库,包…

深入解析 JVM 运行时数据区:实战与面试指南

Java 虚拟机 (JVM) 是 Java 开发者的核心工具之一&#xff0c;它不仅负责执行 Java 字节码&#xff0c;而且还管理着应用程序运行时的数据存储。在本文中&#xff0c;我们将继续深入探讨 JVM 的运行时数据区&#xff0c;并通过实际案例和常见面试问题来帮助读者更好地理解和应用…

面试突击-多线程和IO专题(至尊典藏版)

多线程和IO专题 一、多线程专题 1.介绍下进程和线程的关系 进程:一个独立的正在执行的程序 线程:一个进程的最基本的执行单位,执行路径 多进程:在操作系统中,同时运行多个程序 多进程的好处:可以充分利用CPU,提高CPU的使用率 多线程:在同一个进程(应用程序)中同时…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)

往期知识点记录&#xff1a; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——Combo解决方案之W800芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统STM32M…

通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制

代码地址 如果对你有帮助请给个start&#xff0c;本项目会持续更新&#xff0c;目标是做一个可用的快速微服务开发平台&#xff0c;成为接私活&#xff0c;毕设的开发神器&#xff0c; 欢迎大神们多提意见和建议 使用的都是spring官方最新的版本&#xff0c;版本如下&#xff1…

windows C++-并行编程-并行算法(三)-分区工作

并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 若要对数据源操作进行并行化&#xff0c;一个必要步骤是将源分区为可由多个线程同时访问的多个部分。 分区程序将指定并行算法应如何在线…