知识库(主要是标准的QA信息)匹配需求是对已经梳理出的大量标准QA对信息进行匹配,找出最符合用户问题的QA对进行回复,拆分主要的处理流程主要为如下两点:

  • 标准QA信息入库索引;
  • 通过对用户提出的问题进行处理,与索引库中的所有Q进行相似度计算,根据需要返回得分最高的top k个;
  • 基于返回的top k问题有平台根据业务需要选择其中的某个问题的答案回复客服。

在引擎端处理的主要是前两点,即根据需要对索引入库的Q进行预处理,对用户问题进行同样的预处理,而后计算两者之间的相似度,返回得分最高的前几条。处理流程如下图示:

检索原理解析

索引检索这块使用了ES的morelikethis算法,morelikethis相似搜索,是通过tf-idf构建查询语句进而查找与给定语句的相似文档。生成morelikethis的相似查询语句的流程如下图示:

通俗讲,morelikethis相似检索不是传统的通过传入的文本检索索引获取信息,而是先通过类似传统的检索获取指定相似检索字段的所有数据,而后通过对这些数据进行筛选获取排粉较高的一些特征词,而后基于这些特征词生成一个新的查询语句,通过新的查询语句获取相关查询数据。

更进一步可以理解为通过结果找结果。整个的查询流程如下图示:

上述流程得到morelikethis的检索语句后,通过检索既可以获取结果,获取结果后,我们在对这些结果进行下一步的相似计算。

相似计算原理

通过检索我们获取了跟用户提交问题的相似的N个结果,相似计算流程是根据预处理阶段得到的Q指纹编码,通过与用户问题的指纹编码进行编辑距离计算,根据得分进行排序,最终返回最相似的top k。此阶段可以看做是推荐系统中的CTR阶段。

指纹编码选择使用simhash算法,simhash是一种局部敏感哈希算法,相对于传统hash算法对文本的hash是让整个分布更均匀,文本的微小变化就会引起hash值很大的变化;simhash的局部敏感对文本的微小变化感知不强,可以对相似的文本进行判断。

Q1:出了保险如何理赔
Q2:出了保险如何理赔? simhash计算结果=====
1010111111010100011001100001111101011110111111010100011001101111
1010111111010100011001100001111101011110111111010100011001101111
传统hash计算结果=====
1092027993
-506870522

simhash 的计算流程如下:

  • 文本预处理,一般包括分词、去除停用词等操作,获得预处理后的term集合;
  • 基于获取的文本term集合,统计词频,去除超高词频(预设的阈值)词,基于分词的此行设置权重weight;
  • 对每一个term进行hash转换,得到64位的hash码(0/1码),而后对每一位上基于1/0值进行正负权重转换,1位设置加weight、0位设置减weight;
  • 针对文本的所有term的hash值,按照对应位置累加,得到一个64位的权重数组,然后将大于0的位置为1、小于等于0的位置为0,得到64位的0、1数组,作为该文本的新的hash值。

示例图(备注:图来自网络)如下所示:

对入索引的所有QA对的Q经过上述指纹处理后都会获得自己的指纹信息存储到索引字段中,用户新的问题经过预处理后可以得到自己的指纹,经过morelikethis的检索获取N条相似的信息,而后经过用户问题的simhash值域检索返回的N条信息进行汉明距离计算得到差值,选择差值排序小的 k个结果作为返回,而后经过sigmoid函数将差值转换为(0, 1)间的分值,将结果返回给业务方。

sigmoid归一化处理流程说明

通过编辑距离计算出来的距离为int变量,大于等于0,无法与NLU计算的结果在同一个维度上进行比对,为了将两者的结果都转换为(0,1)值之间,我们引入了sigmoid函数将编辑距离归一化处理。

Sigmoid函数可以将负无穷到正无穷的数值限制在0与1之间,为了进行计算,我们采用如下的形式:

\[f(x)=1/(1+exp^{-2.5x})
\]

