在本章中,你将学习如何识别适合当前技术水平的 自然语言理解 问题。这意味着这些问题对于最前沿的NLU方法来说不困难,但也不能通过简单的非NLU方法来解决。实际的NLU问题还需要足够的训练数据,因为训练数据不足会影响NLU系统的性能。此外,一个好的NLU系统需要有合理的开发和维护成本。虽然本章将讨论的这些因素大多属于项目经理考虑的范畴,但它们也适用于那些正在寻找研究项目或研究论文题目的学生。
在启动一个与NLU相关的项目之前,首先要问的问题是:项目目标是否适合当前NLU技术水平,NLU方法是否能解决你所面临的问题?这个问题的难度与当前NLU技术水平相比如何?
在最初阶段就确定问题的性质至关重要。一个问题有不同程度的解决方式。如果项目要求的是原型展示或概念验证,那么解决方案则不必与要求系统部署的解决方案一样,因为需要系统部署的解决方案是为每天稳健地处理数千个用户输入而设计的。同样,如果问题是一个前沿的科研问题,那么对当前技术水平的任何改进都是有价值的,即使从应用型项目角度看这个问题没有被完全解决。解决方案的完整性也是在思考要解决的问题时需要做出的决定之一。
在项目启动阶段,项目经理或负责技术的开发人员就应该确定项目完成时可以接受的系统准确率水平,需要注意的是,在几乎所有的自然语言应用中,实现100%的准确率是不可能的。
本章将详细介绍如何识别适用于NLU的问题。遵循本章所讨论的原则,你将能够开发一个优质高效的系统,为用户解决实际的问题。
本章将介绍以下内容:
❑识别适合当前技术水平的问题
❑自然语言理解难以解决的问题
❑不需要自然语言理解的应用程序
❑训练数据
❑应用数据
❑开发成本
❑维护成本
❑决定是否使用自然语言理解的流程
请注意
本章主要关注技术和方法。其他因素(如市场可行性或客户吸引力等问题)同样重要,但不在本书的讨论范围之内。
当今的NLU方法擅长处理单一固定任务,以下是一些非常适合当前NLU技术水平的项目示例:
❑ 将产品评论分类为正面评论和负面评论: 在线商家通常为消费者提供评论所购买产品的机会,这对其他潜在的消费者和商家都有帮助。但大型在线零售商面临着如何处理成千上万条评论的挑战。人工审查每条评论几乎不可能,因此需要一个自动化的商品评论分类系统。
❑ 自动回答诸如账户余额或最近交易信息等银行基本业务问题: 银行等金融机构都设有客服电话中心,专门处理客户问题。通常,客户电话询问的问题都相对简单,如查询账户余额等。银行可以根据客户的账号信息查询银行数据库,从而获得客户问题的答案。一个自动化系统可以通过询问来电者银行账号等所需信息来处理这些问题。
❑ 简单的股票交易: 股票买卖通常非常复杂,但在许多情况下,用户只是想购买或出售某个公司一定数量的股票。完成这种交易只需要几个关键信息,例如股票账号、公司名称、股票数量以及是购买还是出售股票等。
❑ 包裹追踪: 包裹追踪通常只需包裹账号,通过查询包裹账号可以告诉用户包裹的状态。虽然在线包裹追踪很常见,但有时人们无法访问互联网。使用基于 自然语言处理 方法的语音应用程序,用户只需打个电话即可追踪包裹。
❑ 转接客户问题至正确的客服代表: 很多客户问题需要由人工客服回答。对于这些客户,电话客服中心的NLU系统可以将客户转接至适合的部门以获取人工客服服务。NLU系统可以询问客户打电话的原因,分析客户的请求,然后自动地将电话转接至处理该问题的专业客服或部门。
❑ 提供天气预报、体育比赛成绩和历史事实等信息: 这类应用的特点是请求中包含具体明确的参数。例如,查询体育比赛成绩,参数可能是一个球队的名字,也可能是一场比赛的日期;查询天气预报,参数包括位置和时间。
所有这些应用的特点是有明确、正确的答案,并且用户的输入语言相对简单。这些都是适合当今NLU技术水平的项目。
下面将详细介绍提供天气预报、体育比赛比分和史实信息的系统,以解释为什么这些应用非常适合当今的NLU技术。
图2.1展示了一个可以提供各种不同城市天气预报的应用程序示例。当用户询问“纽约市明天的天气如何”时,系统开始工作。请注意,用户提出的是一个单一的、简短的查询,请求获取特定信息——特定日期、特定地点的天气预报。NLU系统需要检测意图(天气预报)、实体(地点和日期)。这些都相对容易获取,因为实体非常独特,而且天气预报这一意图也不太可能与其他意图混淆。这使得NLU系统能够直接将用户的问题转换为适合气象服务网站处理的结构化信息,如图2.1所示。
图2.1 一个NLU的实际应用示例
虽然被请求的信息不太复杂,但还是存在许多询问方式。因此,列出一个用户可能问的问题列表并不切实际。表2.1展示了一些查询天气的问题。
这个查询天气的应用是一个典型的NLU应用,因为很容易从气象服务网站获取用户所询问的信息(天气预报),而且气象服务网站还提供了 应用程序接口 (Application Programming Interface,API)。这使得开发人员可以向气象服务网络发送查询信息,并得到以结构化表示的用户所需信息。然后,开发人员可以选择如何向用户呈现这些信息,例如以文本形式、图片形式或文本与图片相结合的形式。
表2.1 查询天气的多种问题
如图2.1所示,开发人员选择使用自然语言来表示信息。因此,使用 自然语言生成 (Natural Language Generation,NLG)模块将结构化信息转换为自然语言作为输出。其他展示方式可以是图像展示,例如部分被云层覆盖的太阳的图片,也可以直接展示气象服务网站提供的信息。然而,只有NLG适用于语音应用(如智能对话系统),因为语音应用系统无法显示图像。
在天气预报等应用程序中使用NLU的最大好处是,尽管用户可以以众多方式提出同一个问题,但NLU可以以相同的意图处理该问题,如表2.1所示。
表2.1展示了查询天气的多种说法或同义问题。这些说法只是询问天气的一些可能方式。即使是一个简单的问题,也存在多种不同的提问方式。如果我们可以列出一个问题的所有问法,那么即使列出的问法很多,NLU也没有存在的必要了。
理论上,我们可以列出一个问题的所有问法,并将它们映射为结构化的查询信息。但实际上,即使是一个简单的查询天气问题,也很难列出人们问这个问题的所有说法。如果一个用户碰巧问了一个不在列表中的问题,那么系统将无法响应。这可能会让用户感到困惑,因为用户不理解为什么当问类似的问题时系统可以工作,但当问这个问题时系统没有回应。NLU系统应该具备处理表述稍有不同但意思相同问题的能力。
正如本节所示,如果一个应用程序具有清晰且易于识别的意图和实体,并且可以从网络中获取明确的答案,那么使用当前的NLU方法,这个应用程序成功的机会很大。
现在,让我们转向那些不太可能成功的应用程序,因为这些应用程序所需要的NLU技术超越了当前技术水平。
如何判断一个问题是否过于复杂,超出了当前NLU技术水平?首先,需要明确一个问题过于复杂是什么意思。以下是一些试图将NLU方法用于超出当前技术水平问题可能导致的后果:
❑系统无法可靠地理解用户的问题。
❑系统的回答将包含错误,因为系统误解了用户的问题。
❑系统将频繁地回答“我不知道”或“我不能这么做”,导致用户体验变差,使用户决定不再使用该应用程序。
需要牢记的是,当前技术水平正在迅速提高。最近,随着ChatGPT等基于云的大语言模型的出现,NLU领域取得了显著的进展。一些现在看似非常困难的应用程序将会变得不再困难。
现在,让我们来探讨当今NLU方法难以解决的问题的一些特点。
1.要求系统具有常识和判断能力
与2.1节的天气查询示例不同,需要判断能力的问题往往没有正确答案,甚至没有合理的近似答案。寻求建议便是这类问题之一,给别人提建议需要考虑许多复杂的因素。以下是一些相关的例子:
❑我应该学习Python吗?
❑我应该接种COVID疫苗吗?
❑我应该买电动车吗?
❑现在是购房的最佳时机吗?
要回答第一个问题,系统需要了解用户的相关情况,比如用户是否已经有编程基础以及用户学习Python编程的目的是什么。基于大语言模型的对话系统(如ChatGPT)通常以通用的方式回应此类问题,例如提供一些大多数人在购房时考虑的问题,但系统无法给用户提供具体且具有针对性的建议,因为系统对用户的情况一无所知。
要求对话系统提供主观意见的问题也具有挑战性,例如:
❑历史上最杰出的电影是哪一部?
❑20世纪最杰出的演员是谁?
❑用什么好方法可以在半小时内完成烹饪鸡肉?
要完全回答这类问题,系统需要具备常识,例如20世纪的演员都有谁。系统可以给出一个随机答案来回答这类主观问题,例如随机选择一部电影并宣称这部电影是有史以来最优秀的电影。然而,随机选择的电影甚至可能不是一部好电影,更不用说是有史以来最杰出的电影了。
在这种情况下,如果用户提出后续问题,那么系统就无法解释或证明自己的观点。所以,如果用户询问系统是否应该购买电动汽车,那么系统可能会简单回答“可以”,但无法提供具体的原因。实际上,当今许多系统可能很难意识到用户提出的问题是一个主观问题。就像那些需要用户信息才能给出针对性答案的问题一样,基于大语言模型的系统会对主观问题给出一些通用答案,但它们会明确表示自己无法处理主观问题。
2.要求系统处理假设和与事实相反的问题
另一个困难的领域是处理虚构或可能并非事实的问题。当用户询问一些可能发生的事情时,用户的询问往往是一个假设的问题。当今最先进的系统擅长提供具体信息,但在推理方面仍有不足。以下是一些示例:
❑如果我有15000美元的预算,并且我自己亲自动手参与建设,那么我应该建多大的露台?
❑如果有6个人,那么我应该订购多少个比萨?
❑如果天气预报显示明天不下雨,那么请提醒我给植物浇水。
同样,系统也不擅长逻辑推理。例如,考虑这句话,“我想找一家附近的亚洲餐厅,但不要日本餐厅。”要正确回答这个问题,系统必须找到亚洲餐厅,同时它必须明白,它应该从列表中排除日本餐厅,尽管日本餐厅也是亚洲餐厅。
3.要求系统结合语言与传感器信息
一些非常有趣的应用程序涉及语言、相机、麦克风等信息的结合。这种应用程序被称为 多模态 应用程序,因为它们整合了多种信息模态,包括语音、图像以及非语音音频(例如音乐):
❑这个蛋糕做好了吗?(把相机对准蛋糕)
❑我的车发出的是什么声音?(把麦克风靠近汽车引擎)
这些应用程序目前已经超越了当今商用NLU的技术水平,尽管它们可能适用于科研项目。目前,这些应用也超出了大语言模型的能力范围,因为大语言模型只能理解文本输入 。
4.要求系统集成通用与专业知识
当用户与NLU系统交互时,通常用户有想要完成的目标。在很多情况下,系统拥有用户所不具备的特定领域知识或专业知识,用户希望获取这种专业知识。但是,为系统提供大量的知识非常困难。现在有的网站接口提供简单信息,例如体育比分和天气情况。一些系统(如Wolfram Alpha)可以回答更复杂的问题,例如科学知识。
另外,回答那些需要专业知识才能解答的问题(例如医学知识)更加困难,因为这类知识的来源难以获取。此外,来源不同的信息可能存在不一致甚至矛盾的情况。当前,互联网是获取大部分知识的主要来源,也是大语言模型的主要信息来源。然而,互联网上的知识可能包含错误、不一致或不适用于特定问题,因此使用时必须谨慎。
以下是一些对于当前NLU方法来说具有挑战的例子:
❑ 回答复杂的技术问题: 对于“我无法连接到互联网”这样的问题,需要给系统提供关于互联网连接以及故障排除的详细信息。系统还必须了解实时信息,例如用户所在地区是否存在互联网中断问题。
❑ 回答需要理解人际关系的问题: “自从我和我朋友的男友约会后,我朋友就不再和我交往了。我该怎么办?”这需要系统充分理解“约会”这个概念,甚至涉及不同文化中约会的不同定义,这样系统才能对这样的问题给出一个满意的答案。
❑ 阅读一本书并告诉我是否会喜欢这本书: 系统目前难以阅读和理解整本书,因为像书籍这样的长文本包含非常复杂的信息。要回答这个问题,系统不仅需要读一本书,还需要充分了解用户的阅读喜好。
❑ 阅读一篇医学杂志论文并告诉我这篇论文的研究结果是否适用于我的病症: 回答此类问题需要系统熟知用户的健康状况和医疗记录,以及具备理解医学术语和解释医学研究结果的能力。
❑ 理解幽默: 理解幽默通常需要丰富的文化知识。例如,一个系统无法通过一些知识来理解传统笑话:“为什么鸡要过马路?为了到马路的另一边。”这个笑话之所以有趣,是因为在这个笑话中,这只鸡过马路的理由显而易见但又颇具幽默感。系统难以理解这种幽默,并且无法解释为什么这个笑话有趣。这只是众多笑话中的一个,理解这个笑话并不能帮助系统理解其他笑话。
❑ 理解修辞: 当用户说“我能吃一匹马”时并不意味着用户真想吃一匹马,只是意味着用户非常饿。系统必须能够识别这是修辞手法,因为马通常很大,没有人能一次吃掉一匹马,无论这个人有多饥饿。然而,如果用户说“我能吃一个比萨”,那么通常是字面意思而不是修辞手法,表示用户真想吃一个比萨。
❑ 理解讽刺: 如果某本书的评论中有这样一句评论:“作者是一个真正的天才”,那么评论者可能只是表面上说作者是一位不折不扣的天才,但实际上是在讽刺作者根本不是天才。如果后一句话是“我三岁的孩子可以写一本更好的书”,那么我们可以确定第一句话是有意要讽刺作者。NLU系统无法理解讽刺,系统不知道三岁孩子不可能写出好书。所以评论者说这本书比三岁孩子写的书还差,是说这本书很糟糕。
❑ 能够运用复杂的知识: 作为复杂知识的一个例子,考虑这句话“我的蛋糕就像煎饼一样扁平,出什么问题了?”要回答这个问题,系统必须理解蛋糕不应该是扁平的,而煎饼通常是扁平的。系统还必须明白用户说的是烤熟的蛋糕,因为生蛋糕通常是扁平的。一旦系统把所有这些事情都弄明白了,系统还必须充分了解烘焙过程,才能给出建议,解释蛋糕为什么是扁平的。
这些应用中的共同特点是通常没有一个后端数据源可以提供明确的答案。这意味着没有一个数据源供开发人员查询来回答这样的问题。例如,当用户提问“现在是不是买电动汽车的最佳时机?”时,与之前的天气预报例子形成了鲜明对比,因为在天气预报例子中,开发人员可以访问后端数据源获取信息,从而回答用户的问题。
因此,与其尝试使用单一的后端数据源来回答用户的问题,另一种策略是进行网络搜索。然而,熟悉网络搜索的人都知道,搜索结果可能多达数百万条(例如,“现在是不是买电动汽车的最佳时机?”的搜索结果数量有将近二十亿条),更糟糕的是,这些答案之间可能不一致。一些网页声称现在是买电动汽车的最佳时机,而其他页面声称现在不是。因此,在没有良好数据源的情况下,使用网络搜索来回答这些问题可能不会成功。然而,整合来自网络的信息是大语言模型的一个优势,所以如果网络提供了这些信息,像ChatGPT这样的大语言模型就能够利用这些信息。
5.用户意图不明确的问题
用户并不总是能够清晰地表达他们的意图。举个例子,假设一个游客正在参观一个陌生的城镇,这个城镇提供一个电话查询公共交通信息的服务。如果游客打电话问:“从万豪酒店到市场街123号应该乘坐哪趟火车?”那么系统的回答可能是:“你无法乘火车从万豪酒店到达市场街123号。”或者提供一条耗时六个小时的绕行火车路线。
人工电话客服则可以理解客户的目的是从万豪酒店到市场街123号,而火车只是客户猜测两地之间最佳的交通工具。在这种情况下,人工电话客服可能会这样回应:“这两地之间没有适合的火车路线;你是否想了解其他交通工具?”这对于人工客服来说是件很自然的事情,但对于自动语音系统来说这非常困难,因为系统需要推断用户的真正意图是什么。
6.要求系统理解多种语言
正如第1章所讨论的那样,某些语言的NLP方法比其他语言更成熟。如果系统需要与说不同语言的用户(通过语音或文本)进行交流,那么必须开发每种语言的语言模型。系统可能在处理某些语言时表现出更高的准确率,而在处理某些语言时表现得非常差。根据当前的技术水平,NLP技术能够处理欧洲的主要语言、中东使用的语言和亚洲使用的语言。
在一些应用程序中,系统必须根据用户的输入在不同语言之间进行切换。要做到这一点,系统必须能够仅通过声音或文字识别不同语言。这项技术被称为 语言识别技术 。识别常用的语言并非难事,但识别不常用的语言十分困难。
某些语言的训练数据很少,例如,使用人数少于100万的语言。该语言的研究可能还不足够好,以至于难以为该语言开发自然语言应用程序。
比理解多语言更困难的是在同一个句子中混合了两种或多种语言。人们在同一地区使用多种不同的语言,这种情况经常发生。此时,人们通常假定每个人都理解当地各种不同的语言。在同一个句子中混合使用不同的语言被称作 语码转换 。处理存在语码转换的句子比处理多语言应用中的句子更加困难,因为系统必须在句子中的任何一处为识别单词的语言做好准备。这对于当前的技术水平来说是一个挑战。
我们已经探讨了许多难度超越当今NLP技术水平的应用程序。现在,让我们转向那些过于简单的应用程序。
除了上述过于复杂的应用程序,本节考虑一些过于简单的应用程序,即可以采用比NLP方法更简单的解决方案的应用程序。这些应用程序涉及的问题难度较低,无须使用NLP技术。
自然语言的特点是输入不可预测且词到语义之间是非直接映射的。取决于语境,不同的词可以具有相同的意思,而同样的词也可以表达不同的含义。如果输入和含义之间存在简单的一对一映射关系,则不需要使用NLP技术。
1.可用正则表达式解决的问题
第一种不需要NLU方法的情况是,输入文本限定在一个有限的集合内,比如城市、州或国家。在系统内部,这些输入可以表示为一个列表,并可以通过查表的方式进行分析。虽然某些输入存在同义词(例如,UK表示United Kingdom),但是同义词也可以被添加到列表中,从而解决此问题。
一个稍微复杂但仍然可以解决的问题为,系统的输入按照某些规则组合而成。在这种情况下,也不需要NLP方法,因为输入是可预测的。一个典型的例子为电话号码,电话号码有固定的、可预测的格式。另一个典型例子为日期,虽然日期的形式更加多样化,但变化仍然有限。除了这些通用的表达式之外,在特定的应用中,通常还需要分析诸如产品ID或序列号等特定格式的表达式。这些类型的输入可以用正则表达式来识别。正则表达式是一种字符(字母、数字或特殊字符)组合的规则。例如,正则表达式^\d{5}(-\d{4})?$可以匹配美国邮政编码,其格式要么是5位数字(12345),要么是5位数字加一个连字符再加4位数字(12345-1234)。
如果应用程序中的所有输入都是这些类型的短语,那么正则表达式就足以胜任这项工作,无须使用NLP方法。如果整个问题都可以用正则表达式解决,那么就不需要NLP方法。如果只有一部分问题可以用正则表达式解决,而另一部分需要使用NLP方法解决,那么可以将正则表达式与NLP方法结合使用。例如,如果文本中包含格式化的数字(如电话号码、邮政编码或日期),那么可以使用正则表达式仅分析这些数字。Python提供了正则表达式的库,第8章和第9章将讨论NLP方法和正则表达式的联合应用。
2.源于已知词汇表的待识别的输入
如果输入仅来自一个集合,则无须使用NLP方法。例如,如果输入只是美国的一个州,那么应用程序可以直接匹配州的名称。如果输入不但包含来自一个集合的词,还包含用户添加的其他词,那该问题就变为了 关键词识别 问题。在这种情况下,希望系统给出集合中的词,而忽略不相关的词,例如美国50个州中的一个州的名称。当系统询问用户“你住在哪里?”时,系统希望用户回答“亚利桑那”,但是用户可能回答“我住在亚利桑那”。
这种情况可能不需要NLP——系统只需能够忽略不相关的单词(这个例子中的“我住在”)。可以在正则表达中使用 通配符 来忽略不相关的词。Python正则表达式使用*来匹配任意数量的字符,包括零个字符。使用+来匹配至少一个字符。因此,在“我住在亚利桑那”这句话中查找关键字“亚利桑那”的正则表达式为“*亚利桑那*”。
3.使用图形界面
大多数应用程序依赖 图形界面 。在使用图形界面时,用户通过选择菜单选项和单击按钮与应用程序交互。相比于基于NLU的接口,这些传统的图形界面接口适合许多应用场景,而且更容易构建。那么,什么时候更适合使用基于NLU的接口呢?
当需要用户提供详细信息时,NLU是一个更好的选择。在这种情况下,图形界面菜单会变得越来越复杂,用户需要不断浏览多层菜单才能找到所需信息,或者直到应用程序获取了足够的信息才能回答用户的问题。这个问题在移动设备上尤其明显,由于屏幕尺寸有限,移动设备屏幕能展示和容纳的信息远远小于笔记本电脑或台式电脑,这意味着移动设备屏幕菜单层次会变得很深。与此不同,使用NLU输入时,用户可以一次性陈述完他们的意图,而不必像使用图形界面那样在多个菜单之间进行切换。
使用图形界面的另一个问题是术语不匹配,即菜单中使用的术语可能与用户设想的术语不一样。这种不匹配会将用户引向错误的方向。用户可能已经完成了好几层菜单才意识到错误。在这种情况下,用户需要从头开始操作。
有的网站或应用程序同时包含传统图形操作界面和NLP应用程序,用户可以使用图形界面,也可以与聊天机器人聊天交互。在这种情况下,可以比较图形操作界面和NLP应用程序的使用情况。微软Word 2016就是一个很好的例子。Word是一个非常复杂的应用程序,具有丰富的功能。为一个如此复杂的应用程序制作一个图形界面非常困难,而用户通过图形界面查询所需信息更加困难。
为了解决这个问题,Word同时提供了图形界面和NLP接口。在Word文档顶部,有 开始 、 插入 、 设计 和 布局 等选项。单击这些选项中的任何一个会得到一个菜单栏,提供更多的选项,继续单击某一个选项会打开更多菜单栏。这就是图形化的方法。Word还提供了一个“ 告诉我你想要做什么 ”选项作为顶级菜单选项之一。如果选择了“ 告诉我你想做什么 ”选项,那么用户可以以文本形式输入如何在Word中完成某个任务的问题。例如,输入“如何插入一个方程”,Word将提供一个列表,列出在Word文档中插入方程的几种不同方法。这比在嵌套的菜单中查找信息更快、更直接。
当菜单深度超过三级时,开发人员应该考虑在图形应用程序中添加NLU功能,尤其是当每个菜单包含多个选项时。
到目前为止,本书已经研究了诸多决定应用程序是否应该使用NLP方法的因素。接下来将考虑与开发过程相关的因素,包括数据和开发成本。
4.数据
在确定了NLU方法是否适用于应用问题之后,需要考虑另一个问题:有哪些类型的数据可用于解决这个问题?是否有可用数据?如果没有,那么获取解决问题所需的数据会涉及哪些问题?
这里探讨两种类型数据。本节要讨论的第一种数据是训练数据,或者说是用于训练NLU系统的样本,本节将讨论训练数据的来源,训练数据是否足够,以及在NLU系统开发过程中将这些数据转换为所需格式需要多少工作量。
要讨论的第二种数据是应用数据。应用数据是系统回答用户问题所需的信息,它可以是公开可用的资源,也可以来自内部数据库。对于应用数据,应该确保数据的可用性和可靠性,而且以较低成本获取数据也非常重要。
几乎所有的NLP应用程序都是经过训练数据训练得到的,所使用的训练数据与NLP应用程序所处理的输入一致。这意味着,为了开发NLP应用,需要有足够的训练数据。如果没有足够的训练数据,那么在部署NLP应用程序时会存在无法处理输入的情况,因为系统在开发阶段没有接触到任何类似的输入。这并不意味着系统需要在训练过程中看到所有可能的输入,因为这几乎是不可能的,特别是输入是复杂或较长的文本文档,如产品评论。
不太可能多次出现一模一样的产品评论。因此,需要设计训练过程,以相同的方式分析语义相似的文档,即使不同的文档措辞有所不同。
机器学习算法(第9章和第10章中介绍的算法)需要大规模数据。需要区分的意图类别越多,需要的数据就越多。大多数实际的NLP应用需要数千个训练数据。
训练数据必须包括正确答案或训练后的系统预期给出的答案。正确答案的术语是注解(annotation)。注解也被称为 真解 (ground truth)或 黄金标准 (gold standard)。例如,如果应用程序的设计目的是判断一个产品评论是正面的还是负面的,则注解(人工提供)会为一组评论分配一个正标签或负标签,这些加了标签的评论将被用作训练数据或测试数据。
表2.2展示了一个产品评论及其注解的例子。一个准确的产品评论分类系统可能需要几千条产品评论。在某些情况下,如表2.2中的例子,标注任务(给产品评论提供注解)不需要任何特殊的专业知识;几乎任何一个能够阅读文字的人都可以标注产品评论,即判断一个产品评论是正面的还是负面的。这意味着可以通过廉价的众包方式完成简单的标注任务。
表2.2 正面和负面产品评论例子
另外,有些注解必须由本领域的专家提供。例如,在线对话解决复杂的软件故障问题,对这些对话数据的标注需要由专业人士完成。这将使数据标注非常昂贵,甚至可能在缺少专家的情况下无法完成数据标注任务:
虽然数据标注可能会面临一些困难而且成本昂贵,但并不是所有的NLU算法都需要标注数据。第12章将介绍基于未标注数据的无监督学习,以及未标注数据的局限性。
在NLP应用程序中,完整的训练样本被称为 语料库 (corpus),或 数据集 (dataset)。为了确保应用程序的准确性,足够多的训练数据至关重要。训练数据不必在项目开始时就到位,开发人员可以在数据收集尚未完成之前就开始开发,并在开发过程中不断添加数据。然而,在此过程中,如果标注者忘记了早期数据的标注标准,则可能会导致数据标注不一致。
数据的来源有多种途径。Python NLP库包含一些小规模的简单数据集,可以用于验证算法或系统的正确性与可用性,或用于学生的课程项目。此外,可以从Hugging Face(https://huggingface.co/)或Linguistic Data Consortium(https://www.ldc.upenn.edu/)等渠道获取更大的数据集。
对于企业应用程序来说,早期应用程序存储的客户数据非常有用。举例来说,电话客服的语音记录就是有价值的数据。
另一个有价值的数据来源是数据库中的文本数据,例如产品评论。在很多情况下,数据库中的文本没有标签或注解,但是一段文本往往伴随着另一段带有人工标注的文本,例如用于识别该段评论是正面评论还是负面评论。这种蕴含类别的信息实际上就是一种标签,可以在训练过程中使用,例如用来创建一个产品评论自动分类系统。
最后,还可以专门收集新的数据来支持应用程序。尽管收集数据可能耗时且昂贵,但在某些情况下这是获取数据的唯一途径。数据收集本身就是一个复杂的话题,特别是收集用于创建人机交互对话系统的数据。
第5章将会更详细地讨论数据,包括数据收集问题。
除了要考虑NLP应用程序训练时所需的数据,还必须考虑系统所提供信息的成本。
许多第三方服务网站提供API,开发人员可以访问这些API以获取免费或付费信息。某些网站提供一些公开可用API的信息,例如 APIsList (https://apislist.com/)。这个网站列出了各种各样的API,这些API提供数百个领域的数据,包括天气、社交网络、地图、政府、旅游等。然而,需要注意的是许多API需要付费,无论是以订阅形式还是以订单形式,因此在选择应用程序时要考虑这些潜在的成本。
一旦确定有可用的数据并且数据已经或可以按照所需的意图、实体和类别进行标注,则下一个需要考虑的关键因素是开发应用程序的成本。一些技术上可行的应用程序可能因为开发成本过高、风险过大或耗时过长而变得不切实际。
开发成本包括确定解决特定问题最有效的机器学习方法。这可能需要大量的时间并需要进行多次尝试,因为需要探索不同的模型和算法,在此过程中需要进行多次模型训练。确定最有前景的算法需要有经验的NLP数据科学家,然而这些专家往往供不应求。开发人员还必须评估一个问题,即开发成本是否与应用程序预计产生的回报一致。
对于小规模应用程序,还应该牢记,开发和部署NLP解决方案的成本可能会超过雇用员工执行相同任务的成本。对于某些复杂任务,即使实施了NLP解决方案并已完成部分工作,部分复杂任务仍然需要人工介入完成,相应的人力成本也会增加。
针对自然语言应用程序,特别是已经部署了的应用程序,最后要考虑的是维护成本。这一点很容易被忽视,因为NLU应用程序的一些维护不适用于大多数传统的应用程序。具体来说,一些自然语言应用程序使用的语言会随着时间的推移而变化。这是很正常的,因为这反映了用户所谈论的事情发生了变化。例如,在客户服务应用程序中,产品名称、商店位置和服务会发生变化,有时这些变化还非常迅速。相应地,用户询问自然语言系统所使用的词汇也会发生变化。这意味着系统需要添加新词,机器学习模型必须重新训练。
同样,提供快速变化信息的应用程序也需要不断更新。例如,COVID-19这个词是在2020年初出现的,以前没有人听说过这个词,但现在非常常见。由于关于COVID-19的医疗信息变化迅速,因此必须非常悉心地维护提供COVID-19信息的聊天机器人,以确保系统提供最新、准确的信息,而不会提供不正确甚至有害的信息。
为了确保应用程序与用户保持话题同步,需要为自然语言应用程序规划以下三项任务:
❑ 需要分配开发人员以确保应用程序永远保持最新。 当有新信息出现时,应该及时将新信息添加到系统中,例如新产品或新产品的类别。
❑ 定期审查用户输入日志。 针对处理不当的输入,必须仔细分析以确定适当的处理方式。用户询问的是新话题(意图)吗?如果是的话,那么就必须添加新意图。他们是否在以不同方式谈论现有的话题?如果是的话,那么需要向现有的意图中添加新的训练样本。
❑ 当出现问题或用户输入未能正确处理时,需要修改系统。 最简单的修改为添加新词汇,但在更多情况下,可能需要进行根本性的改变。例如,现有的意图需要被拆分为多个意图,这时需要处理原始意图对应的所有训练数据。
维持应用程序更新所需的开发人员数量取决于以下几个因素:
❑ 用户的数量: 如果系统每天都收到数百或数千个无法正确处理的输入,那么需要开发人员审查这些输入、更新系统,以确保系统能够正确处理这些输入。
❑ 应用程序的复杂性: 如果应用程序包含数百个意图和实体,那么将需要更多的开发人员使系统保持最新状态,并确保添加的新信息与旧信息一致。
❑ 应用程序提供信息的波动性: 如果不间断地向一个应用程序添加新词汇、增加新产品和新服务,那么需要频繁地更改系统,以确保系统保持最新。
这些都是独立于硬件或云服务之外的成本,因此需要考虑自然语言应用程序维护的总成本。
本章介绍了在开发应用程序时决定是否使用NLP方法的应该考虑的诸多因素。图2.2将这些因素总结为一个流程图,用于决定是否应该使用NLU方法开发应用程序。
图2.2 评估一个项目是否应该使用NLU方法的流程图
从最上面开始,这个过程首先会问一个问题:根据当前技术水平,这个问题是否过于复杂或过于简单?如果这个问题过于复杂或过于简单,那么应该寻找其他方法,或者重新规划应用程序所解决问题的范围,使其更适合当前的技术水平。例如,重新设计应用程序,以处理更少种类的语言。
如果问题适合当前技术水平,那么接下来的步骤是确保是否有合适的数据可用,如果没有,是否可以收集数据。一旦获得了数据,接下来要考虑的是开发和维护成本是否合理。如果一切看似良好,那么可以继续进行应用程序的开发工作。
本章讨论了如何选择适用于当前NLP技术水平的自然语言应用程序,通常是那些涉及具体问题、客观答案、训练数据可用、可以处理多种语言的应用程序。具体来说,本章解决了一些重要问题。我们学会了如何识别难度与当前NLU技术水平适当的问题。我们还学习了如何确保系统开发过程中有足够的数据可用,以及如何估计开发和维护的成本。
学习如何评估各种不同类型NLP应用程序的可行性,正如本章所讨论的,这将对NLP项目的推进非常有价值。选择一个过于雄心勃勃的应用程序将导致项目的挫败,而选择一个对于当前技术水平来说过于容易的应用程序可能会浪费时间,并且会制造一个没有必要的复杂系统。
我们已经达到我们的目标,即学习到了如何从技术的可行性、数据的可用性、系统的维护成本等实际因素来评估一个NLP项目可行性。
第3章将介绍NLP的主要方法以及每种方法的优缺点。这些方法包括基于规则的方法,即专家编写规则来指导系统如何分析系统的输入;还包括机器学习方法,即训练系统通过处理输入的许多例子来学会如何处理和分析系统的输入。