葡萄牙

首页 » 常识 » 常识 » 基于Seq2Seq结构和注意力机制的神经
TUhjnbcbe - 2024/7/14 16:04:00

介绍

神经机器翻译(NMT)是一种端到端自动翻译学习方法。它的优势在于它直接学习从输入文本到相关输出文本的映射。它已被证明比传统的基于短语的机器翻译更有效,而且后者需要更多的精力来设计模型。另一方面,NMT模型的训练成本很高,尤其是在大规模翻译数据集上。由于使用了大量参数,它们在推理时的速度也明显变慢。其他限制是翻译稀有单词且无法翻译输入句子的所有部分时的鲁棒性。为了克服这些问题,已经有一些解决方案,例如使用注意力机制来复制稀有词[2]。

通常,NMT模型遵循通用的序列到序列学习体系结构。它由一个编码器和一个解码器的递归神经网络(RNN)组成(有关如何设置RNN的更简单的示例,请参见[3])。编码器将输入语句转换为向量列表,每个输入一个向量。给定该列表,解码器一次生成一个输出,直到产生特殊的句子结束标记为止。

我们的任务是使用中等大小的示例对语料库,为英语中的输入句子提供葡萄牙语翻译。我们使用Seq2Seq的体系结构来构建我们的NMT模型。对于编码器RNN,我们使用预训练的嵌入,即在英语GoogleNewsB语料库上训练过的基于令牌的文本嵌入[4]。另一方面,我们训练自己在解码器RNN中的嵌入,其词汇量设置为语料库中唯一葡萄牙语单词的数量。由于模型的架构复杂,我们实现了自定义训练循环来训练我们的模型。

本文使用的数据集包含,个英语和葡萄牙语[5]句子对。数据来自Tatoeba,这是一个由示例志愿者组成的大型数据库,这些示例语句由志愿者翻译成多种语言。

预处理

我们首先在葡萄牙语的每个句子中添加两个特殊标记,分别是和标记。它们用于向解码RNN发信号通知句子的开头和结尾。接下来,我们将葡萄牙语句子标记化,并在句子的末尾添加零。

importpandasaspdimportnumpyasnpimporttensorflowastfimporttensorflow_hubashubfromsklearn.model_selectionimporttrain_test_splitfromtensorflow.keras.layersimportLayerimportmatplotlib.pyplotaspltNUM_EXAMPLES=data_examples=[]withopen(por.txt,r,encoding=utf8)asf:forlineinf.readlines():iflen(data_examples)NUM_EXAMPLES:data_examples.append(line)else:breakdf=pd.DataFrame(data_examples,columns=[all])df=df[all].str.split(\t,expand=True)df.columns=columns=[english,portuguese,rest]df=df[[english,portuguese]]df[portuguese]=df.apply(lambdarow:start+row[portuguese]+end,axis=1)tokenizer=tf.keras.preprocessing.text.Tokenizer(filters=)tokenizer.fit_on_texts(df[portuguese].to_list())df[portuguese_tokens]=df.apply(lambdarow:tokenizer.texts_to_sequences([row[portuguese]])[0],axis=1)#Print5examplesfromeachlanguageidx=np.random.choice(df.shape[0],5)foriinidx:print(English)print(df[english])print(\nportuguese)print(df[portuguese])print(df[portuguese_tokens])print(\n----\n)portuguese_tokens=tf.keras.preprocessing.sequence.pad_sequences(df[portuguese_tokens].to_list(),padding=post,value=0)EnglishHaveyouevertakensinginglessons?portuguesestartVocêjáfezaulasdecanto?end[1,10,60,,,8,,2]----EnglishTomrodehisbicycletothebeachlastweekend.portuguesestartOTomfoiàpraiadebicicletanoúltimofimdesemana.end[1,5,3,34,61,,8,,28,,,8,,2]----EnglishIhavetogotosleep.portuguesestartTenhoqueirdormir.end[1,45,4,70,,2]----EnglishIhavealreadytoldTomthatMaryisnthere.portuguesestartEujádisseaTomqueMarianoestáaqui.end[1,7,60,50,9,3,4,,6,13,88,2]----EnglishIfTomwashurt,Idknowit.portuguesestartSeTomestivesseferido,euosaberia.end[1,21,3,,16,7,5,,2]----

预训练嵌入层

对于编码器和解码器RNN,我们都需要定义嵌入层,以将词的索引转换为固定大小的密集向量。对于解码器RNN,我们训练了我们自己的嵌入。对于编码器RNN,我们使用了来自TensorflowHub的预训练英语单词嵌入。这是在英语Google新闻B语料库上经过训练的基于令牌的文本嵌入。它使我们能够遵循转移学习的原理(在[6]中获得扩展的定义,并将转移学习应用程序应用于计算机视觉),利用在非常大的语料库上训练的单词表示形式。在将英语句子输入RNN之前,我们先对其进行了填充。

#LoadembeddingmodulefromTensorflowHubembedding_layer=hub.KerasLayer(

1