李沐60_机器翻译数据集——自学笔记

!pip install d2l
import os
import torch
from d2l import torch as d2l

下载和预处理数据集

在这个将英语翻译成法语的机器翻译问题中, 英语是源语言(source language), 法语是目标语言(target language)。

d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip','94646ad1522d915e7b0f9296181140edcf86a4f5')def read_data_nmt():"""载入“英语-法语”数据集"""data_dir = d2l.download_extract('fra-eng')with open(os.path.join(data_dir, 'fra.txt'), 'r',encoding='utf-8') as f:return f.read()raw_text = read_data_nmt()
print(raw_text[:75])
Downloading ../data/fra-eng.zip from http://d2l-data.s3-accelerate.amazonaws.com/fra-eng.zip...
Go.	Va !
Hi.	Salut !
Run!	Cours !
Run!	Courez !
Who?	Qui ?
Wow!	Ça alors !

下载数据集后,原始文本数据需要经过几个预处理步骤。 例如,我们用空格代替不间断空格(non-breaking space), 使用小写字母替换大写字母,并在单词和标点符号之间插入空格。

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 charfor i, char in enumerate(text)]return ''.join(out)text = preprocess_nmt(raw_text)
print(text[:80])
go .	va !
hi .	salut !
run !	cours !
run !	courez !
who ?	qui ?
wow !	ça alors !

词元化

在机器翻译中,我们更喜欢单词级词元化 (最先进的模型可能使用更高级的词元化技术)。 下面的tokenize_nmt函数对前num_examples个文本序列对进行词元, 其中每个词元要么是一个词,要么是一个标点符号。 此函数返回两个词元列表:source和target: source[i]是源语言(这里是英语)第i
个文本序列的词元列表, target[i]是目标语言(这里是法语)第i
个文本序列的词元列表。

def tokenize_nmt(text, num_examples=None):"""词元化“英语-法语”数据数据集"""source, target = [], []for i, line in enumerate(text.split('\n')):if num_examples and i > num_examples:breakparts = line.split('\t')if len(parts) == 2:source.append(parts[0].split(' '))target.append(parts[1].split(' '))return source, targetsource, target = tokenize_nmt(text)
source[:6], target[:6]
([['go', '.'],['hi', '.'],['run', '!'],['run', '!'],['who', '?'],['wow', '!']],[['va', '!'],['salut', '!'],['cours', '!'],['courez', '!'],['qui', '?'],['ça', 'alors', '!']])

让我们绘制每个文本序列所包含的词元数量的直方图。 在这个简单的“英-法”数据集中,大多数文本序列的词元数量少于20

def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):"""绘制列表长度对的直方图"""d2l.set_figsize()_, _, patches = d2l.plt.hist([[len(l) for l in xlist], [len(l) for l in ylist]])d2l.plt.xlabel(xlabel)d2l.plt.ylabel(ylabel)for patch in patches[1].patches:patch.set_hatch('/')d2l.plt.legend(legend)show_list_len_pair_hist(['source', 'target'], '# tokens per sequence','count', source, target);

在这里插入图片描述

词表

由于机器翻译数据集由语言对组成, 因此我们可以分别为源语言和目标语言构建两个词表。

我们将出现次数少于2次的低频率词元 视为相同的未知(“”)词元。

除此之外,我们还指定了额外的特定词元, 例如在小批量时用于将序列填充到相同长度的填充词元(“”), 以及序列的开始词元(“”)和结束词元(“”)。 这些特殊词元在自然语言处理任务中比较常用。

src_vocab = d2l.Vocab(source, min_freq=2,reserved_tokens=['<pad>', '<bos>', '<eos>'])
len(src_vocab)
10012

加载数据集

我们仍然可以通过截断(truncation)和 填充(padding)方式实现一次只处理一个小批量的文本序列。 假设同一个小批量中的每个序列都应该具有相同的长度num_steps, 那么如果文本序列的词元数目少于num_steps时, 我们将继续在其末尾添加特定的“”词元, 直到其长度达到num_steps; 反之,我们将截断文本序列时,只取其前num_steps 个词元, 并且丢弃剩余的词元。这样,每个文本序列将具有相同的长度, 以便以相同形状的小批量进行加载。

def truncate_pad(line, num_steps, padding_token):"""截断或填充文本序列"""if len(line) > num_steps:return line[:num_steps]  # 截断return line + [padding_token] * (num_steps - len(line))  # 填充truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>'])
[3919, 80, 208, 208, 208, 208, 208, 208, 208, 208]

