自然语言处理实战第二版(MEAP)(一)
原文:/md5/
译者:飞龙
协议:CC BY-NC-SA 4.0
第一章:读写的机器(NLP 概述) 本章内容包括
话语是有力量的。它们可以改变思想。它们也可以改变世界。自然语言处理将话语的力量置于算法之中。这些算法正在改变你的世界,就在你眼前。你将看到大多数进入你头脑的词语和想法是如何经过 NLP 过滤和生成的,以及你如何重新获得对你世界的部分控制。
想象一下,如果有一台机器能够理解并对其在互联网上阅读的每个词语采取行动,你会做什么?想象一下你将能够收获和从中获利的信息和知识。NLP 承诺通过将大量非结构化数据转化为可操作的知识和理解来创建第二次信息革命。
早期,大型科技公司发现了从自然语言文本中获取知识的 NLP 的力量。他们利用这种力量来影响我们的行为和思想,以改善他们的底线。政府也开始意识到 NLP 对文化、社会和人类的影响。幸运的是,一些勇敢的自由民主国家正试图通过引导企业走向可持续和道德的 NLP 用途来解放你的思想。
在另一端,威权政府正在利用 NLP 来利用我们的亲社会本能,使我们更容易被追踪和控制。中国政府利用 NLP 阻止你甚至在玩的视频游戏中谈论西藏或香港。这本书的作者们需要翻阅互联网档案来用永久链接替换消失的文章链接。审查公共媒体的政府和企业正在腐蚀甚至是最仔细的 NLP 工程师所使用的数据集,这些工程师仅使用高质量的在线百科全书进行培训。令人惊讶的是,即使在美国,也有一些公司、政治家和政府机构利用 NLP 影响关于大流行病、气候变化以及许多其他“21 世纪的 21 课”的公共话语。NLP 甚至被用来影响你对 AI 和 NLP 本身的看法。当然,并非所有的公司和政治家都把你的最好利益放在心上。
在这一章中,你将开始建立你对自然语言处理(NLP)的理解和技能,以便能够控制影响你所相信和思考的信息和思想。你首先需要看到现代世界中 NLP 被应用的各种方式。这一章将让你看到这些 NLP 应用在你日常生活中背后发生的情况。希望这将帮助你写几行 代码,以帮助你追踪、分类和影响在互联网上和你的大脑中弹来弹去的思想包。你对自然语言处理的理解将让你在你的世界中拥有更大的影响力和控制力。它将让你和你的业务有能力摆脱大科技公司对信息的控制,从而取得成功。
1.1 编程语言与自然语言
编程语言与自然语言如英语非常相似。两种语言都用于将指令从一个信息处理系统传递到另一个信息处理系统。两种语言都可以将思想从人类传达到人类、从人类传达到机器,甚至是从机器传达到机器。两种语言都定义了“标记”的概念,即最小的有意义文本包。无论你的文本是自然语言还是编程语言,机器首先要做的事情是将文本分割成标记。对于自然语言,标记通常是单词或一起出现的单词组合(复合词)。
自然语言和编程语言都使用语法。语法是一组规则,告诉你如何将单词组合成序列,以创建他人可以理解的表达式或语句。无论你是在计算机科学课上还是在英语语法课上,单词“表达式”和“语句”都意味着类似的东西。你可能已经听说过计算机科学中的正则表达式。它们为你提供了一种创建处理文本的语法规则的方式。在本书中,你将使用正则表达式来匹配各种文本,包括自然语言和计算机程序。
尽管编程语言和自然语言之间存在这些相似之处,但你需要新的技能和新的工具来使用机器处理自然语言。编程语言是我们用来告诉计算机要做什么的人工设计语言。计算机编程语言用于明确定义一系列对信息位进行数学操作的操作,即 1 和 0。而编程语言只需要被机器处理而不是理解。机器需要做程序员要求它做的事情。它不需要理解为什么程序是这样的。它不需要计算机程序的抽象或心理模型来理解在处理的 1 和 0 之外的任何事情。几乎所有计算机都使用 1945 年开发的冯·诺依曼体系结构。现代 CPU(中央处理器)将冯·诺依曼体系结构实现为一个寄存器机器,这是 1936 年通用图灵机思想的一个版本。
然而,自然语言是自然地、有机地演变的。自然语言在具有大脑而不是 CPU 的生物之间传达思想、理解和知识。这些自然语言必须能够在各种各样的湿件(大脑)上“运行”或理解。在某些情况下,自然语言甚至能够实现跨物种的交流。Koko(大猩猩)、(黑猩猩)、Alex(鹦鹉)和其他一些有名的动物已经证明了它们掌握了一些英语单词。据报道,Alex 鹦鹉自己发现了单词“none”的含义。Alex 对它悲伤的主人说的最后一句话是“做个好孩子,我爱你”。Alex 的这句话激发了 Ted 的杰作短篇小说《The Great 》。这是深刻的跨物种交流,不管这些词语来自于智慧和感知还是其他什么。
尽管自然语言和编程语言的演变方式有所不同,它们被用于不同的事物并不令人意外。我们不会用编程语言来互相讲述我们的一天,或者给出去杂货店的指示。同样,自然语言并没有演变成为可以被机器处理以推导结论的思维包。但这正是你将要通过这本书学会的。通过自然语言处理(NLP),你可以编写机器处理自然语言文本以推导结论、推断新事实、创建有意义的抽象,甚至在对话中进行有意义的回应。
虽然自然语言没有编译器,但有解析器和解析器生成器,比如 PEGN ^([9]) 和 SpaCy 的 类。而 SpaCy 允许您使用类似正则表达式的语法定义单词模式或语法。但是,并没有单一的算法或 包可以将自然语言文本转换为自动计算或执行的机器指令。斯蒂芬·沃尔夫勒姆( )基本上花费了他的一生来构建一个通用的智能“计算”机器,可以用普通英语与我们交互。甚至他也不得不将一个系统组装成许多不同的 NLP 和 AI 算法,必须不断扩展和发展以处理新种类的自然语言指令。^([10]) 而且,在本书的最后,您将了解到我们的开源聊天机器人框架qary.ai,它允许您插入任何您能找到或构想出的 算法。^([11])
通过这本书,您可以站在巨人的肩膀上。如果您理解了本书中的所有概念,您也将能够结合这些方法创建出非常智能的对话式聊天机器人。您甚至可以构建出比 或这个世界上接下来出现的任何租赁 AI 应用更有意义和更真实的文本理解和生成机器人。^([12]) 您比 有很大的优势,您真的关心您的用户。^([13])
自然语言处理
自然语言处理是计算机科学和人工智能(AI)中不断发展的一项实践,涉及处理诸如英语或普通话之类的自然语言。这个处理通常涉及将自然语言转换为计算机可以用来了解世界的数据(数字)。这种对世界的理解有时用于生成反映该理解的自然语言文本。
本章向您展示了您的软件如何处理自然语言以生成有用的输出。您甚至可以将您的程序视为自然语言解释器,类似于 解释器处理源代码的方式。当您开发的计算机程序处理自然语言时,它将能够对这些陈述采取行动,甚至回复它们。
与编程语言不同,每个关键字都有一个明确的解释,自然语言要模糊得多。这种自然语言的模糊性使您可以解释每个单词。因此,您可以选择机器如何响应每种情况。稍后,您将探索高级技术,其中机器可以从示例中学习,而您对这些示例的内容一无所知。
流水线
自然语言处理系统被称为“管道”,因为自然语言必须经过几个阶段的处理。自然语言文本从一端流入,根据你在管道中包含的“管”( 代码),文本或数据从另一端流出。就像一队 蛇依次将数据从一端传递到另一端。
您很快就会拥有编写可以进行有趣的类人操作的软件的能力。本书将教你如何教机器进行对话。一开始,新技术通常会给人一种魔力的感觉。但你会拉开帷幕,探索这些魔术背后的技术。您很快将发现您需要执行这些魔术的所有道具和工具。
1.1.1 自然语言理解(NLU)
NLP 的一个非常重要的部分是自动处理文本,以提取文本含义的数字表示。这是 NLP 的自然语言理解(NLU)部分。自然语言的含义的数字表示通常采用被称为嵌入的向量形式。机器可以使用嵌入来做各种有用的事情。搜索引擎使用嵌入来理解你的搜索查询的含义,然后找到包含有关该主题信息的网页。在你的收件箱中,电子邮件的嵌入向量被你的电子邮件服务用来对这些电子邮件进行分类,判断是否重要。
图 1.1 自然语言理解(NLU)
机器可以以高准确度完成许多常见的 NLU 任务:
近年来,深度学习的最新进展使得解决许多只有十年前不可能的 NLU 任务成为可能:
但是,仍然存在许多 NLU 任务,人类在其中显著优于机器。有些问题需要机器具有常识知识,学习常识事实之间的逻辑关系,并将所有这些用于围绕特定文本片段的上下文。这使得这些问题对机器来说更加困难:
你将学习 NLU 的当前最先进的方法,以及这些困难问题的可能性。你对 NLU 的幕后理解将帮助您增加您特定应用程序的 NLU 管道的有效性,即使在这些困难问题上。
1.1.2 自然语言生成(NLG)
你可能没有意识到机器也能够创作听起来像人类的文本。机器可以根据您希望传达的含义和情感的数值表示创建可读性强的文本。这是自然语言生成(NLG)在自然语言处理中的一部分。
图 1.2 自然语言生成(NLG)
你很快就会掌握许多常见的建立在自然语言理解技能基础上的自然语言生成任务。以下任务主要依赖于您使用 NLU 将自然语言编码成有意义的嵌入向量的能力。
一旦你了解如何完成这些帮助您磨练自然语言理解技能的基础任务,更高级的自然语言生成任务就会在您的掌握之中。
一旦你了解了如何总结、改写和翻译文本,你就能够将一条文本消息“翻译”成一个合适的回应。你甚至可以建议用户在他们自己的写作中包含新的文本。并且你会发现一些方法帮助你总结和生成越来越长、越来越复杂的文本。
NLG 中的最新发展尤其强大。现在,机器可以仅基于自然语言描述写出接近您意图的正确代码。机器还没有自己编程,但根据 最新(2023 年 9 月)的共识,很快可能会有这种情况。社区预测到 2026 年 9 月,我们将会有“能够编程 AI 的 AI 程序”。^([14])
自然语言理解和自然语言生成的结合将为您提供以出人意料的方式与人类交互的工具。^([15])
1.1.3 将所有内容连接起来以实现积极影响的 AI
一旦你了解了 NLG 和 NLU 的工作原理,你就能将它们组装成你自己的自然语言处理流水线,就像一个管道工。企业已经在使用这样的流水线从他们的用户中提取价值。
你也可以利用这些管道进一步实现你个人的、商业的和社交的目标。这股技术爆发是一架火箭,你可以骑上它,甚至可以在其中略为操纵。你可以利用它来管理收件箱和日记,保护你的隐私和最大化你的精神健康。或者你可以通过向同行展示理解和生成文字的机器可以提高几乎任何信息时代任务的效率和质量来发展你的职业生涯。作为一个思考你的工作对社会影响的工程师,你可以帮助非营利组织建立起提高弱势人群自然语言理解和生成能力的管道。作为一位企业家,你可以帮助创建一个再生的互利业务,孕育出全新的产业和共同繁荣的社区。
理解自然语言处理的工作原理将打开你的眼界和增强你的能力。你很快会看到机器被用于从你的言辞中挖掘利润,而你往往处于失利之中。你会看到机器如何训练你变得更容易受到操纵。这将帮助你隔离自己并可能进行反击。你很快会学会如何在充斥着操纵你的算法的世界中生存下来。你将利用自然语言处理的力量来保护你的健康,为整个社会做出贡献。
能够理解和生成自然语言的机器利用了文字的力量。因为机器现在能够理解和生成看起来与人类相似的文本,它们可以代表你行动。你可以创建机器人,自动按照你设定的目标完成任务。但是,要小心阿拉丁的三个愿望陷阱。你的机器人可能给你的商业或个人生活带来一连串的问题。因此,请谨慎确保你设置的目标吻合你的初衷^([16])。这被称为“AI 控制问题”或“AI 安全”挑战^([17])。就像古老的三个愿望问题一样,你可能发现自己试图撤销先前的愿望和机器人所造成的所有损害。
控制问题和 AI 安全不是在追求积极影响的自然语言处理过程中你将面临的唯一挑战。超级智能 AI 可能会把我们操纵成越来越强大的力量和控制,但这种威胁可能是几十年之后的事情。然而,已经有多年了,即愚蠢的人工智能会欺骗和操纵我们。搜索和推荐引擎 NLP 决定哪些帖子显示在你的屏幕上,它不是在满足你的需求,而是在满足投资者的需求,窃取你的注意力、时间和金钱。
例如,如果你使用 的搜索功能来寻找下一次圣地亚哥 用户组的聚会时间,你会发现他们提供的一切都不是你在寻找的东西。无论你之前是否注册并参加了多年的聚会,无论你给出多少信息,他们的自然语言处理始终会选择为他们带来利润的链接,而不是对你有用的链接。在 上搜索" 31 Cory "试试看。你将看到的不是他那个著名的反对平台寻租的演讲,而只会看到广告和平台所有者认为能让你着迷于广告并防止你从这个幻觉中醒来的视频。研究人员称之为"AI 伦理"挑战,而更直接的人称之为 AI 的恶化问题。
1.2 这魔术
一台能够读写自然语言的机器有什么神奇之处?自从计算机问世以来,机器一直在处理语言。但那些是计算机语言,例如 Ada、Bash 和 C,它们是为计算机理解而设计的。编程语言避免了歧义,以便计算机始终能够按照你的指令做确切的事情,即使那并不一定是你想要它们做的事情。
计算机语言只能以一种正确的方式进行解释(或编译)。使用自然语言处理,你可以用自己的语言与机器对话,而无需学习计算机术语。当软件能够处理不是为机器设计的语言时,它是一种魔术——我们过去认为只有人类才能做到的。
此外,机器可以访问大量的自然语言文本,例如维基百科,从而了解世界和人类思维。谷歌的自然语言文档索引超过了 100 百万千兆字节,[18])而这仅仅是索引而已。而且这个索引是不完整的。当前在线的实际自然语言内容的大小可能超过 1000 百亿千兆字节。[19])这大量的自然语言文本使得自然语言处理成为一个有用的工具。
注意
如今,维基百科列出了大约 700 种编程语言。 ^([20])标识出了 7000 多种自然语言。而这还不包括许多其他可以通过本书学到的技术进行处理的自然语言序列。动物的声音、手势和身体语言,以及它们细胞中的 DNA 和 RNA 序列,都可以通过自然语言处理进行处理。([21])([22])
具备处理自然事物能力的机器并不是自然的。这有点像建造一座可以利用建筑设计完成某些有用事物的建筑物。当软件能够处理不是为机器设计的语言时,它看起来是一种魔术——我们过去认为这是人类独有的能力。
目前,您只需要考虑一种自然语言-英语。您以后可以逐渐学习诸如中文之类的更难的语言。但是,您可以使用本书中学到的技术来构建能够处理任何语言的软件,即使是您不了解的语言,或是尚未被考古学家和语言学家破解的语言。我们将向您展示如何使用一种编程语言- 来编写处理和生成该语言的软件。
从头至尾都是为了编写可读性更高的语言而设计的。它还暴露了许多自己的语言处理“内脏”。这两个特点使其成为学习自然语言处理的自然选择。在企业环境中, 是构建可维护的 NLP 算法生产线的绝佳语言,一个代码库会有许多贡献者。我们甚至使用 代替了“通用语言”的数学和数学符号,无论何时都是如此。毕竟, 是一种明确表达数学算法的方式,^([23])并且它被设计成尽可能易读,适合像你一样的程序员。
1.2.1 语言与思维
语言学家和哲学家(如莫·沃尔夫和爱德华·萨皮尔)认为,词汇表影响我们的思维方式。例如,澳大利亚土著人有词汇来描述物体在其身体上的位置,基于罗盘的基本方位。他们不用右手中的回力镖,而用身体北侧的回力镖进行交流。这使他们在狩猎远征中善于沟通和定向。他们的大脑不断更新他们对世界定位的理解。
史蒂芬·平克把这个观念扭转过来,将语言视为我们的大脑和思维方式的窗口:“语言是集体人类创造的,反映了人类的本性,我们对现实的概念化方式,以及我们如何与他人相关。”^([24])无论您认为词语对思维的影响,还是认为它们有助于您看到和理解自己的思维,无论哪种方式,它们都是思维的载体。您很快将了解到 NLP 的强大之处,可以操控这些思维的载体,加深对词语… 的理解,也许还有对思维本身的理解。难怪许多企业将 NLP 和聊天机器人称为 AI - 人工智能。
数学呢?我们用精确的数学符号和编程语言以及模糊的自然语言词汇和符号来思考。我们可以用模糊的词汇来表达像数学概念、定理和证明这样的逻辑思维。但词汇并不是我们思考的唯一方式。哈佛大学的几何学家乔丹·艾伦伯格在他的新书形状中写道,他是如何在凝视一个带有 6x8 点阵的立体扬声器时首次“发现”了代数的交换律的。他已经记住了乘法表,数字的符号。他知道你可以在乘法符号的两边逆转符号的顺序。但直到他意识到他可以将这 48 个点视为 6 列 8 个点或 8 行 6 个点时,他才真正知道了。而且是同样的点!所以它必须是同样的数字。这一刻深深地触动了他,甚至比他在代数课上学到的符号操作规则还要深刻。
因此,你用词汇来与他人和自己交流思想。当瞬息万变的思想被汇集成词汇或符号时,它们就成了更容易记住和在你的大脑中处理的压缩思想包。你可能没有意识到,但当你组织句子时,你实际上是在重新思考、操纵和重新包装这些思想。你想要表达的内容和你想要分享的想法是在你说话或写作时精心制作的。这种在你的头脑中操纵思想包的行为被 AI 研究人员和神经科学家称为“符号操纵”。事实上,在 GOFAI(Good Old- AI)时代,研究人员假设 AI 需要像编译编程语言一样学习操作自然语言符号和逻辑语句。在本书中,您将在第十一章学习如何教机器在自然语言中进行符号操作。
但这并不是自然语言处理最令人印象深刻的力量。想想你曾经有过需要给亲近的人发难的邮件的时候。也许你需要向老板或老师道歉,或者可能是你的伴侣或亲密的朋友。在你开始打字之前,你可能已经开始考虑你将使用的词汇,你为自己的行为找的理由或借口。然后你想象你的老板或老师会如何看待这些词。你可能在最终开始打字之前多次多次地在脑海中回顾你要说的话。你在大脑中将思想包作为词汇来操纵。当你开始打字时,你可能会写两倍于你实际发送的单词。你精心选择你的词汇,舍弃一些词汇或想法,专注于其他词汇。
修订和编辑是一个思考过程。 它帮助你整理思绪并加以修改。 最终,你脑海中所产生的东西与最初出现在脑海中的想法完全不同。 写作的过程可以改善你的思维方式,并且随着机器在阅读和写作方面的不断改善,它也将改善机器的思维方式。
所以阅读和写作就是思考。 单词是一包包思想,你可以存储和操纵以改善这些思想。 我们使用词语将思想放入我们的头脑中的一团或一个隔间中进行玩耍。 我们将复杂的思想分解成几个句子。 我们重新安排这些思想,使它们对我们的读者或甚至我们未来的自己更有意义。 这本书的第二版中的每个句子都进行了多次编辑-有时候是在在线图书的慷慨读者的帮助下。^([25]) 我刚刚删除、重写和重新排列了这些段落好几次,这都是在朋友和像你一样的读者提供的建议和想法的帮助下进行的。^([26])
但单词和书写并不是唯一的逻辑思考和深度思考的方式。 绘画、绘图,甚至跳舞和表演都是思想的表达。 我们在脑海中形象地想象这些图画-在我们的脑海中勾勒出想法、概念和思想。 有时候你只是在现实世界中移动事物或表演事物。 但将词语组成句子,句子组成段落的过程几乎是我们一直在做的事情。
阅读和写作也是一种特殊的思考方式。 它似乎压缩了我们的思维,并使其更容易记住和管理在我们的头脑中。 一旦我们知道一个概念的完美词汇,我们就可以将其存储在脑海中。 我们不必不断地刷新它才能理解它。 我们知道一旦我们再次想到这个词,概念就会涌现出来,我们可以再次使用它。
这都是思考或有时被称为的内容。 因此,通过教会机器理解和组合文本,你在某种程度上教会了它们思考。 这就是为什么人们将自然语言处理(NLP)视为人工智能(AI)的原因。 而会话式人工智能是最广为人知和最有用的人工智能形式之一。
1.2.2 进行对话的机器
尽管你花了很多时间在头脑中将词语作为思想的一部分进行内部处理,但真正有趣的是当你用这些词语与他人进行交流时。 对话的过程将两个(或更多!)人带入你的思考中。 这可以产生一个强大的正反馈循环,强化好的想法并淘汰弱的想法。
话语对这一过程至关重要。它们是我们共同的思想词汇。当你想要触发另一个人大脑中的一种思想时,你所需要做的就是说出合适的话语,让他们理解你心中的一些思想。例如,当你感到剧痛、挫败或震惊时,你可以使用脏话。你几乎可以肯定地使你的听众或读者感到震惊和不适。这就是脏话的唯一目的——给你的听众带来震惊(和敬畏?)。
注意
还有另一个 NLP将这个想法发挥到了极致。神经语言编程()是一种假科学的心理疗法方法,声称通过使用语言来改变你的行为。由于声称能帮助人们实现他们的人生目标而能够赚钱,这种伪科学已经成为了教导(宣扬?)它的从业者们的狂热信徒的地位。^([27])
与占星术、占卜、催眠疗法、阴谋论、宗教和邪教一样,通常在其中都有一点真相的线索。话语确实影响我们的思想。而思想确实影响我们的行为。
尽管我们无法用我们的话语“编程”另一个人,但我们可以用它们来传达极其复杂的思想。当你参与对话时,你就像是集体意识、蜂巢思维中的一个神经元。不幸的是,当利润动机和无拘束的竞争成为当今的规则时,社交媒体的黄蜂巢就是结果。
自然语言不能直接转换为一组精确的数学操作。但自然语言确实包含可以提取的信息和指令。那些信息和指令可以被存储、索引、搜索,或者立即执行。其中一个动作可能是对一条陈述生成一系列文字。这就是你将要构建的“对话引擎”或聊天机器人的功能。
本书完全专注于英文文档和消息,而不是口头陈述。第七章确实让你短暂涉足了处理音频文件、摩尔斯电码。但 NLPiA 的大部分内容都集中在已经被记录下来的文字上……或者至少被记录在计算机的晶体管上。有整本书在讨论语音识别和语音转文本(STT)系统以及文本转语音(TTS)系统。有现成的开源项目可供 STT 和 TTS 使用。如果你的应用是移动应用程序,现代智能手机 SDK 提供了语音识别和语音生成 API。如果你想让你的虚拟助手存在于云端,有 包可以在任何有访问音频流权限的 Linux 服务器上完成 SST 和 TTS。
在本书中,你将专注于机器“耳朵”之间发生的事情。当你将你的“大脑”添加到开源项目中,如 Home ,^([28]) AI,^([29]) 或 OVAL Genie,^([30]) 这可以帮助你构建一个更智能的语音助手。你将理解所有大公司可能提供给你的有用的自然语言处理…假设商业语音助手希望帮助你的不仅仅是轻松清空你的钱包。
语音识别系统
如果你想要构建一个定制的语音识别或生成系统,那个任务本身就是一本完整的书;我们把它留给读者作为“练习”。它需要大量高质量的标记数据,带有它们的音素拼写的语音录音,以及与音频文件对齐的自然语言转录。你在这本书中学到的一些算法可能会有所帮助,但大多数算法都是非常不同的。^([31])
1.2.3 数学
处理自然语言以提取有用信息可能很困难。这需要繁琐的统计记录,但这正是机器的用武之地。像许多其他技术问题一样,一旦你知道答案,解决它就容易多了。机器仍然不能像人类那样准确可靠地执行大多数实际的自然语言处理任务,例如对话和阅读理解。因此,你可能能够微调你在本书中学到的算法,以更好地完成一些自然语言处理任务。
然而,你将学到的技术足以创建出能在某些令人惊讶的微妙任务中超越人类的机器。例如,你可能没有想到在孤立的 消息中识别讽刺可以由机器比人类更准确地完成。经过训练的人类评委无法匹配简单的讽刺检测自然语言处理算法的性能(68%的准确率)。简单的词袋(BOW)模型实现了 63%的准确率,而最先进的转换器模型实现了 81%的准确率。^([33]) 不用担心,人类仍然更擅长在进行中的对话中识别幽默和讽刺,因为我们能够保持关于陈述背景的信息。然而,机器在保持上下文方面越来越好。本书将帮助你将上下文(元数据)纳入你的自然语言处理流水线,如果你想尝试提高技术水平。
一旦您从自然语言中提取出结构化的数值数据或向量,您就可以利用数学和机器学习的所有工具。我们使用与将三维对象投影到二维计算机屏幕相同的线性代数技巧,这是计算机和制图员在自然语言处理成为自己的一部分之前就在做的事情。这些突破性的思想开辟了一个“语义”分析的世界,使计算机能够解释和存储陈述的“意义”,而不仅仅是单词或字符的计数。语义分析以及统计学可以帮助解决自然语言的歧义性,即单词或短语经常具有多种含义或解释。
因此,提取信息与构建编程语言编译器完全不同(对你来说幸运)。最有前途的技术绕过了常规语法(模式)或形式语言的严格规则。您可以依赖单词之间的统计关系,而不是深层的逻辑规则系统。想象一下,如果您必须在 if…then 语句的嵌套树中定义英语语法和拼写规则。您能写出足够处理单词、字母和标点组合成陈述的每种可能方式的规则吗?您是否会开始捕捉英语陈述的语义,意思?即使对于某些类型的陈述而言,这可能是有用的,想象一下这种软件会多么有限和脆弱。未预料到的拼写或标点将打破或使您的算法困惑。
自然语言有一个更难解决的额外的“解码”挑战。自然语言的说话者和写作者假设是一个人在进行处理(听或读),而不是一台机器。因此,当我说“早上好”时,我假设你对组成早上的东西有一些了解,包括早上在中午、下午和晚上之前,但它也在午夜之后。您需要知道早晨既可以代表一天中的时间,也可以代表一段时间。解释器被认为知道“早上好”是一个常见的问候语,而且它几乎不包含关于早上的任何信息。相反,它反映了说话者的心态以及她与他人交谈的准备情况。
这种关于语言人类处理器的心理理论被证明是一个强大的假设。如果我们假设“处理器”可以访问关于世界的常识知识的一生,那么我们可以用很少的词语说很多话。这种压缩程度对于机器来说仍然是难以实现的。在 NLP 流水线中没有明确的“心理理论”你可以指出。然而,我们将在后面的章节中向您展示一些技术,以帮助机器构建常识知识的本体论或知识库,以帮助解释依赖于这些知识的陈述。
1.3 应用
自然语言处理无处不在。它是如此普遍,以至于你每小时与几个自然语言处理算法进行交互都会很困难。这里的一些示例可能会让你感到惊讶。
图 1.3 自然语言处理应用的图表
此网络图的核心是 NLP 的 NLU 和 NLG 方面。从 NLU 中心节点分支出的是基础应用程序,如情感分析和搜索。这些最终与基础 NLG 工具(如拼写纠正器和自动代码生成器)连接起来,创建对话人工智能甚至配对编程助手。
如果搜索引擎以考虑自然语言文本含义的方式索引网页或文档存档,它可以提供更有意义的结果。自动补全使用自然语言处理来完成你的思想,并且在搜索引擎和手机键盘中很常见。许多文字处理器、浏览器插件和文本编辑器都具有拼写纠正器、语法检查器、索引制作器,以及最近出现的风格指导。一些对话引擎(聊天机器人)使用自然语言搜索来找到对话伙伴消息的响应。
生成文本的自然语言处理流水线不仅可用于在聊天机器人和虚拟助手中编写简短的回复,还可用于组装更长的文本段落。美联社使用 NLP “机器记者” 编写整篇金融新闻文章和体育赛事报道。^([35]) 机器人可以编写听起来很像你本地天气预报员可能说的天气预报,也许是因为人类气象学家使用具有 NLP 功能的文字处理器起草脚本。
越来越多的企业正在使用自然语言处理(NLP)来自动化其业务流程。这可以提高团队的生产率和工作满意度,以及产品的质量。例如,聊天机器人可以自动响应许多客户服务请求。^([36])
NLP 流程,像所有算法一样,会犯错误,并且在许多方面几乎总是存在偏见。因此,如果你使用 NLP 来自动化与人类的沟通,请谨慎行事。在 AI,我们使用 NLP 来帮助我们找到加入我们团队的开发人员的重要工作,所以我们非常谨慎。我们使用 NLP 来帮助我们筛选出只有在应聘者没有反应或似乎不理解申请表上的几个问题时才会考虑的工作申请。我们对 NLP 流程进行了严格的质量控制,定期随机抽样模型预测。我们使用简单的模型和样本高效的 NLP 模型^([37]) , 以便将人类的注意力集中在机器学习最不自信的预测上 - 请参见 Learn 分类器的方法。因此,人力资源(HR)方面的 NLP 实际上花费了我们更多的时间和注意力,并没有为我们节省金钱。但是它确实帮助我们在寻找候选人时扩大了网络范围。我们收到了来自全球各地的数百份初级开发人员职位申请,包括乌克兰,非洲,亚洲和南美洲的申请人。NLP 帮助我们在面试和付费任务之前快速评估英语和技术能力。
垃圾邮件过滤器在垃圾邮件过滤器和垃圾邮件生成器之间的“猫鼠游戏”中保持了优势,但可能在社交网络等其他环境中失去了优势。据估计,关于 2016 年美国总统选举的推文中有 20%是由聊天机器人编写的。^([38]) 这些机器人利用资源和动机放大其所有者和开发人员的观点,以影响公众舆论。而这些“傀儡大师”往往是外国政府或大型企业。
NLP 系统不仅仅可以生成短的社交网络帖子。NLP 可以用于撰写长篇电影和产品在在线商店网站和其他地方的评论。许多评论都是由尚未亲眼目睹电影院或购买所评估产品的自主 NLP 流程生成的。而且不仅仅是电影,冒充前的大部分产品评论在搜索引擎和在线零售商上都是虚假的。你可以使用 NLP 帮助搜索引擎和亲社交媒体社区()^([39]) ^([40]) 检测和删除误导性或虚假的帖子和评论。^([41])
Slack、IRC 甚至客户服务网站上都有聊天机器人——聊天机器人必须处理不明确的命令或问题。而伴有语音识别和生成系统的聊天机器人甚至可以处理具有无限目标或“目标函数”的长谈,如在当地餐厅预定位置。^([42]) NLP 系统可以为公司接听电话,这些公司希望有更好的电话接待,但不想支付人工帮助顾客的费用。
警告
无论何时,你或你的上司决定欺骗用户时,都要考虑道德影响。在谷歌 IO 展示中,通过 ,工程师和经理忽视了教导聊天机器人欺骗人类的道德问题。在大多数“娱乐”社交网络中,机器人不需要透露自己的身份。我们在 、、 甚至约会应用程序上毫不知情地与这些机器人互动。现在,机器人和深度伪造如此逼真地欺骗我们,AI 控制问题^([43])。尤瓦尔·赫拉利提出的对“Homo Deus”的慎重预测^([44])可能比我们想象的来得更快。
存在可以作为企业电子邮件“接待员”或经理助理的 NLP 系统。这些助手可以安排会议并在电子名片盒或 CRM(客户关系管理系统)中记录摘要信息,代表他们的上司通过电子邮件与其他人交互。一些公司将他们的品牌和形象交给 NLP 系统,允许机器人执行营销和信息传递活动。而一些缺乏经验的 NLP 教科书作者甚至让机器人在他们的书中撰写几句话。稍后会有更多相关内容。
NLP 最令人惊讶和强大的应用在于心理学。如果你认为聊天机器人永远无法取代你的治疗师,那么你可能会对最近的进展感到惊讶。商业虚拟伴侣(如中国的小冰和美国的 .AI)在 2020 年和 2021 年的 Covid-19 封锁期间帮助数百万的孤独者度过了社交隔离的情感影响。([46])幸运的是,你不必依靠大型公司的工程师来考虑你的最佳利益。许多心理治疗和认知助手技术是完全免费和开放源代码的。([47])
1.3.1 使用 NLP 处理编程语言
现代深度学习 NLP 管道已被证明非常强大而灵活,能够准确地理解和生成编程语言。基于规则的 NLP 编译器和生成器对于像自动完成和提供片段建议这样的简单任务非常有帮助。用户通常可以使用信息检索系统,或者搜索引擎,来查找代码片段以完成他们的软件开发项目。
这些工具刚刚变得更加智能化。以往的代码生成工具是抽取式的。抽取式文本生成算法会在历史记录中找到最相关的文本,然后将其原封不动地作为建议呈现给你。因此,如果术语“亲社会人工智能”在算法训练的文本中频繁出现,自动补全将建议在“亲社会”后面跟上“人工智能”,而不仅仅是“智能”两个字。你可以想象一下,这可能会开始影响你的输入和思维方式。
近来,变压器进一步推动了自然语言处理技术的发展,采用了庞大的深度学习网络,这些网络更具抽象性,能够生成您以前没有见过或输入过的新文本。例如,GPT-3 的 1750 亿参数版本是在整个 上进行训练的,以创建一个名为 Codex 的模型。Codex 是 的 插件的一部分。它会建议完整的函数和类定义,您只需提供一个简短的注释和函数定义的第一行即可。以下是 主页上显示的 提示的示例:
// Determine whether the sentiment of text is positive
// Use a web service
async function isPositive(text: string): Promise<boolean> {
在演示动画中, 然后生成了所需的其余 代码,以创建一个估算文本主体情感的工作函数。再思考一下这一点。微软的算法正在为您编写代码,以分析自然语言文本的情感,例如您可能在电子邮件或个人论文中编写的文本。而在 主页上显示的示例都偏向于微软的产品和服务。这意味着您最终将获得一个带有微软视角的 NLP 管道,它重视微软告诉它要重视的事物。就像 间接影响您编写的代码的方式一样,现在微软的算法直接为您编写代码。
由于您正在阅读这本书,您可能计划构建一些非常酷的 NLP 管道。您甚至可能构建一个管道,帮助您撰写博客文章、聊天机器人和核心 NLP 算法。这可能会产生一种正反馈循环,改变像您这样的工程师构建和部署的 NLP 管道和模型的类型。因此,请注意您用来帮助编码和思考的元工具。这些工具对您的代码方向和生活方向具有巨大的影响力。
1.4 通过计算机的“眼睛”看语言
当你输入"早上好,罗莎"时,计算机只看到"01 …"。你如何编写一个聊天机器人来智能地响应这个二进制流?能否编写一个嵌套的条件树(if… else…"语句)来检查每一个比特并根据它们单独进行操作?这相当于编写一种特殊类型的程序,称为有限状态机(FSM)。一个 FSM 在运行时输出新符号序列的,像 的 str. 函数一样,被称为有限状态转换器(FST)。你可能甚至不知道自己已经构建了一个 FSM。你写过正则表达式吗?那就是我们在下一节中使用的 FSM 类型,来展示一种可能的自然语言处理方法:基于模式的方法。
如果你决定在记忆库(数据库)中搜索完全相同的比特、字符或单词串,并使用其他人类和作者在过去对该语句使用的响应之一呢?但想象一下如果语句中有一个拼写错误或变体。我们的机器人就会偏离轨道。而且比特不是连续的或宽容的——它们要么匹配,要么不匹配。没有明显的方法来找出两个比特流之间的相似性,考虑到它们所表示的含义。"好"的比特将和"坏!"一样相似,就像它们和"好"一样。
但在我们展示更好的方法之前,让我们看看这种方法如何运作。让我们构建一个小的正则表达式来识别像"早上好,罗莎"这样的问候语,并做出恰当的回应——我们的第一个微型聊天机器人!
1.4.1 锁定语言
令人惊讶的是,这个普通的组合锁实际上是一个简单的语言处理机器。所以,如果你对机械有兴趣,这一节可能会很有启发性。但如果你不需要机械类比来帮助你理解算法和正则表达式的工作原理,那么你可以跳过这一节。
完成了这一节之后,你再也不会以相同的方式看待你的组合自行车锁了。组合锁当然不能阅读和理解储存在学校储物柜内的教科书,但它可以理解锁定语言。它可以理解当你试图"告诉"它一个"密码"时的情况:一个组合。一个挂锁的组合是任何与锁定语言的"语法"(模式)匹配的符号序列。更重要的是,挂锁可以判断一个锁定语句是否匹配一个特别有意义的语句,这是唯一正确的"响应",以释放扣住 U 形锁钩的卡槽,这样你就可以打开你的储物柜了。
这种锁定语言(正则表达式)是一种特别简单的语言。但它并不简单到不能在聊天机器人中使用。我们可以用它来识别一个关键短语或命令,以解锁特定的动作或行为。
例如,我们希望我们的聊天机器人能够识别问候语,如"你好 Rosa",并适当地对其进行回应。这种语言,就像锁的语言一样,是一种形式语言,因为它对可接受语句的组成和解释有严格的规则。如果你曾经写过数学方程或编写过编程语言表达式,那么你就写过一条形式语言语句。
形式语言是自然语言的一个子集。许多自然语言语句可以使用形式语言文法(如正则表达式或正则文法)进行匹配或生成。这就是为什么要从机械的、“click, whirr”^([49])的锁语言转向的原因。
1.4.2 正则表达式
正则表达式使用一种特殊的形式语言文法类别,称为正则文法。正则文法具有可预测、可证明的行为,同时又足够灵活,可以为市面上一些最复杂的对话引擎和聊天机器人提供动力。亚马逊 Alexa 和 Now 主要依赖于基于模式的引擎,这些引擎依赖于正则文法。复杂的正则文法规则通常可以在一行代码中表达为正则表达式。在 中有一些成功的聊天机器人框架,如Will, ([50])和`qary`([51]),完全依赖这种语言处理来生成一些有效的聊天机器人。
注意
在 中实现的正则表达式以及在 Posix(Unix)应用程序(如grep)中使用的正则表达式并不是真正的正则文法。它们具有语言和逻辑特征,例如前瞻和后顾,这使得在正则文法中不允许的逻辑跳跃和递归成为可能。因此,正则表达式不能被证明是终止的;它们有时会"崩溃"或无限运行。^([52])
你可能会对自己说,"我听说过正则表达式。我使用grep。但那只是用于搜索!"你是对的。正则表达式的确主要用于搜索,用于序列匹配。但是,任何可以在文本中查找匹配项的内容也非常适用于进行对话。一些聊天机器人使用"搜索"来查找它们知道如何回应的用户语句中的字符序列。然后,这些识别的序列触发与该特定正则表达式匹配的脚本化响应。同样的正则表达式也可以用于从语句中提取有用的信息。聊天机器人可以将这些信息添加到关于用户或用户所描述的世界的知识库中。
处理这种语言的机器可以被认为是一种形式化的数学对象,称为有限状态机或确定性有限自动机(DFA)。有限状态机在本书中不断出现。因此,您最终会对它们的用途有所了解,而无需深入研究有限状态机理论和数学。对于那些无法抗拒想要了解这些计算机科学工具更多细节的人,图 1.1 显示了有限状态机如何适应自动机(机器人)的嵌套世界。随后的附注解释了有关形式语言的一些更详细的形式化细节。
图 1.4 自动机的种类
形式语言的正式数学解释
Kyle 这样描述编程语言:
自然语言是:
1.5 一个简单的聊天机器人
让我们快速建立一个简单而粗糙的聊天机器人。它不会很强大,并且需要大量思考英语。您还必须硬编码正则表达式以匹配人们可能尝试说的方式。但是,如果您认为您自己无法编写此 代码,也不要担心。您不必尝试考虑人们可能说的所有不同方式,就像我们在这个示例中所做的那样。您甚至不必编写正则表达式()来构建一个令人敬畏的聊天机器人。我们将向您展示如何在以后的章节中构建自己的聊天机器人而不需要硬编码任何内容。现代聊天机器人可以通过阅读(处理)大量的英文文本来学习。我们将在后面的章节中向您展示如何做到这一点。
这种模式匹配聊天机器人是一个严格受控的聊天机器人的例子。在现代机器学习聊天机器人技术发展之前,模式匹配聊天机器人很常见。我们在这里向您展示的模式匹配方法的变体也在像亚马逊 Alexa 和其他虚拟助手中使用。
现在让我们构建一个 FSM,一个正则表达式,它可以说锁定语言(正则语言)。我们可以编程它理解锁定语言的语句,比如"01-02-03." 更好的是,我们希望它能理解问候语,比如"open "或"hello Rosa"。
一个亲社会的聊天机器人的重要特征是能够回应问候。在高中,老师们经常因为我忽略了像这样的问候而急着上课而责备我不礼貌。我们当然不希望我们的仁慈聊天机器人也是这样。
对于两台机器之间的通信,你会定义一个类似于ACK(确认)信号的握手来确认每条消息的接收。但我们的机器将要与说出“早上好,罗莎”之类的人类进行交互。我们不希望它在对话或网络浏览会话开始时发送一堆啾啾声、哔哔声或ACK消息,就像在同步调制解调器或 HTTP 连接时一样。
人类的问候和握手有点更加非正式和灵活。因此,识别问候意图不会像构建机器握手那样简单。你会希望在你的工具箱中有几种不同的方法。
注意
意图是用户对 NLP 系统或聊天机器人可能有的意图的类别。诸如“你好”和“嗨”之类的词可能会被归类为问候意图,用于用户想要开始对话。另一个意图可能是执行某项任务或命令,例如“翻译”命令或查询“我该如何用乌克兰语说‘你好’”。你将在本书中学习意图识别,并在第十二章的聊天机器人中将其用于实践。
1.6 基于关键词的问候识别
你的第一个聊天机器人将直接来自 80 年代。想象一下你想要一个聊天机器人来帮你选择要玩的游戏,比如国际象棋……或者是热核战争。但首先,你的聊天机器人必须弄清楚你是不是福尔肯教授或贝林格将军,或者是其他了解自己在做什么的用户。它只能识别出几种问候。但这种方法可以扩展到帮助你在本章早些提到的类似项目中实现简单的基于关键词的意图识别器。
列表 1.1 使用str.split进行关键词检测
>>> greetings = "Hi Hello Greetings".split()
>>> user_statement = "Hello Joshua"
>>> user_token_sequence = user_statement.split()
>>> user_token_sequence
['Hello', 'Joshua']
>>> if user_token_sequence[0] in greetings:
... bot_reply = "Themonucluear War is a strange game. " # #1
... bot_reply += "The only winning move is NOT TO PLAY."
>>> else:
... bot_reply = "Would you like to play a nice game of chess?"
>>> bot_reply
'Themonucluear War is a strange game. The only winning move is NOT TO PLAY.'
这个简单的自然语言处理(NLP)流水线(程序)只有两个意图类别:“问候”和“未知”(else)。它使用了一个非常简单的算法叫做关键词检测。像这样识别用户意图的聊天机器人具有类似于现代命令行应用程序或 90 年代的电话树的功能。
基于规则的聊天机器人可以比这个简单程序更有趣、更灵活。开发者在构建和与聊天机器人交互时非常开心,他们甚至会构建聊天机器人来使部署和监视服务器变得非常有趣。,或者使用聊天机器人的 ,在大多数软件开发团队中变得流行起来。你可以构建一个类似于这样的聊天机器人,通过在else之前添加elif语句来识别更多意图。或者你可以超越基于关键词的自然语言处理,开始考虑使用正则表达式来改进它。
1.6.1 基于模式的意图识别
基于关键词的聊天机器人可以识别"Hi"、“Hello"和"”,但它无法识别"Hi"的更加兴奋的表达形式,如"Hiiii"或""。也许你可以硬编码前 200 个版本的"Hi",如["Hi", "Hii", "Hiii", …]。或者你可以动态创建这样的关键词列表。或者你可以省去很多麻烦,使用正则表达式让你的机器人处理几乎无限变化的"Hi"。正则表达式的模式可以比任何硬编码的规则或关键词列表更可靠地匹配文本。
正则表达式可以识别任何字符或符号的模式。^([58])通过基于关键词的 NLP,你和你的用户需要以完全相同的方式拼写关键词和命令,以便机器能够正确地响应。所以你的关键词问候识别器会错过像"Hey"或者"hi"这样的问候,因为这些字符串不在你的问候词列表中。如果你的"用户"使用以标点符号开头或结尾的问候语,例如"'sup"或"Hi,",你可以对你的问候语和用户的陈述都使用str.split()方法来进行大小写转换。你还可以将更多的问候语添加到你的问候词列表中。你甚至可以添加拼写错误和打字错误,以确保它们不会被忽略。但这要将大量数据手动"硬编码"到你的 NLP 流程中。
你很快就会学会如何使用机器学习来进行更多数据驱动和自动化的 NLP 流程。而当你进入第七章及以后更复杂和准确的深度学习模型时,你会发现现代 NLP 流程仍然存在很多的"脆弱性"。罗宾·贾的论文解释了如何衡量和改善 NLP 的鲁棒性(/-])。但现在,你需要了解基础知识。当你的用户想要使用精确的字符模式指定操作,类似于编程语言命令时,正则表达式就会发挥作用。
>>> import re # #1
>>> r = "(hi|hello|hey)[ ,:.!]*([a-z]*)" # #2
>>> re.match(r, 'Hello Rosa', flags=re.IGNORECASE) # #3
<re.Match object; span=(0, 10), match='Hello Rosa'>
>>> re.match(r, "hi ho, hi ho, it's off to work ...", flags=re.IGNORECASE)
<re.Match object; span=(0, 5), match='hi ho'>
>>> re.match(r, "hey, what's up", flags=re.IGNORECASE)
<re.Match object; span=(0, 9), match='hey, what'>
在正则表达式中,你可以使用方括号指定一个字符类。你可以使用短横线(-)表示一个字符范围,而不必逐个输入每个字符。所以正则表达式"[a-z]"将匹配任何一个小写字母,从"a"到"z"。在字符类后面加上星号(“*”)表示如果连续的字符都在这个字符类中,正则表达式将匹配任意数量的连续字符。
我们可以让我们的正则表达式更加详细,以尝试匹配更多的问候语。
>>> r = r"[^a-z]*([y]o|[h']?ello|ok|hey|(good[ ])(morn[gin']{0,3}|"
>>> r += r"afternoon|even[gin']{0,3}))[\s,;:]{1,3}([a-z]{1,20})"
>>> re_greeting = re.compile(r, flags=re.IGNORECASE) # #1
>>> re_greeting.match('Hello Rosa')
<re.Match object; span=(0, 10), match='Hello Rosa'>
>>> re_greeting.match('Hello Rosa').groups()
('Hello', None, None, 'Rosa')
>>> re_greeting.match("Good morning Rosa")
<re.Match object; span=(0, 17), match="Good morning Rosa">
>>> re_greeting.match("Good Manning Rosa") # #2
>>> re_greeting.match('Good evening Rosa Parks').groups() # #3
('Good evening', 'Good ', 'evening', 'Rosa')
>>> re_greeting.match("Good Morn'n Rosa")
<re.Match object; span=(0, 16), match="Good Morn'n Rosa">
>>> re_greeting.match("yo Rosa")
<re.Match object; span=(0, 7), match='yo Rosa'>
小贴士
在引号符号(r')之前的 “r” 表示引用的字符串文字是原始字符串。 “r” 并不意味着正则表达式。 的原始字符串只是使在正则表达式中用于转义特殊符号的反斜杠更容易。告诉 字符串是 “原始” 的意思是 将跳过处理反斜杠并将其传递给正则表达式解析器(re 包)。否则,您将不得不使用双反斜杠 ('\\') 转义正则表达式中的每个反斜杠。因此,空格匹配符号 '\s' 将变为 '\\s',而像文字大括号之类的特殊