如何搭建一个智能客服(三):NLP 里实体信息的抓取与应用
前面两篇说了用户意图拆分与识别,和基于此设计的多轮对话流程。这一篇接下去讲自然语言处理(NLP)中实体信息的抓取和在产品中的应用,也是如何搭建一个智能客服系列的第三篇。
你或许思考过,AI是怎么听懂人说话的呢?——当我在商场,跟商场的机器人说我要去三楼,它是怎样听懂我的意思的呢?当我说去NARS,它怎么知道NARS是什么,是在哪里?
想知道以上问题的答案,那么就要说叨说叨实体(entity)了。
首先,实体信息是什么意思呢?
它表示关键性的信息,通常可以分为两种, 一是与业务基本无关的, 可以算作通识的信息,比如手机号、邮箱、日期、时间; 二是与业务相关的, 根据实际场景定制的。
怎么理解呢?接下来我将举例说明。
01 与业务基本无关的
举个栗子,第一个场景,当你需要预订一张机票,假设你会这样说:
帮我订张明天的机票,从北京去上海,下午起飞的那种,我电话13344445555,行程单发我邮箱yuanquaner@woshipm.com
好的,已为您找到如下符合条件的航班……
在这个场景中,‘明天’和‘下午’就是时间信息,‘北京’和‘上海’是地点信息,‘13344445555’是手机号。因为这些信息可以说是通识,不随业务而改变,所以 一般会内置到算法中去,识别并做对应的转换。
在上面的场景中,AI端会先识别出日期和时间,然后把‘明天’转换为‘2020年3月27日’,‘下午’转换为‘14:00-18:00’,再与其他信息合并,由数据端向航空公司发起请求,再告诉你返回的结果,即符合条件的航班列表。
这个 识别环节 听起来是简单的,因为人类在语言学习的过程中已经能够条件反射出什么是日期、什么是手机号、什么是地点。
但是对AI而言,起初这些东西都是一样的字而已,需要大量的算法来区分与提取到这些信息。这里的识别率与算法设计时对语言理解的丰富度息息相关。
比如说,一开始是对‘明天’‘昨天’做了识别,而忽略了‘前一天’‘后一天’的表达;或者一开始做了‘2020年2月2日’,而忽略了‘2020年二月二日’的表达,就会直接拉低识别率,具体的表现就是……智障率升高。
转换这一步中,有个很有意思的点:
人们用自然语言表达日期时间等信息时,其实是不完全符合标准逻辑的。
比如说,当你在晚上00:10分跟智能助手说,“订个明天的闹钟”,这里的“明天”大概率已经是算“今天”了。
当你在2020年1月里,跟智能助手说,“查查12月的账单”,你其实是在讲2019年的12月。这些语言表达习惯都应该考虑进去,才能让智能助手“感觉像个人”。
Siri在这里做的很好,订闹钟的场景,它会再确认一句“请问你是说订今天早上8点的闹钟吗?”
02 与业务相关的
收回来说第二个场景,结合业务出现的实体。
继续举栗子,当你要买一杯奶茶,你通过智能助理完成这个操作,那么对话应该是这样的:
我要一杯奶茶,一点点的,大杯四季奶青,全糖,加一份红豆,不加冰。
好的,已下单。
这里面,‘一点点’是奶茶品牌,‘四季奶青’是奶茶商品名,‘大杯’是份量,‘全糖’是糖度……
由于它们是完全依托于业务的表达,离开这个场景则这些词不再有意义。
比如你在跟别人聊天气的时候突然说一句“一点点哦”,对方是听不懂的。它不像“北京”这种词,北京永远是北京。
所以这种信息就是我说的,要根据实际场景定制的,也就是说,我需要告诉AI,什么是奶茶品牌、什么是奶茶商品名、什么是份量……
怎么告诉它呢?
一般有三种途径:字符串匹配,正则表达式,标注。
1. 字符串匹配
字符串匹配,即定义一个实体信息的合集,适用于固定出现的字段。说起来比较晦涩,我用伪代码(因为不会写真代码)形式写一下就清楚了。在买奶茶的场景中,对奶茶品牌和商品名等实体信息的定义可以这样写:
“奶茶品牌” = [ ‘一点点’, ‘喜茶’, ‘乐乐茶’, ‘奈雪的茶’ ]
“份量” = [ ‘大杯’, ‘中杯’, ‘小杯’ ]
“商品名” = [ ‘四季奶青’, ‘红茶玛奇朵’, ‘芝士芭蕾’ ]
这样,当用户说到了其中一个项,AI就可以知道对方在讲什么了。
2. 正则表达式
正则表达式,即定义一个实体信息出现的规则,适用于有规律出现的信息。以车牌号为例,常见的形式为省份缩写(一个汉字)+一位字母+五位数字,依然用伪代码的形式表达,如下:
“车牌号” = [京沪鲁浙……津豫赣]{1}[A-Z]{1}[0-9]{5}
#意思是从省份缩写中的一个字+一个大写字母+5个阿拉伯数字
同理地,我们可以用这种方式定义其他有规律的词汇,像设备批号,身份证号,手机号,订单号,诸如此类。
讲到这里,你可能想说,这两种办法一点都不AI嘛。那么……朋友你说的没错我也这么认为!不过途径只是途径,AI也不是目的,而是为了实现最终与人对话的效果。所以来看很AI的第三种吧。
3. 标注
标注,即对表达某一个意思的语句进行标注,从而让机器学习到某一个意思,适用于不固定也不规律的表达。
以笔者工作里的一个场景来说,有车贷或房贷的用户,经常会来咨询,自己还完了多少钱,自己还剩多少钱要还。那么我稍微整理了一些出现过的表达方式,如下:
我还了多少钱了?
我已经付掉多少贷款了?
我还完了多少贷款?
有多少贷款是还上了的?
我已经还了多少款?
我的贷款还清了多少了呢
我还有多少钱要还啊?
还剩多少贷款要付?
还有多少贷款得付?
我还要付多少钱呀
很明显地,这些表达即不会用固定的名词,也没有可以写成正则表达式的清晰规律。但是可以用语义上清楚地看出来用户在问什么,所以这里采用标注的形式把意思标出来。
我们定义还完了多少钱的概念为=”已还”,还剩多少钱要还的概念为=”剩余”,括号起来的为标注的位置:
我[ 还了多少钱] 了?——“实体”=“已还”
我 已经[付掉多少 贷款]了?——“实体”=“已还”
我[ 还完了多少] 贷款?——“实体”=“已还”
有[ 多少贷款是还上了] 的?——“实体”=“已还”
我已经[ 还了多少 款]?——“实体”=“已还”
我的贷款[ 还清了多少] 了呢——“实体”=“已还”
我[ 还有多少钱要还] 啊?——“实体”=“剩余”
还[剩多少贷款 要付]?——“实体”=“剩余”
还[有多少贷款 得付]?——“实体”=“剩余”
我[ 还要付多少]钱 呀——“实体”=“剩余”
在完成了大量以上类型的标注后,当用户再问到相同的问题,AI大概率上就能识别到对应的实体信息,那么就可以继续“像个人一样”地进行对话了。
在实际的落地场景中,提取的途径并不是唯一的,也不一定是固定的。具体采用哪种方式来实现需求,是基于PM对技术方法的了解和对业务背景的熟悉而做判断。究其根本,一切都还是为了用户需求而服务。
好了今天的内容就到这里~下一篇主题是怎样让AI更像人——伪装的智能感。感谢观看!
本文由 @一个圆圈儿 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议