首页 > 其他分享 >机器翻译之数据处理

机器翻译之数据处理

时间:2024-09-22 14:55:39浏览次数:11  
标签:vocab src text len source num 机器翻译 数据处理

目录

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 != None
        if 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]
    #对每一行文本 截断或者填充文本序列,再转化为tensor
    array = 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.知识点个人理解

 

标签:vocab,src,text,len,source,num,机器翻译,数据处理
From: https://blog.csdn.net/Hiweir/article/details/142344945

相关文章

  • 使用Kettle对Excel进行数据处理
        下载:示例用Excel文件(密码:awov)示例用工程文件    ps:每一个都可以预览哦。......
  • 数据处理与统计分析篇-day07-Pandas数据拼接与空值处理
    一.数据组合连接方式:inner:内连接(交集)left:左外(左表全集+交集)right:右外(右表全集+交集)outer:满外连接(左表全集+右表全集+交集)导包importnumpyasnpimportpandasaspdimportosimportsqlite3​os.chdir(r'D:\CodeProject\03data_pro......
  • 数据清洗与预处理:从网页中提取的数据处理技术
    引言在当今数据驱动的时代,数据的质量和准确性对于数据分析、机器学习和数据挖掘至关重要。然而,从网页中提取的数据往往存在诸多问题,如格式不统一、重复数据、缺失值、异常值等。因此,数据清洗与预处理成为数据处理流程中不可或缺的一环。本文将从数据清洗的定义、重要性、具体步骤、......
  • Python 集合的魔法:解锁高效数据处理的秘密
    引言集合作为Python的一种内置数据类型,其本质是一个无序且不重复的元素序列。虽然表面上看它似乎只是列表或元组的一种变体,但实际上,集合背后有着更为高效的查找机制。通过学习和掌握集合的高级操作,我们不仅能更好地理解Python内部的工作原理,还能在实际开发中解决许多棘手的问......
  • 机器翻译之创建Seq2Seq的编码器、解码器
    1.创建编码器、解码器的基类1.1创建编码器的基类fromtorchimportnn#构建编码器的基类classEncoder(nn.Module):#继承父类nn.Moduledef__init__(self,**kwargs):#**kwargs:不定常的关键字参数super().__init__(**kwargs)defforwa......
  • Python字典:解锁数据处理的新维度
    引言在日常的软件开发过程中,我们常常遇到需要快速查找、更新或删除大量数据的需求。传统数组虽然使用广泛,但在某些场景下效率较低。此时,字典就展现了它无可比拟的优势——O(1)的时间复杂度让数据访问变得极为高效。更重要的是,通过灵活运用字典的高级特性,如嵌套字典、字典推导式等,......
  • 大数据处理技术:企业岗位需求决策
    目录1概要设计1.1开发环境1.2功能描述2数据库设计2.1概念2.2结构设计3详细设计3.1数据采集3.1.1 webclient+xpath3.1.2数据采集测试结果3.2数据清洗3.2.1使用jdbc进行数据插入3.2.2 使用c3p0连接池完成数据插入3.2.3 MapReduce数据清洗3.3数据可......
  • Jina AI 发布 Reader-LM-0.5B 和 Reader-LM-1.5B:为网络数据处理提供多语种、长语境和
    JinaAI发布的Reader-LM-0.5B和Reader-LM-1.5B标志着小语言模型(SLM)技术的一个重要里程碑。这些模型旨在解决一个独特而具体的挑战:将开放网络中原始、嘈杂的HTML转换为干净的标记符格式。这项任务看似简单,却面临着复杂的挑战,尤其是在处理现代网络内容中的大量噪音......
  • 【代码分析1-视频目标分割AOT-数据处理部分】Associating Objects with Transformers
    AOT代码分析前置阅读代码模块代码分析1静态数据处理1.1引入包1.2继承Dataset类1.3数据初始化1.4获取数据长度1.5获取数据2视频数据处理2.1数据初始化-父类VOSTrain2.2数据初始化-子类DAVIS2017_Train2.3获得数据长度2.4获得数据前置阅读papergithub文献......
  • 数据处理与统计分析篇-day01-Linux基础与环境搭建
    day01-Linux基础计算机简介概述电子计算机,电脑,PC,Computer,就是由软件+硬件组成的电子设备.组成计算机硬件CPU(运算器,控制器)存储器(内存,外存)输入设备输出设备计算机软件系统软件:充当用户和计算机硬件之间的桥梁的.PC端:windows,......