基于Transformer和PyTorch的日英机器翻译模型

使用Jupyter Notebook、PyTorch、Torchtext和SentencePiece的教程

导入所需要的包

首先,请确保我们的系统中安装了下面的包。如果发现有些包没有安装,一定要安装它们。

# 导入必要的库
import math
import torchtext
import torch
import torch.nn as nn
from torch import Tensor
from torch.nn.utils.rnn import pad_sequence
from torch.utils.data import DataLoader
from collections import Counter
from torchtext.vocab import Vocab
from torch.nn import TransformerEncoder, TransformerDecoder, TransformerEncoderLayer, TransformerDecoderLayer
import io
import time
import pandas as pd
import numpy as np
import pickle
import tqdm
import sentencepiece as spm
torch.manual_seed(0)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# print(torch.cuda.get_device_name(0)) ## 如果你有GPU,请在你自己的电脑上尝试运行这一套代码
# 显示可用设备
device

获取平行数据集

在本教程中,我们将使用从JParaCrawl下载的日-英平行数据集。http://www.kecl.ntt.co.jp/icl/lirg/jparacrawl该数据集被描述为“NTT创建的最大的公开可用的英-日平行语料库。它主要是通过大量爬取网络并自动对齐平行句子来创建的。”您也可以在这里查看论文。

# 读取数据并转化为列表
df = pd.read_csv('/kaggle/input/dataset/zh-ja.bicleaner05.txt', sep='\\t', engine='python', header=None)
trainen = df[2].values.tolist()#[:10000]
trainja = df[3].values.tolist()#[:10000]
# trainen.pop(5972)
# trainja.pop(5972)

在导入所有日语及其英语对应内容后,我删除了数据集中的最后一条数据,因为它存在缺失值。总共,trainen和trainja中的句子数量为5,973,071个。然而,出于学习目的,通常建议先对数据进行抽样,确保一切按预期运行,以节省时间,然后再一次性使用所有数据。

以下是数据集中包含的一个句子示例。

# 打印出索引为500的英语和日语数据
print(trainen[500])
print(trainja[500])

 

我们还可以采用其他不同的平行数据集来配合本文的学习,只需确保我们可以将数据加工成上面所示的两个字符串列表,包含日语和英语句子。

准备tokenizers

与英语或其他字母语言不同,日语句子中没有空格来分隔单词。我们可以使用JParaCrawl提供的标记器,该工具是使用SentencePiece为日语和英语创建的。

# 创建SentencePieceProcessor对象
en_tokenizer = spm.SentencePieceProcessor(model_file='/kaggle/input/dataset/spm.en.nopretok.model')
ja_tokenizer = spm.SentencePieceProcessor(model_file='/kaggle/input/dataset/spm.ja.nopretok.model')

加载tokenizers后,你可以通过执行以下代码来测试它们。

# 对英文字符串进行分词,并将分词结果以列表形式返回。
en_tokenizer.encode("All residents aged 20 to 59 years who live in Japan must enroll in public pension system.", out_type=str)

 

# 对日文字符串进行分词,并将分词结果以列表形式返回。
ja_tokenizer.encode("年金 日本に住んでいる20歳~60歳の全ての人は、公的年金制度に加入しなければなりません。", out_type=str)

 

构建TorchText词汇对象并把句子转换成Torch张量

使用标记器和原始句子,我们接下来构建从TorchText中导入的Vocab对象。这个过程可能需要几秒到几分钟的时间,具体取决于数据集的大小和计算能力。不同的标记器也会影响构建词汇表所需的时间,我尝试了几种其他的日语标记器,但SentencePiece似乎对我来说工作得很好而且足够快。

def build_vocab(sentences, tokenizer):
    """
    构建词汇表
    arg:
        sentences:句子列表
        tokenizer:分词器
    """
    counter = Counter() # 创建一个计时器
    for sentence in sentences:
      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值