短文本语义匹配/文本相似度框架(SimilarityNet, SimNet),基于bow_pairwise模式及框架原理介绍

用PaddlePaddle实现段文本语义匹配Simnet模型
https://aistudio.baidu.com/aistudio/projectdetail/124373

Hinge loss: https://blog.csdn.net/hustqb/article/details/78347713
原文链接:https://blog.csdn.net/qq_33187136/article/details/106770431
SimNeT优秀博客:https://www.jiqizhixin.com/articles/2017-06-15-5

短文本语义匹配/文本相似度框架(SimilarityNet, SimNet),基于bow_pairwise模式及框架原理介绍

一、简介

短文本语义匹配(SimilarityNet, SimNet)是百度一个计算短文本相似度的框架,可以根据用户输入的两个文本,计算出相似度得分。

1.1 示例

句子1                句子2              相似度
车头 如何 放置 车牌	前 牌照 怎么装	0.8512318730354309
车头 如何 放置 车牌	如何 办理 北京 车牌	0.8042252361774445
车头 如何 放置 车牌	后 牌照 怎么装	0.8347993791103363
  • 1
  • 2
  • 3
  • 4

虽然三个句子的相似度区分度不是很大,但结果还是正确的,三个句子只有“前牌照怎么装”和“车头如何放置车牌”是最相似的,所以相似度相对较高。

1.2 小结

  • 1.1种的示例是我用百度基于大规模语料训练并开源的模型simnet_bow_pairwise_pretrained_model推理的,这个模型可以作为预训练模型用自己的语料在它上面进行微调。
  • 可以看到输入的句子都是分词后的,这也是SimNet预处理要做的工作——分词。

二、使用

详见SimNet源码,官方的readme介绍的比较清楚了。这里补充说明几点(可以先看完再去看官方说明):

  1. 环境依赖
  • 要求Python 2 版本是 2.7.15+、Python 3 版本是 3.5.1+/3.6/3.7
    我测试用的版本是3.7.4
  • 要求深度学习框架paddlepaddle1.6+,参考安装指南
    我测试用的版本是1.7.2.post107,107表示cuda10,cudnn7。因此我用的是gpu版的paddle框架,具体版本根据自己的配置选择,参考[安装指南]
  • 推荐使用conda管理环境
    conda create -n paddle python==3.7.4
    然后激活,到虚拟环境中安装其他库
    conda activate paddle
  1. 输入必须分词
    模型训练/推理的输入语料都必须是分完词的,不然就没有效果(模型内部是基于词的emb),分词工具在similarity_net同级的shared_modules/preprocess/tokenizer里,也可以使用其他分词工具例如jieba、hanlp等。

三、pairwise模式

本文我介绍的用法、原理以及最开始的例子都是基于pairwise模式的

3.1 训练集数据格式

句子Q\t句子D+\t句子D-,其中Q和D+是相似句,Q和D-是不相似句

这个不收费吧     这个是免费的吧      这个不好用吧 
  • 1

3.2 损失函数

损失函数使用HingeLoss,S(Q,D+)表示Q和D+的匹配得分(相似度)
max⁡{0,margin-(S(Q,D+)-S(Q,D-))}
因此,优化目标是使得Q和D+的相似度与Q和D-的相似度的差异最大,也就是让正例和负例的得分差异最大。超参数margin的值,根据情况可以适当调整。

四、原理(基于bow词袋模型)

如果已经比较熟悉SimNet的使用了,可以进一步了解它的原理,以根据自己的需求改进具体的网络层结构。

4.1 原理简图

在这里插入图片描述
根据SimNet(基于bow词袋模型),我画了一个简图(如上,软件:XMind),框架主要流程为:

  1. 输入层:
    将分完词的句子,首先查词表(term2id),将词转换为唯一的id(存储在张量tensor里)
    例如:["你好 同学"]–> [12345 23456]
  2. 词嵌入层:
    将存储id的张量tensor通过词嵌入,映射为词向量emb
  3. 表示层:
    将词向量emb通过池化层压缩到最后一维(sum加和的方式),然后再进行softsign激活函数激活
  4. 匹配层:
    上一步的激活后的张量tensor,首先通过一个全连接层(大概是用来增强语义表示吧),然后将经历同样过程的两个句子的向量进行cos_sim(余弦相似度)计算,得到相似度

4.2 改进思路

从原理可以看出来,SimNet(基于bow词袋模型)的结构是比较简单的,但有百度在该框架下开源的预训练模型(基于bow_pairwise)+预处理分词,最终效果还是可以的,但可能不适合高精度的应用场景。如果需要改进,可以从以下几点考虑:

  • 表示层使用CNN、LSTM等,对语义特征提取的效果更好,官方也给写好了这几种方式,直接改参数config_path就可以换了
  • 匹配层不直接对特征向量进行cos_sim(余弦相似度)计算,而是使用多层感知机MLP拟合出一个相似度
  • 自定义网络层,主要是针对表示层

总结

SimNet是一个短文本语义相似度框架,模型比较简单容易理解,可以在熟悉使用方式的基础上进行微调/改进。
SimNet的讨论还是比较少的,可能是使用的人比较少吧。如果有什么见解欢迎和我交流,我也仅仅是使用了一段时间并没有完全深入底层。另外,想了解更多SimNet介绍可以参考SimNet优秀博客。
百度nlp的生态还是比较好的,除了语义相似度,还有情感分析、实体识别…另外比如部署模型可以使用paddle serving、使用paddle hub可以实现几行代码预测,还有像bert那种强大的预训练模型ernie…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卖萌屋招人啦!

