知识库(主要是标准的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. 微信小程序 + wepy快速开发

    wepy官网:https://tencent.github.io/wepy/document.html,想要了解全面最好去官网,以下只是指出项目里常用地方. 1.页面跳转 (1)//有返回跳转wepy ...

  2. P1136 迎接仪式 题解

    题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出"欢迎欢迎欢迎欢 ...

  3. scratch编程我的世界3D史蒂夫

    这个程序我们只能制作出一个3D模型而已,并不是真正的我的世界整个游戏: 效果很炫酷吧!现在我们就来看看是怎样编程的吧! 首先,这个模型是有无数个平面克隆体摞在一起,旋转后会产生一种立体的错觉,是不是有 ...

  4. 设计模式:observer模式

    目标:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 例子: class Observer //观察者 { public: virtual vo ...

  5. 设计模式:template method模式

    思想:在父类中定义处理流程的框架,在子类中实现具体的处理方法 优点:在父类中定义处理的算法,无需在每个子类中重复编写 继承关系图: 例子: //接口定义 class Parent { public: ...

  6. 感知机(perceptron)原理总结

    目录 1. 感知机原理 2. 损失函数 3. 优化方法 4. 感知机的原始算法 5. 感知机的对偶算法 6. 从图形中理解感知机的原始算法 7. 感知机算法(PLA)的收敛性 8. 应用场景与缺陷 9 ...

  7. 使用python打造一款音乐播放器

    作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...

  8. 不是吧,阿sir,2020年程序员要不好过?

    自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员…   ...

  9. 循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问

    目录 反向代理 使用 1.创建代理目标服务端: 2.配置nginx反向代理目标服务端: 3.测试使用: 负载均衡 使用 1.准备服务端 2.修改nginx配置 3.测试 负载均衡策略 负载均衡的额外参 ...

  10. blog only to u

    2020/7/16 属于我的第一个博客正式上线,以后我将在此更新我的笔记和我的知识积累还有我那阔爱的小仙女!