seq2seq模型_Seq2Seq模型实现机器翻译

本文介绍如何通过RNN的Seq2Seq模型来实现机器翻译,最终的模型可以将英文翻译成法文。数据集下载地址https://download.pytorch.org/tutorial/data.zip。使用1台RTX 2080super显卡历时约1个小时的运算,模型最终可以很好的实现英文到法文的机器翻译。

一、数据预处理

这个数据集是一个txt文档格式,每一行有两句话,第一句是英文,然后插入一个制表符,接着是一句法文。前十行数据如下:

Go.	Va !Run!	Cours !Run!	Courez !Wow!	Ça alors !Fire!	Au feu !Help!	À l'aide !Jump.	Saute.Stop!	Ça suffit !Stop!	Stop !Stop!	Arrête-toi !Wait!	Attends !

结合我们之前的文章,我们知道文本预处理过程一般为分词,创建词典,利用词典构建句子。因此首先我们构建字典,并使用字典值将句子“翻译”为单词对应的字典值。```utils.py``是其中一个预处理程序,这一程序将数据从文档中读取出来,然后整理成输入句子,输出句子这一列表,在此过程中会统一句子的格式并将编码形式转为Ascii码。参数可以调整输入句子和输出句子的语言,调整这一布尔值为True可以轻易实现法文翻译为英文。

# utils.pyfrom lang import LanguageModelimport unicodedataimport re# Turn a Unicode string to plain ASCII, thanks to# https://stackoverflow.com/a/518232/2809427def unicode2ascii(s):    return ''.join(        c for c in unicodedata.normalize('NFD', s)        if unicodedata.category(c) != 'Mn'    )# Lowercase, trim, and remove non-letter charactersdef normalize_string(s):    s = unicode2ascii(s.lower().strip())    s = re.sub(r"([.!?])", r" \1", s)    s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)    return sdef read_sentences(lang1, lang2, reverse=False):    print("Reading lines...")    # Read the file and split into lines    lines = open('data/%s-%s.txt' % (lang1, lang2), encoding='utf-8'). \        read().strip().split('\n')    # Split every line into pairs and normalize    pairs = [[normalize_string(s) for s in l.split('\t')] for l in lines]    # Reverse pairs, make Lang instances    if reverse:        pairs = [list(reversed(p)) for p in pairs]        input_lang = LanguageModel(lang2)        output_lang = LanguageModel(lang1)    else:        input_lang = LanguageModel(lang1)        output_lang = LanguageModel(lang2)    return input_lang, output_lang, pairs

程序lang.py创建了一个字典类,支持利用句子创建字典。源码如下:

# lang.pySOS_token = 0EOS_token = 1class LanguageModel:    def __init__(self, name):        self.name = name        self.word2index = {}        self.word2count = {}        self.index2word = {0: "SOS", 1: "EOS"}        self.n_words = 2  # Count SOS and EOS    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_words            self.word2count[word] = 1            self.index2word[self.n_words] = word            self.n_words += 1        else:            self.word2count[word] += 1

第三个程序data_preprocessing.py运行了utils.py,然后进一步创建了每种语言对应的字典对象,同时,为了提高训练速度,我们主观上选择了其中一部分句子用于训练,限制了句子的长度以及句子开头的两个单词。

# data_preprocessing.pyfrom utils import read_sentencesMAX_LENGTH = 15eng_prefixes = (    "i am ", "i m ",    "he is", "he s ",    "she is", "she s ",    "you are", "you re ",    "we are", "we re ",    "they are", "they re ")def filterPair(p):    return len(p[0].split(' ')) &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值