当前位置:   article > 正文

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

请基于rnn的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(' ')) &l
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/688909
推荐阅读
  

闽ICP备14008679号