LSTM 句子相似度分析
使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确。如下面两个句子:
- “北京的首都是中国”与“中国的首都是北京”的相似度为1。
- “学习容易”和“学习困难”的相似度很容易也非常高。
为解决这类问题,需要用其他方法对句子进行表示,LSTM是常用的一种方式,本文简单使用单层LSTM对句子重新表示,并通过若干全连接层对句子相似度进行衡量。
数据准备
训练和测试数据包括两个待比较句子以及其相似度(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 |
''' |
项目源码https://github.com/zqhZY/semanaly/
更多关注公众号:
LSTM 句子相似度分析的更多相关文章
- 机器学习 - LSTM应用之情感分析
1. 概述 在情感分析的应用领域,例如判断某一句话是positive或者是negative的案例中,咱们可以通过传统的standard neuro network来作为解决方案,但是传统的神经网络在应 ...
- 相似度分析,循环读入文件(加入了HanLP,算法第四版的库)
相似度分析的,其中的分词可以采用HanLP即可: http://www.open-open.com/lib/view/open1421978002609.htm /****************** ...
- 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析
这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...
- Java利用hanlp完成语句相似度分析的案例详解
分享一篇hanlp分词工具使用的小案例,即利用hanlp分词工具分析两个中文语句的相似度的案例.供大家一起学习参考! 在做考试系统需求时,后台题库系统提供录入题目的功能.在录入题目的时候,由于题目来源 ...
- 文本相似度分析(基于jieba和gensim)
基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...
- 八大排序算法——希尔(shell)排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插 ...
- 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...
随机推荐
- mysql 几个坑
浮点转int类型 更新合并换成插入 不要频繁更新超过20个字节的字段 程序逻辑得到数据处理后才还回连接
- dsp
- Crowd Control
我的图论还是只会套模板 嘤嘤嘤 题目描述 The BAPC draws a large number of visitors to Amsterdam. Many of these people ar ...
- diary-2019.9.16
It has been observed by various scientists and nutritionists that it is better to have smaller and a ...
- mysql中datetime时间转字符串(避免java层映射为数字串)
-- in_date datetime NULLDATE_FORMAT(ls.`in_date`,'%Y-%m-%d %T')AS create_time
- Dangal 观影感受,(摘录)
===================================================================================== 引用: https://ww ...
- spring cloud解决eureka的client注册时默认使用hostname而不是ip
eureka的client注册到server时默认是使用hostname而不是ip.这样的话使用feign client通过eureka进行服务间相互调用时也会使用hostname进行调用,从而调用失 ...
- 如何查看Linux系统下程序运行时使用的库?
Linux系统下程序运行会实时的用到相关动态库,某些场景下,比如需要裁剪不必要的动态库时,就需要查看哪些动态库被用到了. 以运行VLC为例. VLC开始运行后,首先查看vlc的PID,比如这次查到的V ...
- mysql查找json格式列的指定字段值
SELECT json_extract(字段名,'$.json结构') FROM 表名;如果json里有双引号,那这样取出来的数据也带双引号,要去掉就使用REPLACE函数 例如t_submit_an ...
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码
Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...