现在我们定义一个函数,可以将文本序列 转换成小批量数据集用于训练。 我们将特定的“”词元添加到所有序列的末尾, 用于表示序列的结束。 当模型通过一个词元接一个词元地生成序列进行预测时, 生成的“”词元说明完成了序列输出工作。 此外,我们还记录了每个文本序列的长度, 统计长度时排除了填充词元, 在稍后将要介绍的一些模型会需要这个长度信息。

def build_array_nmt(lines, vocab, num_steps):"""将机器翻译的文本序列转换成小批量"""lines = [vocab[l] for l in lines]lines = [l + [vocab['<eos>']] for l in lines]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

训练模型

定义load_data_nmt函数来返回数据迭代器, 以及源语言和目标语言的两种词表。

def load_data_nmt(batch_size, num_steps, num_examples=600):"""返回翻译数据集的迭代器和词表"""text = preprocess_nmt(read_data_nmt())source, target = tokenize_nmt(text, num_examples)src_vocab = d2l.Vocab(source, min_freq=2,reserved_tokens=['<pad>', '<bos>', '<eos>'])tgt_vocab = d2l.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 = d2l.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([[ 58,  38,   2,   4,   5,   5,   5,   5],[ 29, 117,   2,   4,   5,   5,   5,   5]], dtype=torch.int32)
X的有效长度: tensor([4, 4])
Y: tensor([[  6,   0,   4,   5,   5,   5,   5,   5],[191,  44, 124,   0,   4,   5,   5,   5]], dtype=torch.int32)
Y的有效长度: tensor([3, 5])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【活动邀请·成都】成都 UG 生成式 AI 工作坊:AI 原生应用的探索与创新!

文章目录 前言一、活动介绍二、报名预约方式三、活动安排四、活动福利五、讲师介绍5.1、陈琪——《如何安全高效地构建生成式 AI 应用》5.2、刘文溢——《AIGC 的产业变革》5.3、胡荣亮——《生成式 AI 在企业应用与实践》5.4、陈明栋——《激发您的灵感&#xff0c;基于生成式…

Swing用法的简单展示

