在本文中,我们将看到如何创建语言翻译模型,这也是神经机器翻译的非常著名的应用。
最近我们被客户要求撰写关于NLP的研究报告,包括一些图形和统计输出。我们将使用seq2seq通过Python的Keras库创建我们的语言翻译模型。
假定您对循环神经网络(尤其是LSTM)有很好的了解。本文中的代码是使用Keras库用Python编写的。
首先导入所需的库:
- import os, sys
-
- from keras.models import Model
- from keras.layers import Input, LSTM, GRU, Dense, Embedding
- from keras.preprocessing.text import Tokenizer
- from keras.preprocessing.sequence import pad_sequences
- from keras.utils import to_categorical
- import numpy as np
- import matplotlib.pyplot as plt
执行以下脚本来设置不同参数的值:
- BATCH_SIZE = 64
- EPOCHS = 20
- LSTM_NODES =256
- NUM_SENTENCES = 20000
- MAX_SENTENCE_LENGTH = 50
- MAX_NUM_WORDS = 20000
- EMBEDDING_SIZE = 100
我们将在本文中开发的语言翻译模型会将英语句子翻译成法语。要开发这样的模型,我们需要一个包含英语句子及其法语翻译的数据集。 在每一行上,文本文件包含一个英语句子及其法语翻译,并用制表符分隔。文件的前20行fra.txt
如下所示:
- Go. Va !
- Hi. Salut !
- Hi. Salut.
- Run! Cours !
- Run! Courez !
- Who? Qui ?
- Wow! Ça alors !
- Fire! Au feu !
- Help! À l'aide !
- Jump. Saute.
- Stop! Ça suffit !
- Stop! Stop !
- Stop! Arrête-toi !
- Wait! Attends !
- Wait! Attendez !
- Go on. Poursuis.
- Go on. Continuez.
- Go on. Poursuivez.
- Hello! Bonjour !
- Hello! Salut !
该模型包含超过170,000条记录,但是我们将仅使用前20,000条记录来训练我们的模型。
神经机器翻译模型通常基于seq2seq架构。seq2seq体系结构是一种编码-解码体系结构,由两个LSTM网络组成:编码LSTM和解码LSTM。
在我们的数据集中,我们不需要处理输入,但是,我们需要生成翻译后的句子的两个副本:一个带有句子开始标记,另一个带有句子结束标记。这是执行此操作的脚本:
- input_sentences = []
- output_sentences = []
- output_sentences_inputs = []
-
- count = 0
- for line in open(r'/content/drive/My Drive/datasets/fra.txt', encoding="utf-8"):
- count += 1
-
- if count > NUM_SENTENCES:
- break
-
- if '\t' not in line:
- continue
-
- input_sentence, output = line.rstrip().split('\t')
-
- output_sentence = output + '
' - output_sentence_input = '
' + output -
- input_sentences.append(input_sentence)
- output_sentences.append(output_sentence)
- output_sentences_inputs.append(output_sentence_input)
-
- print("num samples input:", len(input_sentences))
- print("num samples output:", len(output_sentences))
- print("num samples output input:", len(output_sentences_inputs))
注意:您可能需要更改fra.txt
计算机上文件的文件路径。
最后,输出中将显示三个列表中的样本数量:
- num samples input: 20000
- num samples output: 20000
- num samples output input: 20000
现在让我们来随机输出一个句子从input_sentences[]
,output_sentences[]
和output_sentences_inputs[]
列表:
- print(input_sentences[172])
- print(output_sentences[172])
- print(output_sentences_inputs[172])
这是输出:
- I'm ill.
- Je suis malade. <eos>
- <sos> Je suis malade.
您可以看到原始句子,即I'm ill
;在输出中对应的翻译,即Je suis malade.
。