赞
踩
本文介绍如何通过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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。