1.简单的登陆界面示例 import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class Main extends JFrame {private JTextField usernameField;private JPasswordField passwordField;public Main() {setTitle("登陆界…

FastJson的使用

一、介绍 ​在前后端数据传输交互中&#xff0c;经常会遇到字符串与JSON、XML等格式相互转换与解析&#xff0c;其中JSON以跨语言&#xff0c;跨前后端的优点在开发中被频繁使用&#xff0c;基本上可以说是标准的数据交换格式。FastJson是阿里巴巴用Java语言编写的高性能且功能…

第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

第二十六天 一、PHP新闻显示-数据库操作读取显示 1.新闻列表 数据库创建新闻存储代码连接数据库读取页面进行自定义显示 二、PHP模版引用-自写模版&Smarty渲染 1.自写模版引用 页面显示样式编排显示数据插入页面引用模版调用触发 2.Smarty模版引用 1.下载&#xff1a…

kafka-spring实现对于topic的监听的开启、暂停、暂停后重新开始、停止

kafka-spring实现对于topic的监听的开启、暂停、暂停后重新开始、停止 直接上代码 import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.AdminClientConfig; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.a…

BitmapIndex Scan 与BitmapHeap Scan

BitmapIndex Scan 与BitmapHeap Scan BitmapIndex Scan 与Index Scan 很相似&#xff0c;都是基于索引的扫描&#xff0c;但是BitmapIndex Scan 节点每次执行返回的是一个位图而不是一个元组&#xff0c;其中位图中每位代表了一个扫描到的数据块。而BitmapHeap Scan一般会作为…

4月23日,每日信息差

第一、目前全国共确定工伤保险异地就医直接结算试点城市131个&#xff0c;开通上线工伤医疗、工伤康复、辅助器具配置协议机构共398家。工伤职工按规定完成备案&#xff0c;持社保卡或电子社保卡可以到试点城市的协议机构直接结算相关费用 第二、极兔快递仅用 4 年成为中国国内…

算法和数据结构4.23:

1.测试工程师算法总结&#xff1a; L1排序和查找算法&#xff1a; 复杂度分析 查找算法&#xff1a;顺序查找、二分查找、其他查找算法 排序算法&#xff1a;冒泡排序、快速排序、其他排序算法 L2数据结构-线性表&#xff1a;链表、栈、队列、堆 L3数据结构-非线性表&…

信创传输软件,如何进行国产化替代?

信创产业&#xff0c;即信息技术应用创新产业&#xff0c;它与“863 计划”“973 计划”“核高基” 一脉相承&#xff0c;是我国 IT 产业发展升级采取的长期计划。网络安全事件频发后&#xff0c;中国要确保 IT 相关设施的全部环节国产化&#xff0c;任何不能保证自主可控的环节…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

终于有人说明白了session、cookie和token的区别

一、首先介绍一下名词&#xff1a;Session、cookie、token&#xff0c;如下&#xff1a; 1.Session会话&#xff1a;客户端A访问服务器&#xff0c;服务器存储A的数据value&#xff0c;把key返回给客户端A&#xff0c;客户端A下次带着key&#xff08;session ID&#xff09;来…

(一)输入验证(语法和语义)

你无法控制进入应用程序的内容&#xff0c;甚至无法控制从数据库进入的内容&#xff0c;因为这些数据之前可能已经注入了。日期&#xff0c;如1900年 不是一个有效的日期&#xff0c;应确保在预期的范围内。因此&#xff0c;任何来自你控制的领域之外的东西&#xff0c;比如来自…

一文浅谈FRTC8563时钟芯片

FRTC8563是NYFEA徕飞公司推出的一款实时时钟芯片&#xff0c;采用SOP-8封装形式。这种封装形式具有体积小、引脚间距小、便于集成等特点&#xff0c;使得FRTC8563能够方便地应用于各种电子设备中。 FRTC8563芯片基于32.768kHz的晶体振荡器工作&#xff0c;这种频率的晶体振荡器…

2024年特种作业操作证(登高架设作业)考试题库及答案

一、选择题 1.带电跨越架宜采用干燥的竹竿、杉杆搭设&#xff0c;严禁使用&#xff08;  &#xff09;等。 A.钢管 B.松木 C.柳木 答案:A 2.跨越架立杆间距为&#xff08;  &#xff09;m。 A.1.2 B.1.5 C.1.8 答案:B 3.跨越架杆件相交时&#xff0c;不得一扣…

生活无趣感的成因与破解之道

在日常生活中&#xff0c;我们不时会听到身边人感慨&#xff1a;“生活真是无趣。”这种感受仿佛超越了年龄、性别、职业界限&#xff0c;成为现代社会的一种普遍情绪。然而&#xff0c;生活本身蕴含着无数色彩与可能&#xff0c;为何在许多人眼中却显得如此平淡乏味&#xff1…

JavaSE——程序逻辑控制

1. 顺序结构 顺序结构 比较简单&#xff0c;按照代码书写的顺序一行一行执行。 例如&#xff1a; public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(333);} 运行结果如下&#xff1a; 如果调整代码的书写顺序 , …

(ICML-2021)从自然语言监督中学习可迁移的视觉模型

从自然语言监督中学习可迁移的视觉模型 Title&#xff1a;Learning Transferable Visual Models From Natural Language Supervision paper是OpenAI发表在ICML 21的工作 paper链接 Abstract SOTA计算机视觉系统经过训练可以预测一组固定的预定目标类别。这种受限的监督形式限制…

在 Kubernetes 1.24 中使用 Docker:配置与应用指南

在 Kubernetes 1.24 中使用 Docker&#xff1a;配置与应用指南 引言 随着 Kubernetes 社区对容器运行时接口&#xff08;CRI&#xff09;的标准化推进&#xff0c;Docker 原生支持在 Kubernetes 1.24 版本中被弃用。然而&#xff0c;许多开发者和组织仍希望继续使用 Docker。…

服务器基本故障和排查方法

前言 服务器运维工作中遇到的问题形形色色&#xff0c;无论何种故障&#xff0c;都需要结合具体情况&#xff0c;预防为主的思想&#xff0c;熟悉各种工具和技术手段&#xff0c;养成良好的日志分析习惯&#xff0c;同时建立完善的应急预案和备份恢复策略&#xff0c;才能有效…

工业设备管理平台

在这个数字化、智能化的新时代&#xff0c;工业设备管理平台正成为推动工业转型升级的重要力量。在众多平台中&#xff0c;HiWoo Cloud以其卓越的性能、稳定的服务和创新的理念&#xff0c;赢得了广大用户的青睐。今天&#xff0c;就让我们一起走进HiWoo Cloud的世界&#xff0…