机器翻译:谷歌翻译是如何对几乎所有语言进行翻译的?( 五 )


单个整数表示和词嵌入向量之间有两个主要区别 。 在整数表示中 , 一个单词仅用单个整数表示 。 而在向量表示中 , 一个单词可以用50、100、200或任何你喜欢的维数表示 。 因此词嵌入向量可以获取更多与单词有关的信息 。 其次 , 单个整数表示无法获取不同单词之间的关系 。 而词嵌入向量却能做到这一点 。
对于英语句子(即输入) , 我们将使用GloVe词嵌入模型 。 对于输出的法语译文 , 我们将使用自定义词嵌入模型 。 点击此处可下载GloVe词嵌入模型 。
首先 , 为输入内容创建词嵌入向量 。 在此之前需要将GloVe词向量加载到内存中 。 然后创建一个词典 , 其中单词为键 , 其对应的向量为值:
from numpy import arrayfrom numpy import asarrayfrom numpy import zerosembeddings_dictionary=dict()glove_file =open(r'./drive/My Drive/glove.twitter.27B.200d.txt', encoding="utf8")for line in glove_file:rec = line.split()word= rec[0]vector_dimensions =asarray(rec[1:], dtype='float32')embeddings_dictionary[word] = vector_dimensionsglove_file.close()回想一下 , 输入中包含3501个唯一单词 。 我们将创建一个矩阵 , 其中行数代表单词的整数值 , 而列数将对应单词的维数 。 该矩阵将包含输入句子中单词的词嵌入向量 。
num_words =min(MAX_NUM_WORDS, len(word2idx_inputs)+1)embedding_matrix =zeros((num_words, EMBEDDING_SIZE))for word, index inword2idx_inputs.items():embedding_vector = embeddings_dictionary.get(word)if embedding_vector isnotNone:embedding_matrix[index] =embedding_vector创建模型
第一步 , 为神经网络创建一个嵌入层 。 嵌入层被认为是网络的第一隐藏层 。 它必须指定3个参数:
· input_dim:表示文本数据中词汇表的容量 。 比如 , 如果数据被整数编码为0-10之间的值 , 那么词汇表的容量为11个单词 。
· output_dim:表示将嵌入单词的向量空间大小 。 它决定该层每个单词的输出向量大小 。 比如 , 它可以是32或100 , 甚至还可以更大 。 如果大家对此有疑问 , 可以用不同的值测试 。
· input_length:表示输入序列的长度 , 正如大家为Keras模型的输入层所定义的那样 。 比如 , 如果所有的输入文档都由1000个单词组成 , 那么该值也为1000 。
embedding_layer = Embedding(num_words, EMBEDDING_SIZE,weights=[embedding_matrix], input_length=max_input_len)接下来需要做的是定义输出 , 大家都知道输出将是一个单词序列 。 回想一下 , 输出中唯一单词的总数为9511 。 因此 , 输出中的每个单词都可以是这9511个单词中的一个 。 输出句子的长度为12 。 每个输入句子都需要一个对应的输出句子 。 因此 , 输出的最终形式将是:(输入量、输出句子的长度、输出的单词数)
#shape of the outputdecoder_targets_one_hot = np.zeros((len(input_sentences), max_out_len,num_words_output),dtype='float32')decoder_targets_one_hot.shapeShape: (20000, 12, 9512)为了进行预测 , 该模型的最后一层将是一个稠密层(dense layer) , 因此需要以独热编码向量的形式输出 , 因为我们将在稠密层使用softmax激活函数 。 为创建独热编码输出 , 下一步是将1分配给与该单词整数表示对应的列数 。
for i, d in enumerate(decoder_output_sequences):for t, word in enumerate(d):decoder_targets_one_hot[i, t,word] = 1下一步是定义编码器和解码器网络 。 编码器将输入英语句子 , 并输出长短期记忆网络的隐藏状态和单元状态 。
encoder_inputs =Input(shape=(max_input_len,))x =embedding_layer(encoder_inputs)encoder =LSTM(LSTM_NODES, return_state=True)encoder_outputs,h, c =encoder(x)encoder_states = [h, c]