函数绘图显示如下所示:

备注:图采用Octae绘制,示例使用代码

>> x=[-10:1:10];
>> F=1./(1+exp(-2.5*x));
>> plot(x,F)
>>

注意,在x=10时已经无限接近于1,结合前面介绍的汉明距离,我们对得出的汉明距离经转换后带入sigmoid函数中进行计算,转换: d = 10/d d不等于0(此处的10选择有待基于训练语料确定)。而后计算此次计算的相似度得分。

基于索引的QA问答对匹配流程梳理的更多相关文章

  1. 基于Processing图像序列处理保存导出的流程梳理

    做一个基于processing的图像序列处理保存导出的流程梳理.本案例没有什么实质性的目的,仅为流程梳理做演示. 准备 把需要处理的影像渲染成序列图片,可以在PR中剪辑并导出PNG序列[格式倒是没什么 ...

  2. 智能问答中的NLU意图识别流程梳理

    NLU意图识别的流程说明 基于智能问答的业务流程,所谓的NLU意图识别就是针对已知的训练语料(如语料格式为\((x,y)\)格式的元组列表,其中\(x\)为训练语料,\(y\)为期望输出类别或者称为意 ...

  3. 数据库 基于索引的SQL语句优化之降龙十八掌(转)

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言      客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...

  4. 简述基于Struts框架Web应用的工作流程

    简述基于Struts框架Web应用的工作流程 解答:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们 ...

  5. Mysql InnoDB 是IOT表 锁基于索引

    </pre>Mysql InnoDB 是IOT表 锁基于索引<pre>

  6. django的url匹配流程

    URL匹配流程(路由解析顺序): URL匹配流程说明 域名.端口.端口后的 /,以及查询字符串(问号后面的键值参数)不参与匹配 先到项目下的 urls.py 进行匹配,再到应用的 urls.py 匹配 ...

  7. 基于linux与busybox的reboot命令流程分析

    http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...

  8. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  9. Eureka服务端源码流程梳理

    一.简述 spring cloud三步走,一导包,二依赖,三配置为我们简化了太多东西,以至于很多东西知其然不知其所以然,了解底层实现之后对于一些问题我们也可以快速的定位问题所在. spring clo ...

随机推荐

  1. Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期

    Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...

  2. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  3. Unity-内存

    editor 和runtime的内存管理分开的 unity检测不到native内存容量 如c++,lua 一个asset一个ab的问题在于 每个asset都有对应的文件头,并不划算 IL2CPP抛弃了 ...

  4. ASP.NET Core静态文件处理源码探究

    前言     静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接 ...

  5. Ethical Hacking - NETWORK PENETRATION TESTING(8)

    WEP Cracking Basic case Run airdump-ng to log all traffic from the target network. airodump-ng --cha ...

  6. Mock分页

    前后端分离开发时,一般会使用mock. 因为mock是用node运行的,行为与调用后台一致. 这样,不需要等后台写好,只要有接口文档,前端可以自己调接口,这样联调时遇到的问题会少很多,可以加快整体开发 ...

  7. springcloud之Eureka注册中心

    参考博客:https://www.cnblogs.com/ityouknow/p/6854805.html 背景: Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Ser ...

  8. Java Web(2)-jQuery下

    一.jQuery的属性操作 html() 它可以设置和获取起始标签和结束标签中的内容,跟 dom 属性 innerHTML 一样. text() 它可以设置和获取起始标签和结束标签中的文本, 跟 do ...

  9. ~~并发编程(十三):信号量,Event,定时器~~

    进击のpython ***** 并发编程--信号量,Event,定时器 本节需要了解的就是: 信号量,以及信号量和互斥锁的区别 了解时间和定时器,以及使用 信号量 信号量也是锁,本质没有变!但是他跟互 ...

  10. python的__get__方法看这一篇就足够了

    get类型函数 直接上代码: class TestMain: def __init__(self): print('TestMain:__init__') self.a = 1 if __name__ ...