若何让你的客服问答系统从“人工智障”到“人工智能”_分词_科室
这个项目是给某医院做的自动客服系统,对接了微信"大众年夜众号,哀求能回答一些固定种类的问题。比如:
1. 住院部在几楼?(问路)
2. 帮我预约一下张年夜夫门诊(预约)
3. 查询刘年夜夫主治的内科病人(查询)
……
当然,实际种类有十几个,就不一一列举了。
当我拿到上任“资深自然措辞处理架构师”老胡发给我的代码时,我的内心是谢绝的。这并不是由于他没有头发,而是由于这些代码太“硬”了。险些所有逻辑都是硬编码进去的,基本流程如下:
基本流程便是正则匹配问句,根据匹配上的正则表达式判断问题种类,然后实行相应逻辑。包括查询相应的数据表或 ElasticSearch 索引,或者向业务系统要求预约等。当然,实际代码里正则表达式比这个繁芜一百倍,毕竟这套系统上线了好几年,收成差评数万呢。差评缘故原由无非以下四个方面:
1. 问句种类匹配不准,比如“查询刘年夜夫在内科主治的病人”会同时匹配到“问路”和“查询”两个类型。旧系统又编码了很多优先级规则,一团乱麻。我猜这团乱麻是老胡呕心沥血用自己头发编织出来的。
2. 问句身分匹配不准,用户输入千奇百怪。比如“张年夜夫”“张主任”“ 张大庆”“张大庆年夜夫”,我看搜索日志,还有用户爱称“张神医”“大庆”“大庆年夜夫”的,也不嫌肉麻。用户随便输入,但旧系统硬编码的名单都是真实姓名,匹配不上各种称呼。其余,每次新年夜夫入职,要过好久才对接名单更新。
3. 不支持多轮对话。用户常常没法一次性输入全所有信息,比如“帮我查一下刘年夜夫的病人”,但是检索系统又哀求必须指定科室。这时候旧系统就只能回答“请同时指定年夜夫和科室”。用户于是回答“便是内科啊”,可这次旧系统居然匹配上了问路的正则表达式,于是返回了去内科怎么走。这下用户就被彻底被激怒了,体验极差。特殊是这种查询功能一样平常都是医院的大领导们用的,听说间接导致了老胡的离职。
4. 检索系统搜索不准。纵然“张大庆”被正则匹配上了,但在检索系统中却被切分成“张+大庆”,导致结果第一条是“住院部挂着一张大庆油田的风景画”,完备答非所问。旧系统彷佛用的是什么 IK 分词器,缺点百出。我虽然不是科班出身,但是一看专业教材就浑身难熬痛苦。
我还是找到了一些资料,并且根据这些资料将系统重新设计了一下。这种客服系统属于自然措辞处理领域,学名该当叫任务型问答系统,基本就包括“意图分类”“槽识别”和“业务逻辑”三个模块,如下图所示:
个中,意图指的便是问题的类型,槽指的是每种意图中的特定名词。比如在问路型意图中,科室名称“内科”“耳鼻喉科”便是槽。也便是说,意图分类和槽识别代替了正则表达式,供应了更精确的结果,办理了 bug① 和 ②。
详细履行的时候,我自满地面向开源项目编程,直接用了 HanLP 中的文本分类器和命名实体识别做意图分类和槽识别,一步到位不要太爽。
HanLP 是由一系列模型与算法组成的工具包,目标是遍及自然措辞处理在生产环境中的运用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;供应词法剖析(中文分词、词性标注、命名实体识别)、句法剖析、文本分类和情绪剖析等功能。被广泛用于 Lucene、Solr、ElasticSearch、Hadoop、Android、Resin 等平台,有大量开源作者开拓各种插件与拓展,并且被包装或移植到 Python、C#、R、JavaScript 等措辞上去。项目详见:https://github.com/hankcs/HanLP
所谓文本分类器,便是给定一段文本,HanLP 自动判断种别。怎么个判断法呢?HanLP 怎么知道你要判断医院的“问路”“查询”“预约”还是新闻网站的“经济”“财经”“教诲”呢?这时候就须要用户供应一些例子给 HanLP 学习,这些例子在自然措辞处理里面叫语料。不是随便什么爬虫爬下来的文本都是语料,必须得有详细业务所须要的答案才行。
比如,在医院的人工客服系统中,累积了很多用户的查讯问句,以及客服小姐姐给查询语句打的标签(问路、查询还是预约)。这些问句+标签便是文本分类的语料,可以直接丢给 HanLP 让它学习。
学习得到一个文件,储存着如何把问句分类为“问路型”“查询型”“预约型”等等类别的知识,这个文件叫做模型。存起来丢给线上的 HanLP 分类器加载一下就可以实行分类了。这里比较推举基于 SVM 的文本分类器,听说速率和准确率都是最高的。
所谓命名实体识别,便是识别人名、地名、机构名之类专有名词的工具。我这个医疗客服系统里面紧张便是年夜夫的姓名了。听说 HanLP 的感知机分词器是在一亿字的语料库上演习出来的,准确率的确不知道比其他同类工具高到哪里去了。
HanLP 分词结果中,人名的词性标签是 nr,根据这个就拿到了年夜夫姓名。至于科室名,HanLP 虽然能分出来但是词性标签便是名词 n。我的做法是把老胡正则表达式中的科室做成词典,指定词性为 ndep 交给 HanLP 挂载就行了。反正科室是一个很去世板的东西,不会常常变革,一本用户词典管十年基本没毛病。
新系统 2.0 上线后调查数据显示,用户满意度果真提高了不少。搞搜索引擎的小伙伴听说了也把他们 ES 的 IK 分词器也换成了 HanLP 分词器,效果拨群。这样 bug④ 也办理啦。
后来领导看我这么快就把新系统上线了,立时给我发了奖金,立时给我派了新活儿——让我把院长上次提的多轮讯问实现一下。这解释交差不能太快,闷声才能发大财啊。
根据资料,多轮对话的管理必须有一个对话管理器,卖力综合对话历史和当前对话决定回答什么。在这个项目中,实在便是一个缓冲区的浸染。当一句话里面的槽不全的时候,该当把这句话的意图和槽缓存起来,然后向用户讯问更多有关缺失落槽的信息。这样问答系统才更故意思,不仅卖力回答问题,还能够向用户提问,帮助他们提出更准确的问题。
对话管理器的流程如下:
当然实际的对话管理器比这个繁芜,有些问题涉及到好多槽,有时候对话的话题又会变革,总之还是须要花费一些头发的。
3.0 上线后我以为项目总该庆功了吧,不料我还是太年轻。吹毛求疵的客户又报了几个工单上来,虽然比较旧系统少了很多,但总得给人办理吧。这次的问题是有些意图的区分度非常低,比如“查询张大庆卖力的科室”和“查询科室卖力的张大庆”这两个问句分别是要查“科室”和“张大庆”,但分类结果却是一样的。我找了找资料,原来分类算法利用了一种叫词袋模型的方法建模文档。词袋模型最大的问题是忽略了文档单词的顺序,也便是说,这两句话在词袋向量看来,都是下图的无序凑集:
我动脑筋想了想,办理办法有两个。一是在分词的时候把相邻的两个单词组合起来形成一个“新单词”,这样就在一定程度上保留了文档的语序。二是利用 HanLP 的句法剖析得出问句的语法构造,把语法构做作为一种特色信息供应给分类器。
比如“查询张大庆卖力的科室”的语法构造如下:
查询的宾语是“科室”。
“查询卖力科室的张大庆”的语法构造如下:
查询的宾语是“张大庆”。
我通过自定义 HanLP 的分词器和重载文本分类接口分别实现了两种方法,然后将语料划分为演习集和测试集。结果在测试集上第二种方案的准确率更高,解释句法剖析对这种短文本分类还是有一定疗效的。至此,这个“智能客服机器人”项目基本同等好评,圆满庆功了。
啊哈!
是不是溘然以为自然措辞处理还是很有趣的。如果你问我是哪个师傅带我进门的,那可绝对不是老胡,是这本《自然措辞处理入门》。这大概是市情上最友好的 NLP 入门书了,都是口语讲解,没有故弄玄虚的数学公式,其余还配备产品级代码。你不须要熬夜琢磨,地铁上也可以读懂,更主要的是对你的头发有好处。
《自然措辞处理入门》
本书作者是自然措辞处理类库 HanLP 作者何晗。截至 2019 年 10 月初,该项目在 GitHub 上 Star 数已达 15 K,超过了宾夕法尼亚大学的 NLTK、斯坦福大学的 CoreNLP、哈尔滨工业大学的 LTP。作者搜集多年履历,从基本观点出发,逐步先容中文分词、词性标注、命名实体识别、信息抽取、文本聚类、文本分类、句法剖析这几个热门问题的算法事理与工程实现。书中通过对多种算法的讲解,比较了它们的优缺陷和适用场景,同时详细演示生产级成熟代码,助你真正将自然措辞处理运用在生产环境中。
本文系作者个人观点,不代表本站立场,转载请注明出处!