内容简介:李航大佬说过(计算机上达到和人同等的对话能力还非常困难。现在的技术,一般是数据驱动,基于机器学习的。单轮对话有基于分析的,基于检索的,基于生成的方法。
记录
李航大佬说过( 原文链接 )
计算机上达到和人同等的对话能力还非常困难。现在的技术,一般是数据驱动,基于机器学习的。
单轮对话有基于分析的,基于检索的,基于生成的方法。
好吧, 我也感觉基于检索的是low的, 但是现在各家智能音箱貌似都没有突破这个坎. 大家听到的siri的b-box, 背后是一个无聊的逗逼程序员; 小爱同学的惊人语录, 写语料也许是一群抠脚大汉.
这半年的工作, 主要集中在开发一个基于检索的语义理解平台, 最近几天刚刚完成了第三版的进化.
初代目
去年年底, 刚来这里接手这项工作的时候, 老大给我的架构是简单的纯检索, 基于ES, 把事先编好的模板写到搜索引擎里. 每次收到前台请求, 将asr获得的文本扔到ES里搜, 一开始模板量比较少的时候, 分类效果挺不错的, 甚至还有点泛化能力, 但是当样本量上去之后, 检索的效果变得很差, 准确率下降的很厉害. 当时分析原因, 在于ES的检索原理, 是将放进去的文本进行分词, 而后再对每个词求
TF-IDF
分数, 形成一个向量, 匹配阶段可能是逐个比对返回分数最高的.
使用期间主要遇到两个问题, 首先是错误的识别, 因为检索出来的是模板, 进而参照模板进行命名实体抽取, 就出现了问题. 例如, 北京今天天气怎么样, ES通常会把它分类到模板: 今天@city天气怎么样. 而实际上对应的正确模板是@city今天天气怎么样, 使用这个错误的模板再走序列检测比对算法needle时, 就会出错. 其次是分词问题, 将文本放到ES时, 如果使用自带的
分词
器, 它会把中文逐个分开, 也就是说, 自带分词只会英文, 后来给ES配置了IK的插件基本上解决了问题. 但是根本上来说, 基于第三方的工具, 出现的问题始终难以控制, 只能是每次出现漏洞就针对性补上, 然后又可能会把别的地方捅个洞.
二代目
初代的主要问题, 我们认为在于基于TF-IDF的分类器, 只能是识别词, 而做不到语义. 后来想起了前一份工作做的广告文本分类, 于是又开始求助于万能的
word2vec
,于是有了二代.
在二代中, 我们采取了最为简单的算法: KNN, 逐条比对语料, 由于有了word2vec护体, 同时将匹配流程与NER结合, 终于彻底避开了初代中的第一类问题; 与此同时我在系统中添加了上下文配置, 使得简单的追问也得以实现, 比如问完北京的天气, 再追问南京呢, 也会成功分类到天气预测, 并且正确地抽取槽位.
第二代系统确实成功地帮助我们摆脱了ES, 基本上做到填什么就能识别出什么, 不会天天有人追问我你这又识别错了, 但是问题也很明显.
首先, 匹配效率低, 在初期只有大概一点多条人工模板时, 单条记录的分类时间居然达到了600ms, 效率简直惨不忍睹, 再看看人家讯飞的AIUI, 基本上在50ms左右. 我表示很无奈.
其次, 受分词器影响大. 比如说在公司开发一个语音遥控器时, 添加了许多的例如, 第@index个, 第@index个加@num个.etc. 这些玩意对应的话术是第一个, 第一个加三个. 但是在转化词向量前的分词步骤, 第一个分出来的此就是第一个, 模板分出来的是第 index 个, 每回有这种情况出现时, 就必须对应地调整分词词库, 非常蛋疼. 更蛋疼的是, 这类问题, 易于解决, 难以预防, 指不定哪次演示就挂了呢.
再次, 没有泛化能力究其原因, 我们训练词向量的语料库很小, 以至于每个领域对应的阀值都非常高, 这样也就限制了泛化能力.
三代目
针对第二版出现的三个问题, 当时先解决的是效率问题, 也就是在解决效率问题的过程中, 发现自己操作系统知识的薄弱, 于是乎撸了一本儿比较薄的清华的教材. 弄明白线程调度之后, 又简单学了下Golang里面的协程Goroutine, 写了个笔记 , 公众号准备跟简书同步. 细节不能赘述, 反正就是我把接口响应时间从600ms优化到40ms.
再往后就是最近第三版的开发, 这一版周期比较短, 起因在于有几个项目在使用第二版系统时, 遇到了一系列问题. 在填坑的过程中, 我发现来一个坑填一个也不是什么事, 于是思考了几天开始了三代目的开发. 我先是将NER作为一个微服务从系统中分离出来, 减少了各部分的耦合度(其实我是嫌这玩意启动加载的东西太多了, 调试时等半天); 然后又搞了个用户自定义阀值的功能, 并且融入到匹配流程中, 惊人地发现, 我的阀值跟讯飞那边近期出的类似功能里的建议范围一毛一样, 我真的没抄....
再后面就是重点了. 前一段时间我看了下某比赛(SMP2018, 一个垂直领域的短文本分类比赛)冠军的PPT, 发现他们的思路是CNN + 匹配. 其中很重要的一点是, 先做NER再走算法. 这个思路在几个月前其实我同样考虑过, 但是当时的NER过度以来Needle算法, 现在有了新的NER, 这个思路也就可以实践了. 于是我把整个匹配流程进行了大修, 同时重构了代码, 原本700行的核心代码被缩减到300行, 真的好爽. 附加的收益就是二代里的第二个缺点得到了解决.
挖坑
全文中黑粗斜体都是后面要好好写的内容, 也就是坑位, 当然还有别的坑位.
四代目开发
在这之所以用火影的编号, 也对应了各代系统的特点, 初代简单粗暴, 二代发现黑科技, 三代完善却老旧. 所以我们四代的开发目标就是.
很黄很暴力.
不对不对, 其实是快准狠.
暂定计划九月份开始尝试抛弃之前瞎搞的CNN模型, 山寨一下 一篇经典的CNN文本分类论文 , 再试试
Transformer模型
跟
注意力机制
. 前一段时间偷来的
迁移学习
的代码也准备试一下, 看能不能结合搞一下检saniaoqu索与生成共存的对话系统.
模型推导与代码实现
其实我也就是感觉学的东西不牢固, 想复习一遍 统计学习方法 , 好好再看一遍 西瓜书 , 还有之前买的那本死贵的 花书 , 在这过程中把基础的所有算法实现一遍, 写出来正好也能规范一下代码.
继续刷leetcode
有兴趣一起刷题的 我的gayhub库 , 代码写的不好, 欢迎指导. 目标就是今年mid及以上的题刷到100题以上把.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 小程序挖坑之路
- Angular 从入坑到挖坑 - 表单控件概览
- Angular 从入坑到挖坑 - HTTP 请求概览
- 能量视角下的GAN模型:GAN=“挖坑”+“跳坑”
- Camera2挖坑日记---如何解决预览画面变形
- 【Vue】VueCli3 + Vue + typescript 挖坑记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。