神經機器翻譯技術為谷歌翻譯提供幫助

簡單的製作神經機器翻譯技術為谷歌翻譯提供幫助

機器翻譯:

兩種思想流派:

  1. 使用統計方法的經驗試驗和誤差方法
  2. 理論方法涉及基礎語言研究

Babel's Fish: 1997年由AltaVista搜索引擎推出的世界上第一個網絡翻譯工具。

Seq2Seq建模簡介:用於NLP任務,如文本摘要,語音識別,DNA序列建模等。

典型的seq2seq模型有兩個主要成分:

a)編碼器

b)解碼器

使用Keras在Python中實現:

我們將使用來自http://www.manythings.org/anki/的中文 - 英語句子對數據。和文件夾名稱是cmn-eng,將包含cmn.txt。

1、導入所需的庫:

import string
import re
from numpy import array, argmax, random, take
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, LSTM, Embedding, RepeatVector
from keras.preprocessing.text import Tokenizer
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.sequence import pad_sequences
from keras.models import load_model
from keras import optimizers
import matplotlib.pyplot as plt
%matplotlib inline
pd.set_option('display.max_colwidth', 200)
神經機器翻譯技術為谷歌翻譯提供幫助

2、閱讀IDE中的數據:

# function to read raw text file
def read_text(filename):
# open the file
file = open(filename, mode='rt', encoding='utf-8')

# read all text
text = file.read()
file.close()
return text
# split a text into sentences
def to_lines(text):
sents = text.strip().split('\n')
sents = [i.split('\t') for i in sents]
return sents
data = read_text("cmn.txt")
cmn_eng = to_lines(data)
cmn_eng = array(cmn_eng)
神經機器翻譯技術為谷歌翻譯提供幫助

我們使用50000個句子對來減少模型的訓練時間。

cmn_eng = cmn_eng[:50000,:]

文本預處理:

大多數數據都是非結構化的

a)文本清理

# Remove punctuation
cmn_eng[:,0] = [s.translate(str.maketrans('', '', string.punctuation)) for s in cmn_eng[:,0]]
cmn_eng[:,1] = [s.translate(str.maketrans('', '', string.punctuation)) for s in cmn_eng[:,1]]
cmn_eng
神經機器翻譯技術為谷歌翻譯提供幫助

神經機器翻譯技術為谷歌翻譯提供幫助

b)文本到序列轉換:

我們將分別在兩個單獨的英語和漢語列表中捕獲所有句子的長度。

# empty lists
eng_l = []
cmn_l = []
# populate the lists with sentence lengths
for i in cmn_eng[:,0]:
eng_l.append(len(i.split()))
for i in cmn_eng[:,1]:
cmn_l.append(len(i.split()))

length_df = pd.DataFrame({'eng':eng_l, 'cmn':cmn_l})
length_df.hist(bins = 30)
plt.show()
神經機器翻譯技術為谷歌翻譯提供幫助

神經機器翻譯技術為谷歌翻譯提供幫助

接下來,我們使用Keras Tokenizer()類對文本數據進行向量化。

# function to build a tokenizer
def tokenization(lines):
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
return tokenizer
# prepare english tokenizer
eng_tokenizer = tokenization(cmn_eng[:, 0])
eng_vocab_size = len(eng_tokenizer.word_index) + 1
eng_length = 8
print('English Vocabulary Size: %d' % eng_vocab_size)
# prepare Deutch tokenizer
cmn_tokenizer = tokenization(cmn_eng[:, 1])
cmn_vocab_size = len(cmn_tokenizer.word_index) + 1
cmn_length = 8
print('Deutch Vocabulary Size: %d' % cmn_vocab_size)
# encode and pad sequences
def encode_sequences(tokenizer, length, lines):
# integer encode sequences
seq = tokenizer.texts_to_sequences(lines)
# pad sequences with 0 values
seq = pad_sequences(seq, maxlen=length, padding='post')
return seq
神經機器翻譯技術為谷歌翻譯提供幫助

3. 模型構建:

現在,我們將數據分成訓練和測試集,用於模型訓練和評估。

from sklearn.model_selection import train_test_split
# split data into train and test set
train, test = train_test_split(cmn_eng, test_size=0.2, random_state = 12)
# prepare training data
trainX = encode_sequences(cmn_tokenizer, cmn_length, train[:, 1])
trainY = encode_sequences(eng_tokenizer, eng_length, train[:, 0])
# prepare validation data
testX = encode_sequences(cmn_tokenizer, cmn_length, test[:, 1])
testY = encode_sequences(eng_tokenizer, eng_length, test[:, 0])
神經機器翻譯技術為谷歌翻譯提供幫助

現在我們定義我們的Seq2Seq模型架構:

  • 對於編碼器,我們將使用嵌入層和LSTM層
  • 對於解碼器,我們將使用另一個LSTM層,然後是密集層
# build NMT model
def define_model(in_vocab,out_vocab, in_timesteps,out_timesteps,units):
model = Sequential()
model.add(Embedding(in_vocab, units, input_length=in_timesteps, mask_zero=True))
model.add(LSTM(units))
model.add(RepeatVector(out_timesteps))
model.add(LSTM(units, return_sequences=True))
model.add(Dense(out_vocab, activation='softmax'))
return model
# model compilation
model = define_model(cmn_vocab_size, eng_vocab_size, cmn_length, eng_length, 512)
神經機器翻譯技術為谷歌翻譯提供幫助

使用RMSprop優化器:

rms = optimizers.RMSprop(lr=0.001)
model.compile(optimizer=rms, loss='sparse_categorical_crossentropy')
神經機器翻譯技術為谷歌翻譯提供幫助

sparse_categorical_crossentropy用作損失函數。

4. 訓練我們的模型

我們將訓練30個週期,batch為512,驗證分為20%。80%的數據將用於訓練模型,其餘數據用於評估模型。我們還將使用ModelCheckpoint()函數來保存驗證損失最小的模型。

filename = 'model.h1.24_jan_19'
checkpoint = ModelCheckpoint(filename, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
# train model
history = model.fit(trainX, trainY.reshape(trainY.shape[0], trainY.shape[1], 1),
epochs=30, batch_size=512, validation_split = 0.2,callbacks=[checkpoint],
verbose=1)
神經機器翻譯技術為谷歌翻譯提供幫助

5. 加載保存的模型並對不可見的data-testX進行預測。

model = load_model('model.h1.24_jan_19')
preds = model.predict_classes(testX.reshape((testX.shape[0],testX.shape[1])))
神經機器翻譯技術為谷歌翻譯提供幫助


分享到:


相關文章: