欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html
- 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
- 第三章:学习PyTorch如何读入各种外部数据
- 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
- 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
- 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
- 第七章:利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
- 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。
机器翻译其实是走得比较先的AI应用了,后来的许多自然语言生成的任务多少都在借鉴着机器翻译的一些研究与实践成果。如果你是做自然语言处理的,那么下面这篇论文是必读无疑的,关于sequence to sequence ,关于attention的知识也是必须知道。
论文:Bahdanau, Neural Machine Translation By Jointly Language to Align and Translate
本节就是针对以上论文中模型的一个简单实现。
先导入本节代码需要的包:
from __future__ import unicode_literals, print_function, division
import unicodedata
import re
import random
import torch
import torch.nn as nn
import torch.nn.functional as F
use_cuda = False
7.1.1 准备数据
原始数据:
机器翻译模型输入是语言A,输出是翻译后的结果语言B。在本项目的data/translation_data/路径下有一份平行语料,chinese1为中文,english1为英文,每行一个样本,两份数据的行之间是对应的翻译结果。
数据处理:
- (1)预处理数据,将文本从Unicode格式转换为ASCII格式,去除大部分标点符号,大写字母转换成小写字母,这些操作用normaliz_string函数进行封装。
- (2)过滤数据,过滤掉一些不符合设定标注的句子,比如过滤掉长度大于30的句子, 用filter_pairs函数封装。
- (3)构建词典,分别对两个语言的语料构建词典,即词对应数字编码,用类LangEmbed()来构建。
下面看看代码具体的实现:
1)预处理数据的函数:
def unicode2ascii(s):
return ''.join(
c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'
)
def normalize_string(s):
s = unicode2ascii(s.lower().strip()) # 小写、去前后空格、转ascii格式
s = re.sub("[.!?。!?]", "\1", s) # 处理标点
return s
2)过滤数据的函数, 为了简化,我们设置保留长度小于30的句子。
MAX_LENGTH = 10
def filter_pairs(pairs):
p = []
for pair in pairs:
if len(pair[0]) <= MAX_LENGTH and len(pair[1]) <= MAX_LENGTH:
p.append(pair)
return p
3)构建词典的类
class LangEmbed():
def __init__(self, name):
self.name = name
self.word2index = {
}
self.word2count = {
}
self.index2word = {
0:"SOS", 1:"EOS"}
self.n_word=2
def add_sentence(self, sentence):
for word in sentence.split():
self.add_word(word)
def add_word(self, word):
if word not in self.word2index:
self.word2index[word] = self.n_word
self.word2count[word] = 1
self.index2word[self.n_word] = word
self.n_word += 1
else:
self.word2count[word] += 1
4)读入数据整个整个预处理流程, 返回两个语言的词典,与语料对
def prepare_data():
ch = open('data/translation_data/chinese1.txt', encoding='utf-8').readlines()
en = open('data/translation_data/english1.txt', encoding='utf-8').readlines()
pairs = [[normalize_string(ch[i]), normalize_string(en[i])] for i in range(len(ch)) ]
print("read %s sentence paris" % (len(pairs)))
pairs = filter_pairs(pairs)
print("%s sentence after filter" % (len(pairs)))
ch_lang = LangEmbed('ch')
en_lang = LangEmbed('en')
for pair in pairs:
ch_lang.add_sentence(pair[0])
en_lang.add_sentence(pair[1])
print