在智能时代,以对话为主要交互形式的CUI会应用到越来越多的场景中,这时机器往往需要能够完成“听懂——理解——回答”的闭环。它们相应地涉及到三类技术:语音识别、自然语言处理以及语音合成。
语音识别的任务是将用户所说的话从音频形式转变为文字形式,自然语言处理的任务则是理解这些文字所要表达的意思(语义)。机器针对用户的语义会给出相应的回答,并以语音的形式说给用户听,这就需要用到语音合成。
语音识别、自然语言理解与语音合成三者环环相扣,任何一环的失误都无法使产品获得良好的用户体验。
如果说语音识别是CUI交互的基础,自然语言处理则是当之无愧的灵魂:无法理解用户说话的意思,那和一台录音机有什么区别。
NLP与对话系统
自然语言即人类日常交流所使用的语言,与之相对的是人造语言(如各种编程语言)。自然语言处理(Natural Language Processing,NLP)主要研究机器如何理解自然语言文本的含义从而有效处理,以及人与机器之间如何通过自然语言有效通信。
NLP的应用非常广泛,包括文本分类、文本摘要、机器翻译、舆情监测与对话系统等,每个应用领域所涉及到的技术原理会有所差异。
以CUI为主要交互形式的对话产品,其核心是一个对话系统。在一个比较简单的对话系统中,用户输入的文字主要会经过分词、词性标注、特征提取与分类检索四个处理过程。
(1)分词
分词指通过分词模型,将一个文字序列切分成一个个词或短语。单独的汉字与字母往往很难表达语义,所以需要将文字序列变成由词或短语组成的序列,作为后续处理的基础。
英文的单词之间存在空格作为分界,所以仅存在短语的划分问题;而中文的文字之间没有明显的分界符来进行词语上的划分,所以中文分词比英文分词更加困难。
中文分词的方法主要分为三类:基于匹配、基于理解与基于统计。基于匹配是指将文字序列与一个“词典”中的词语进行匹配,若在“词典”中找到某个词语与文字序列中的某几个连续汉字匹配,则将这几个连续汉字切分为一个词;基于理解是指在分词的同时进行句法、语义的分析,并利用句法和语义信息来帮助分词;基于统计是指通过统计文字序列中的相邻文字在大量文本数据中相邻出现的频率,来判断它们是否组成了一个词语。
(2)词性标注
分词模型将用户输入的文字序列变成“词语序列”后,就需要通过标注模型,来标注这些词语的词性:即确定它们在这句话中是名词、动词还是代词等等。
中文词性标注相对英文较为简单,因为一个中文词语的词性往往只有一个;即便一些中文词语存在多个词性,它的“主要”词性出现的频率也远高于其余词性。据说在中文词性标注时,只需“简单粗暴”地为每个词语选取它最主要的那个词性,即可获得还不错标注准确率。在需要更高的标注准确率时,可采用隐马尔可夫模型等方法。
(3)特征提取
特征提取是将用户输入的文字序列变成向量的过程。根据分词与词性标注的结果,可以根据某种规则来提取文字序列的若干个特征,组成一个向量;向量的每个分量则描述了文字序列的一种特征。文字序列变成了机器擅长处理的向量形式后,即可进行后续的分类与检索。
(4)分类检索
分类与检索通过分类器(用于分类的模型,如神经网络)与FAQ(储存着很多“问题”与对应“答案”的数据库)来完成。
FAQ中储存的一个个“问题”,在机器眼里是一个个向量。通过特征提取得到用户输入的文字序列所对应的向量之后,就可以利用分类器,通过向量与向量之间相似程度的计算,来等效获得用户输入与FAQ中各个“问题”的相似程度。
通过比较用户输入与FAQ中各个“问题”的相似程度的大小,就能检索出与用户输入最为“匹配”的那一个,从而将它所对应的“答案”作为回答,输出给用户。
值得一提的是,如今AI界的网红深度学习,正是通过分词模型、标注模型以及分类器的训练来应用于对话系统中的。这些模型可以选择深度神经网络作为结构形式,然后通过大量数据训练而得到。
此外,对于更加复杂的对话系统,还涉及到指代消解、成分补全、命名实体识别等NLP技术,同时在架构层面也需要具备对话管理器、知识图谱等模块。这些进阶版的科普内容,会在以后的文章中详细阐述。
人工智能的高枝果实
NLP是人工智能的“高枝果实”,其难度一直被认为是人工智能领域最高的之一。目前NLP所获得的研究成果离真正准确地理解人类语言,与人类无障碍交流还相差甚远。
NLP的难度主要来源于两个方面:一是语言是人类自己所创造的东西,并不是客观世界所存在的,所以非常主观与多变;二是语言所传递的信息往往和上下文有关。
(1)语言的多变性
语言的多变最典型的体现就是一个意思有多种说法,以及同样的词语在不同的语言环境中表达不同的意思。比如同样询问一辆车的操控体验,就有无数种说法:
奔驰的操控性怎么样?
奔驰好开吗?
奔驰开起来顺手吗?
……
又比如同样一个动词“打”,可以表达无数种不同的意思:
我要去打个车
他很想打人
你去把这个文件打一下
……
人类理解这些不同的说法并不困难,但对机器而言则是噩梦:单纯根据字词的意思推测语义,很多时候会得到错误的结果;如果要穷尽各种不同的表达方式来训练一个模型,所需要的数据量则是天文数字;如果想把人类理解这些语言的“规则”告诉机器,又很难把这些规则总结清楚……
而且在日常交流时,还大量存在各种不规范说法、简称、习惯用法等。机器要想理解它们,分分钟哭晕在厕所。
(2)上下文相关性
自然语言中上下文的相关性主要体现在某个语句所要表达的意思,往往和之前的谈话内容有所关联。比如:
A - 北京今天有雾霾吗
B - 有,重度污染
A - 那明天呢
B - 别问了,最近天天都有
A - 那它啥时候会好点
B - 不知道
A在第二个问题中省略了提问内容“有雾霾吗”,在第三个问题中用“它”指代了北京的空气状况,B都能够联系上文准确领会。但让机器去这样做则是一个困难的问题。尽管像上面这样简单的对话目前的技术已经能够处理,但更加复杂的上下文场景依然存在很大的挑战。
产品只求恰到好处
NLP技术的不成熟并不代表它在今天无法发挥价值。前沿科技的落地永远不必等到万事俱备:技术需要深厚积淀,产品只求恰到好处。唯有将现有的技术成果积极投入应用,才能有更多实际场景中的反馈来促进技术的发展。
应用在对话系统中时,NLP的“恰到好处”体现在三方面:支持特定语言、应用于特定领域与场景、明确特定的打开方式。
(1)特定语言
不同语言的“字词”差异很大,且存在不同的语法,所以机器对每一种语言的处理都需要专门针对这种语言收集数据训练模型。如果需要支持处理的语言种类很多,工作量会十分庞大。
然而在开发一个对话产品时,往往只需支持一两种较为通用的官方语言(比如标准的中英文)即可。随着国际化与教育的发展,语言一定会越来越通用化和官方化,让用户使用较为通用的官方语言(支持一定程度上的语法不规范)来操作一个产品并不苛刻。
更重要的是,在技术尚不成熟的情况下,针对一种语言进行良好的语义理解已属不易,分散研发力量支持多种语言必然会导致效果的下降。与其给用户提供n条不靠谱的路,不如集中精力先给出一条靠谱的来。
(2)特定领域与场景
谈话的内容往往与领域强相关,好比在谈论汽车领域的问题时,医疗领域的内容就很难出现在谈话中。
所以,在开发对话产品时,要明确这个产品是解决什么领域的问题:是一个用于电商的智能客服,还是用来查天气讲笑话逗乐的陪聊机器人。明确了产品应用的领域之后,所对应涉及到的语料数据就局限了很多,便于更好地进行覆盖。
同样的领域还可以进一步分为不同的场景。比如开发一个面向汽车行业的对话产品,既可以针对售前场景解答客户买车时的疑问,也可以针对售后场景解答客户购车之后所遇到的问题,还可以通过与客服人员对话来训练他们的基本话术。在垂直领域的基础上细分特定场景可以获得更加局限的语料范围。
当然,一个对话产品也可以同时支持多个领域与场景,但仍然需要针对每个领域和场景分别进行训练和开发,然后进行集成。好比一个人可以同时掌握多项技能,但这些技能需要一项项的学习。
(3)特定打开方式
现阶段的对话产品很难强大到让用户想怎么说就怎么说,所以对话产品应该设定一种对用户使用有所限定,且仍能让用户觉得它有价值的“打开方式”。
比如对于智能客服产品,如果立足于完全替代企业的客服人员,那么企业购买之后肯定会发现这个产品并不能达到宣称的效果,必定会吐槽产品难用、虚假宣传。
如果换一种打开方式,正视产品的局限性,把立足点从完全替代人工转变成“机器回答60%标准问题,客服回答其他40%问题”的部分替代人工,那么它就成为了一个技术可以实现且同样对企业有价值的产品。
总结
NLP是CUI交互中“听懂——理解——回答”闭环的灵魂:机器无法理解用户说话的意思,就没有资格谈交互。
NLP有很多应用领域,包括文本分类、文本摘要、机器翻译、舆情监测与对话系统等。一个比较简单的对话系统主要会涉及分词、词性标注、特征提取、分类检索等技术;复杂的对话系统还会涉及指代消解、成分补全、命名实体识别等技术。
NLP是人工智能的高枝果实,人类目前的研究积累还非常初级。它的难度来源于两个层面:一是语言本身的变化非常多,二是语言所传递的信息往往和上下文有关。
即便NLP在技术上还很不完善,但仍然需要积极的将现有技术成果落地应用。开发对话产品时,可通过支持特定语言、应用于特定领域与场景、明确特定的打开方式三个方面来规避技术的不成熟,获得可用的产品。
依惯例,最后奉上一张图作为总结。