SiameseSentenceSimilarity,个人实现的基于Siamese bilstm模型的相似句子判定模型,提供训练数据集和测试数据集.
句子相似度计算是自然语言处理中的一个重要技术手段,主要有两种方法:
1, 基于传统的无监督方式,传统的用于计算句子相似度的方式有很多种,感兴趣的,可以参考我的基于传统方法的句子相似读计算项目:
https://github.com/liuhuanyong/SentenceSimilarity
2, 基于标注数据的句子相似度计算.这个思想大体是将句子相似度计算问题转换成一个相似句子类型判定问题,目前经典的方法是Siamese网络,这是本项目的一个初衷.
数据集主要来源于CCKS2018评测项目微众银行客户问句匹配大赛, 总数据集大小为十万条.数据集样式如下:
'''
怎么我开不了微利貸 怎么开不了户 录制不了 提示上传失败 0
亲为什么我的审批不通过的 为什么还款及时会提示综合评估未通过 1
你好,我借款的验证码发到我以前用的那个手机号码了,我该怎么设置呢 手机号码换了 1
“如何获得微粒贷资格” 为什么没微粒贷啊 1
为什么没接到电话 两天了,怎么还没有给我打电话审核? 1
我的电话已改为 绑定的手机号码能不能更改 1
借贷下来时间 10月国庆期间能借钱不 0
什么时候才邀请? 什么时候才能申请 1
上边可借56000元为什么申请不成功 为什么可借一万五,却借不出来 1
1万利息是多少 10个月利息多少 1
没经过审批 如何能通过微众银行审批要求 1
延期3天还款收取逾期利息是多少? 14号还款日,逾期两天手续费是多少? 1
申请的额度能取现吗 取现一次性取完可以吗 0
利息与罚息如何计算 咱这个利息多高啊 1
如何申请货款 怎样开通我微粒贷 1
多久才有贷款 凌晨以后的申请何时到账 1
你好 我要换卡怎么换 我卡掉了 换卡失败 0
'''
模型思想:采用典型的siamese网络,两个句子分成左右两个部分进行输入,使用了四层双向lstm(权重共享)进行网络编码,最后计算两个编码之间的距离,最后做预测分类: 一 , 编码层:使用两个双向LSTM进行编码,权重共享
'''搭建编码层网络,用于权重共享'''
def create_base_network(self, input_shape):
input = Input(shape=input_shape)
lstm1 = Bidirectional(LSTM(128, return_sequences=True))(input)
lstm1 = Dropout(0.5)(lstm1)
lstm2 = Bidirectional(LSTM(32))(lstm1)
lstm2 = Dropout(0.5)(lstm2)
return Model(input, lstm2)
二, 左右句子编码相似度计算
'''基于曼哈顿空间距离计算两个字符串语义空间表示相似度计算'''
def exponent_neg_manhattan_distance(self, sent_left, sent_right):
return K.exp(-K.sum(K.abs(sent_left - sent_right), axis=1, keepdims=True))
模型 | 训练集 | 测试集 | 训练集准确率 | 测试集准确率 | 备注 |
---|---|---|---|---|---|
问句匹配 | 80000 | 20000 | 0.8125 | 0.7956 | 20个epcho |
1,句子相似度计算是自然语言处理中的一个重要技术手段,本文简单实现了simamese相似度计算网络.
2,通过LSTM编码,曼哈顿距离作为相似读衡量的网络,在训练集上达到了0.81,测试集达到0.7956的准确率.
3,目前关于相似度计算的网络有很多,本项目是一个基础,后期将逐步学习,尝试其他网络.
4,将传统的相似度计算方式和深度学习网络进行融合,或许是可以做的一个点.
如有自然语言处理、知识图谱、事理图谱、社会计算、语言资源建设等问题或合作,请联系我:
邮箱:lhy_in_blcu@126.com
csdn:https://blog.csdn.net/lhy2014
我的自然语言处理项目: https://liuhuanyong.github.io/
刘焕勇,中国科学院软件研究所