神经机器翻译与代码(下)
2019年12月29日 由 sunlei 发表
397367
0
代码
在这篇文章中,我们将使用德语到英语词汇的数据集作为语言学习抽认卡的基础。
该数据集可以从
ManyThings.org网站获得,其中的示例来自
Tatoeba项目。数据集由德语短语和英语短语组成,打算与
Anki flashcard软件一起使用。
我们将在本教程中使用的数据集可在此处下载:
将数据集下载到当前工作目录并解压;
from numpy import array
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
from keras.utils.vis_utils import plot_model
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import Embedding
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
from keras.callbacks import ModelCheckpoint
def load_clean_sentences(filename):
return load(open(filename, 'rb'))
def create_tokenizer(lines):
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
return tokenizer
def max_length(lines):
return max(len(line.split()) for line in lines)
def encode_sequences(tokenizer, length, lines):
X = tokenizer.texts_to_sequences(lines)
X = pad_sequences(X, maxlen=length, padding='post')
return X
def encode_output(sequences, vocab_size):
ylist = list()
for sequence in sequences:
encoded = to_categorical(sequence, num_classes=vocab_size)
ylist.append(encoded)
y = array(ylist)
y = y.reshape(sequences.shape[0], sequences.shape[1], vocab_size)
return y
def define_model(src_vocab, tar_vocab, src_timesteps, tar_timesteps, n_units):
model = Sequential()
model.add(Embedding(src_vocab, n_units, input_length=src_timesteps, mask_zero=True))
model.add(LSTM(n_units))
model.add(RepeatVector(tar_timesteps))
model.add(LSTM(n_units, return_sequences=True))
model.add(TimeDistributed(Dense(tar_vocab, activation='softmax')))
return model
dataset = load_clean_sentences('english-german-both.pkl')
train = load_clean_sentences('english-german-train.pkl')
test = load_clean_sentences('english-german-test.pkl')
eng_tokenizer = create_tokenizer(dataset[:, 0])
eng_vocab_size = len(eng_tokenizer.word_index) + 1
eng_length = max_length(dataset[:, 0])
print('English Vocabulary Size: %d' % eng_vocab_size)
print('English Max Length: %d' % (eng_length))
ger_tokenizer = create_tokenizer(dataset[:, 1])
ger_vocab_size = len(ger_tokenizer.word_index) + 1
ger_length = max_length(dataset[:, 1])
print('German Vocabulary Size: %d' % ger_vocab_size)
print('German Max Length: %d' % (ger_length))
trainX = encode_sequences(ger_tokenizer, ger_length, train[:, 1])
trainY = encode_sequences(eng_tokenizer, eng_length, train[:, 0])
trainY = encode_output(trainY, eng_vocab_size)
testX = encode_sequences(ger_tokenizer, ger_length, test[:, 1])
testY = encode_sequences(eng_tokenizer, eng_length, test[:, 0])
testY = encode_output(testY, eng_vocab_size)
model = define_model(ger_vocab_size, eng_vocab_size, ger_length, eng_length, 256)
model.compile(optimizer='adam', loss='categorical_crossentropy')
print(model.summary())
plot_model(model, to_file='model.png', show_shapes=True)
filename = 'model.h5'
checkpoint = ModelCheckpoint(filename, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
model.fit(trainX, trainY, epochs=30, batch_size=64, validation_data=(testX, testY),callbacks=[checkpoint], verbose=2)
参考文件:
《机器翻译的统计方法》,1990年。
综述:基于实例的机器翻译,1999。
使用RNN编码器-解码器学习短语表示,用于统计机器翻译,2014。
联合学习对齐和翻译的神经机器翻译,2014。
谷歌的神经机器翻译系统:弥合人类和机器翻译之间的差距,2016。
神经网络的序列到序列学习,2014。
循环连续翻译模型,2013年。
基于短语的统计机器翻译的连续空间翻译模型,2013年。
原文链接:https://medium.com/@umerfarooq_26378/neural-machine-translation-with-code-68c425044bbd