萌萌的小夕突然出现~这次来寻找小伙伴一起建设小屋啦!本期提供四种通道可直达卖萌屋核心腹地!小编/作者日常:发现,拍脑袋,然后写写写外部投稿的审核与编辑基本条件:对NLP、CV、IR、Rec、Ads、DM…

LeetCode 36. 有效的数独(哈希)

文章目录1. 题目信息2. 解题2.1 暴力3次遍历查找2.2 一次遍历查找1. 题目信息 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线…

如何从0到1设计一个类Dubbo的RPC框架

之前分享了如何从0到1设计一个MQ消息队列,今天谈谈“如何从0到1设计一个Dubbo的RPC框架”,重点考验: 你对RPC框架的底层原理掌握程度。 以及考验你的整体RPC框架系统设计能力。 RPC和RPC框架 1.RPC(Remote Procedure Call&#x…

shell脚本实现命令的自动执行

背景:在我傻傻的手工执行命令整整一天手腕都有点疼之后发现shell这个大宝贝简直开心的不得了 1. 关于shell脚本的使用: 一、编写完成的shell脚本放到脚本要执行的文件的相同目录下 二、注意shell脚本的编码问题(windows和mac下编写的脚本格式…

论文征集 | 2019 Joint International Semantic Technology Conference

第九届国际语义技术联合会议将于今年十一月在美丽的杭州召开,现在征集优秀的研究论文,本届会议还专门设置了special session track,优秀论文将被推荐到SCI期刊发表,敬请赐稿!http://jist2019.openkg.cn/The Joint Inte…

阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别

什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 简言之,RPC使得程序能够像访问本地系统资源一样,去…

LeetCode 322. 零钱兑换(DP)

文章目录1. 题目信息2. 解题2.1 回溯穷举2.2 动态规划1. 题目信息 给定不同面额的硬币 coins 和一个总金额 amount。 编写一个函数来计算可以凑成总金额所需的最少的硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins [1, 2, 5], …

服务器使用

杀死用户lyli的所有进程 killall -u lyli杀是PID为19347的进程 kill -s 9 19347查看CPU的使用情况 free -h 查看进程实时情况 top一般有用的就这两个,RES是实际占了多少内存,%CPU除以100%就是占了多少块CPU

可以闭眼入的O'REILLY机器学习神书出新版了!

传说中的机器学习“四大名著”中最适合入门的一本——“蜥蜴书”新版来了!这本书的英文原版是美国亚马逊AI霸榜图书,在人工智能、计算机神经网络、计算机视觉和模式识别三大榜单中,均为榜首!国内外好评率均超过90%!读者…

论文浅尝 | 基于知识库的神经网络问题生成方法

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答。来源:NLPCC2018链接:http://tcci.ccf.org.cn/conference/2018/papers/EV7.pdf问题背景与动机作者认为,目前的问题语料生成主要依赖于人…

何使用BERT模型实现中文的文本分类

原文网址:https://blog.csdn.net/Real_Brilliant/article/details/84880528 如何使用BERT模型实现中文的文本分类前言Pytorchreadme参数表算法流程1. 概述2. 读取数据3. 特征转换4. 模型训练5. 模型测试6. 测试结果7. 总结前言 Google官方BERT代码(Tenso…

LeetCode 152. 乘积最大子序列(DP)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:输入: [-2,0,-1] 输出: 0 解释…

YouTube深度学习推荐系统的十大工程问题

文 | 王喆源 | https://zhuanlan.zhihu.com/p/52504407这篇文章主要介绍了YouTube深度学习系统论文中的十个工程问题,为了方便进行问题定位,我们还是简单介绍一下背景知识,简单回顾一下YouTube的深度推荐系统论文Deep Neural Networks for Yo…

RPC框架的实现原理,及RPC架构组件详解

RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时,只需一个应…

论文浅尝 | 时序与因果关系联合推理

论文笔记整理:李昊轩,南京大学硕士,研究方向为知识图谱、自然语言处理。来源:ACL2018链接:https://www.aclweb.org/anthology/P18-1212动机理解事件之间的时间和因果关系是一项基本的自然语言理解任务。由于原因一定先…

LeetCode 64. 最小路径和(DP)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例:输入: [[1,3,1],[1,5,1],[4,2,1] ] 输出: 7 解释…

加快读博失败的10种方法

文 | 德先生源 | 知乎博士难毕,全球皆如此。差不多每个学校都有1/3到一半的博士研究生拿不到学位。读博失败不仅本人难受,导师也不好过。为了帮助自己的博士生们顺利毕业,犹他大学的Matt Might教授(计算机科学家,生物学…

要成为一个 Java 架构师得学习哪些知识以及方法?

“ 最近在架构师线下实战中,被问到最多的一个问题,就是要成为一个 Java 架构师得学习哪些知识,以及怎样才能做到架构师这个级别? 今天主要澄清几个关于架构师的几大误区。 架构师并不是人人都能做到的,如果你能走到…

论文浅尝 | 一种可解释的语义匹配复值网络

笔记整理:耿玉霞,浙江大学直博生。研究方向:知识图谱,零样本学习,自然语言处理等。论文链接:https://arxiv.org/pdf/1904.05298.pdf本文是发表在 NAACL 2019 上的最佳可解释性论文。受量子力学中数学模型的…

指针都没搞懂,还能算得上 C++ 老司机?

在工业界,有这样一个规律:“ 但凡能用其他语言的都不会用C,只能用C的必然用C。”但是,C的学习和项目开发都比较困难。一个有经验的老手也经常搞出野指针,内存泄露等bug,包括我自己在学C的时候也非常痛苦。所…