7.1 利用PyTorch构造神经翻译机

本篇博客详细介绍了如何利用PyTorch构建神经翻译机,涵盖了数据预处理、模型构建(包括encoder和decoder)、训练过程以及加入Attention机制的讨论。内容包括数据处理、词典构建、GRU单元的应用以及训练函数的实现。
摘要由CSDN通过智能技术生成

欢迎订阅本专栏:《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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值