首页 > 其他分享 >机器翻译与数据集

机器翻译与数据集

时间:2023-09-11 20:13:13浏览次数:39  
标签:vocab nmt text len num 机器翻译 数据 d2l

import os
import torch
from d2l import torch as d2l

# @save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


# 下载数据集
# @save
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])


# 预处理数据集

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)


text = preprocess_nmt(raw_text)
print(text[:88])


# 次元化,找出每一个词所对应的法语词

def tokenize_nmt(text, num_example=None):
    """词元化“英语-法语”数据数据集"""
    source, target = [], []
    for i, line in enumerate(text.split('\n')):
        if num_example and i > num_example:
            break
        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)

print(source[:6], target[:6])


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]])

    print(d2l.plt.xlabel(xlabel))
    print(d2l.plt.ylabel(ylabel))

    for patch in patches[1].patches:
        patch.set_hatch('/')

    d2l.plt.legend(legend)
    d2l.plt.show()


show_list_len_pair_hist(['source', 'target'], '# tokens per sequence',
                        'count', source, target)

# 由于机器翻译数据集由语言对组成, 因此我们可以分别为源语言和目标语言构建两个词表。
# 使用单词级词元化时,词表大小将明显大于使用字符级词元化时的词表大小。 为了缓解这一问题,
# 这里我们将出现次数少于2次的低频率词元 视为相同的未知(“<unk>”)词元。
# 除此之外,我们还指定了额外的特定词元, 例如在小批量时用于将序列填充到相同长度的填充词元(“<pad>”), 以及序列的开始词元(“<bos>”)和结束词元(“<eos>”)。
# 这些特殊词元在自然语言处理任务中比较常用。

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


# 由于样本具有固定长度,所以我们需要截断或者填充文本

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))


print(truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>']))


# 转成小批量进行训练

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


# 训练模型

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

 

标签:vocab,nmt,text,len,num,机器翻译,数据,d2l
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17694372.html

相关文章

  • SQLServer游标的使用,读取表数据赋值循环
    --声明一个游标--定义一个叫Cursor_temp的游标,存放FORSELECT后的数据DECLARECursor_tempCURSORFORSELECTId,CodeFROMTableName--打开一个游标OPENCursor_tempDECLARE@IDuniqueidentifier,@Codenvarchar(5......
  • appium+python登录传输多组数据
     #传多组数据,有几组数据,就遍历几次@pytest.mark.parametrize("usname,pswd",[("xiaoming","123456"),("xiaohong","123678")])deftest_login(self,usname,pswd):login_page=LoginPage(driver=self.driver)login_page......
  • ant design of vue 表格 默认,跨页勾选,翻页选择记忆勾选,数据回显勾选
    需求在使用antdesignofvue的table表格时需要让之前已选择的数据显示勾选状态,还要支持跨页勾选思路需要指定row-key绑定的值必须唯一ant-design-vue的表格对于跨页勾选支持的非常友好,只要设置绑定一下rowKey就可以了,我这里绑定的是workerId代码<!--表格--><a-......
  • 数据库 -- day01
    一、数据库简介1、为什么需要数据库磁盘->高级缓存->寄存器->CPU数据存储在内存中,但是内存大小有限、不可能存储所有数据,并且掉电后数据丢失为了让程序在关机重启后数据依然可以使用,必须把数据保存在磁盘文件中随着程序功能越来越复杂、数据量越来越多、数据关系也越......
  • K8s - 安装部署MongoDB数据库教程1(单实例)
    来源:https://www.hangge.com/blog/cache/detail_3158.htmlMongoDB 是一个基于分布式文件存储的数据库。我之前文件中介绍如何使用官方提供的安装包进行 MongoDB 数据库的安装(点击查看),以及如何通过 Docker 来快速搭建 MongoDB 数据库环境(点击查看)。本文接着演示如何在 Ku......
  • 数据库
    什么是数据库    数据库指的是管理数据的软件、工具,是一个文件系统,而不是额外存储数据的仓库数据库的类型    层次型:以上下级的层次关系来组织数据的一类数据库,类似倒悬树结构,早期的数据库采用    网状型:通过网状关系连接组织数据,形成一张数据网复杂......
  • delphi FireDAC 数据集快速遍历方式
    FireDAC数据集快速遍历方式代码遍历数据集procedureTForm1.Button1Click(Sender:TObject);varvTick:DWORD;I:Integer;vCount:Integer;begin//查询数据FDQuery1.Open('SELECT*FROMtceshi');//获取全部数据FDQuery1.FetchAll;//通过Next方法......
  • openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema
    openGauss学习笔记-66openGauss数据库管理-创建和管理schema66.1背景信息schema又称作模式。通过管理schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的schema下而不引起冲突。管理schema包括:创建schema......
  • 一道数据结构
    题意:给定长度为\(n\)的序列\(a\),\(m\)次询问,每次询问区间\([l,r]\)中选取三个点\(i,j,k\)满足\(l\lei<j<k\ler\)且\(j-i\lek-j\),你需要使得\(a_i+a_j+a_k\)最大,输出这个最大值。数据范围:\(3\len\le5\times10^4\),\(1\lea_i\le10^9\),\(1\lem\le5\times1......
  • 谷歌优化之结构化数据标记助手
    结构化数据标记助手可以帮助您标记网页上的元素,以便Google能够理解网页中的数据。Google更清楚地理解网页数据后,便会在Google搜索中以各种新方式呈现这些数据,使其更有吸引力。此外,如果您向客户发送HTML格式的电子邮件,结构化数据标记助手还可以指导您更改电子邮件模板,让Gmai......