年中记录与挖坑

MashoO · · 6400 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

记录

李航大佬说过(原文链接)

计算机上达到和人同等的对话能力还非常困难。现在的技术,一般是数据驱动,基于机器学习的。

单轮对话有基于分析的,基于检索的,基于生成的方法。


好吧, 我也感觉基于检索的是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题以上把.


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:MashoO

查看原文:年中记录与挖坑

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6400 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传