标签:matrix 也有 shuffle jieba分词 open param 位置 输入 简单
使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确。如下面两个句子:
训练和测试数据包括两个待比较句子以及其相似度(0-1):
测试数据格式相似。
自然语言无法直接作为神经网络输入,需进行编码该部分包括以下步骤:
中文分词使用jieba分词工具,词的编号则使用Keras的Tokenizer:
1 | print("Fit tokenizer...") |
其中texts_1 、texts_2 、test_texts_1 、 test_texts_2的元素分别为训练数据和测试数据的分词后的列表,如:
1 | ["我", "是", "谁"] |
经过上面的过程 tokenizer保存了语料中出现过的词的编号映射。
1 | > print tokenizer.word_index |
利用tokenizer对语料中的句子进行编号
1 | > sequences_1 = tokenizer.texts_to_sequences(texts_1) |
最终生成固定长度(假设为10)的句子编号列表
1 | > data_1 = pad_sequences(sequences_1, maxlen=MAX_SEQUENCE_LENGTH) |
data_1即可作为神经网络的输入。
在对句子进行编码后,需要准备句子中词的词向量映射作为LSTM层的输入。这里使用预训练的词向量(这里)参数,生成词向量映射矩阵:
1 | word2vec = Word2Vec.load(EMBEDDING_FILE) |
该神经网络采用简单的单层LSTM+全连接层对数据进行训练,网络结构图:
网络由Keras实现:
1 | def (): |
该部分首先定义embedding_layer作为输入层和LSTM层的映射层,将输入的句子编码映射为词向量列表作为LSTM层的输入。两个LSTM的输出拼接后作为全连接层的输入,经过Dropout和BatchNormalization正则化,最终输出结果进行训练。
训练采用nAdam以及EarlyStopping,保存训练过程中验证集上效果最好的参数。最终对测试集进行预测。
1 | model = get_model() |
该网络在Kaggle Quora数据集val验证可达到80%左右的准确率,应用于中文,由于数据集有限,产生了较大的过拟合。此外在Tokenizer.fit_on_texts应用于中文时,不支持Unicode编码,可以对其源码方法进行重写,加入Ascii字符和Unicode的转换。
1 | ''' |
更多关注公众号:
标签:matrix 也有 shuffle jieba分词 open param 位置 输入 简单
原文地址:https://www.cnblogs.com/lijianming180/p/12259000.html