带有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')

device 

结果:device(type='cpu')

二、获取并行数据集

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

# 读取名为'zh-ja.bicleaner05.txt'的文件,使用制表符分隔,使用Python引擎,没有列名
df = pd.read_csv('./zh-ja/zh-ja.bicleaner05.txt', sep='\\t', engine='python', header=None)
 
# 将第3列的数据转换为列表,赋值给trainen
trainen = df[2].values.tolist()
 
# 将第4列的数据转换为列表,赋值给trainja
trainja = df[3].values.tolist()
 
# 注释掉的代码:从trainen中删除索引为5972的元素
# trainen.pop(5972)
 
# 注释掉的代码:从trainja中删除索引为5972的元素
#trainja.pop(5927)

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

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

print(trainen[500])#打印列表中索引为500的元素
print(trainja[500])#打印列表中索引为500的元素

实验结果:

Chinese HS Code Harmonized Code System < HS编码 2905 无环醇及其卤化、磺化、硝化或亚硝化衍生物 HS Code List (Harmonized System Code) for US, UK, EU, China, India, France, Japan, Russia, Germany, Korea, Canada ...
Japanese HS Code Harmonized Code System < HSコード 2905 非環式アルコール並びにそのハロゲン化誘導体、スルホン化誘導体、ニトロ化誘導体及びニトロソ化誘導体 HS Code List (Harmonized System Code) for US, UK, EU, China, India, France, Japan, Russia, Germany, Korea, Canada ...

我们也可以使用不同的并行数据集来跟随这篇文章,只需要确保我们能将数据处理成上述所示的两个字符串列表,其中包含日语和英语句子。

三、准备分词器

 与英语或其他字母语言不同,日语句子不包含空格来分隔单词。我们可以使用由SentencePiece创建的JParaCrawl提供的标记器来处理日语和英语,您可以访问JParaCrawl网站下载这些工具,或者点击这里。

en_tokenizer = spm.SentencePieceProcessor(model_file='enja_spm_models/spm.en.nopretok.model')
ja_tokenizer = spm.SentencePieceProcessor(model_file='enja_spm_models/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')
# 使用英文分词器对句子进行编码,输出类型为字符串

实验结果: 

['▁All',
 '▁residents',
 '▁aged',
 '▁20',
 '▁to',
 '▁59',
 '▁years',
 '▁who',
 '▁live',
 '▁in',
 '▁Japan',
 '▁must',
 '▁enroll',
 '▁in',
 '▁public',
 '▁pension',
 '▁system',
 '.']

 

ja_tokenizer.encode("年金 日本に住んでいる20歳~60歳の全ての人は、公的年金制度に加入しなければなりません。", out_type='str')
# 使用英文分词器对句子进行编码,输出类型为字符串

实验结果:

['▁',
 '年',
 '金',
 '▁日本',
 'に住んでいる',
 '20',
 '歳',
 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值