知识库(主要是标准的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. 02-flask项目创建及debug模式的开启

    一.flask文件的创建 打开pycharm,选择flask文件,选择相关配置,需要配置的有虚拟环境,flask文件名.如下图所示: 新建的flask文件如下所示: static:用来存放静态文件,包 ...

  2. bzoj4397[Usaco2015 dec]Breed Counting*

    bzoj4397[Usaco2015 dec]Breed Counting 题意: 给定一个长度为N的序列,每个位置上的数只可能是1,2,3中的一种.有Q次询问,每次给定两个数a,b,请分别输出区间[ ...

  3. 评测Loki日志工具

    评测Loki日志工具 目录 评测Loki日志工具 部署Loki 配置grafana 总结: 优势: 劣势: 本文仅对Loki进行简单评测,不涉及原理和细节. 部署Loki Loki是grafana团队 ...

  4. 代码Verify简介

    序 对于开发者而言,编译代码和提交代码是必不可少的流程,同一个需求反复提交的情况也时常出现,那么怎么避免这种情况,且保证代码的质量,这就是Verify CI的目标.Verify表示认证验证的意思,结合 ...

  5. 将音频文件转二进制分包存储到Redis(奇淫技巧操作)

    功能需求: 一.获取本地音频文件,进行解析成二进制数据音频流 二.将音频流转化成byte[]数组,按指定大小字节数进行分包 三.将音频流分成若干个包,以List列表形式缓存到redis数据库中 四.从 ...

  6. Java对象公约

    灵魂static关键字 Java规定:方法只能由对象来调用. 换句话来说,在面向对象的思维下,方法与对象存在一种强耦合. static作用:即使没有初始化对象,也可以调用方法.(类比到属性上同样如此) ...

  7. fiddler替换修改后的js文件绕过无限debugger

    转自:https://www.jianshu.com/p/38c4afae636c 1.在js文件右击, 然后点击save as ..., 把js文件保存到本地.(网站:https://taodaxi ...

  8. python Scrapy 从零开始学习笔记(二)

    在之前的文章中我们简单了解了一下Scrapy 框架和安装及目录的介绍,本章我们将根据 scrapy 框架实现博客园首页博客的爬取及数据处理. 我们先在自定义的目录中通过命令行来构建一个 scrapy ...

  9. Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform!

    原文链接:https://blog.csdn.net/u012700515/article/details/56009429 Maven 打包时有标题中警告,需要在pom.xml文件中添加 <p ...

  10. pandas_使用属性接口实现高级功能

    C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx 这个文档自己创建就可以,以下几篇文章仅作为参考 import pandas as pd import copy ...