基于transformer的日译中机器翻译

斯巴拉西!这里是教你怎么实现日译中(机翻)博客!

其实,“斯巴拉西”其实是日语“素晴らしい”的音译,意为“太棒了“。那么,我们怎么实现更精准的日译中工作呢?我们可以用transformer来训练翻译模型。

1 获取数据集

首先,我们可以去http://www.kecl.ntt.co.jp/icl/lirg/jparacrawl来下载常用的日语-英文平行的数据集。

下载完成后,导入数据集:

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,请在你自己的电脑上尝试运行这一套代码
print(f"Torch version: {torch.__version__}, Device: {device}")


df = pd.read_csv('./zh-ja/zh-ja.bicleaner05.txt', sep='\\t', engine='python', header=None)
trainen = df[2].values.tolist()#[:10000]
trainja = df[3].values.tolist()#[:10000]

 代码从一个名为’zh-ja.bicleaner05.txt’的文件中读取数据,并将第2列(英文句子)和第3列(日文句子)分别提取为Python列表 trainen 和 trainja。导入所有的日语和其英语对应文本后,需要删除数据集中的最后一条数据,因为它存在缺失值。

# 打印第 501 行(索引从 0 开始)的英文句子
print(trainen[500])
 
# 打印第 501 行(索引从 0 开始)的日文句子
print(trainja[500])

打印出的结果如下:

 

2 准备分词器

不像英文或其他语言的字母顺序、日本句子并不含有空格分开的语法。 我们可以使用该系统提供的JParaCrawl,它使用了SentencePiece来处理日语和英语,可以访问JParaCrawl网站下载。


# 使用 SentencePieceProcessor 加载英文模型文件 'spm.en.nopretok.model',创建英文分词器
en_tokenizer = spm.SentencePieceProcessor(model_file='spm.en.nopretok.model')
 
# 使用 SentencePieceProcessor 加载日文模型文件 'spm.ja.nopretok.model',创建日文分词器
ja_tokenizer = spm.SentencePieceProcessor(model_file='spm.ja.nopretok.model')

 使用分词器对英文句子“All residents aged 20 to 59 years who live in Japan must enroll in public pension system.”进行编码:

en_tokenizer.encode("All residents aged 20 to 59 years who live in Japan must enroll in public pension system.", out_type='str')

结果:

英文句子中每个以空格为分隔符的单词都被划分开;

对日文句子"年金 日本に住んでいる20歳~60歳の全ての人は、公的年金制度に加入しなければなりません。"进行同样的操作: 

ja_tokenizer.encode("年金 日本に住んでいる20歳~60歳の全ての人は、公的年金制度に加入しなければなりません。", out_type='str')

 与英文单词不同的是,日文是以词或短语进行划分,不含空格。

3 构建从 TorchText 导入的 Vocab 对象 

使用分词器和原始句子,我们接着构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值