自然语言处理实战第二版(MEAP)(一)(1)

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 自然语言处理实战第二版(MEAP)(一)

1.7 超空间的简要概述

在第三章中,你将学习如何将单词合并到较少数量的向量维度中来处理维度灾难。你甚至可以通过使用所有这些维度来识别你希望你的自然语言理解流水线理解的微妙事物,将这种诅咒变成一种祝福。你可以将向量投影到彼此上,以确定每对之间的距离。这给你一个合理的估计,表明它们之间的含义相似性,而不仅仅是它们的统计词语使用。当你以这种方式计算向量距离时,它被称为余弦距离度量。你将在第三章首先使用余弦距离,然后在第四章中发现它的真正威力,当你能够将主题向量的成千上万个维度减少到只有几个时。你甚至可以将这些向量投影("嵌入"是更精确的术语)到二维平面上,以便在图表和图表中"查看"它们。这是发现高维数据中的模式和集群的最佳方法之一。然后,你可以教会计算机识别并根据产生这些向量的单词的潜在含义以反映这些模式的方式进行操作。

想象一下人类可能写的所有可能的推文、消息或句子。尽管我们经常重复自己,但仍然有很多可能性。当这些标记被视为单独的、不同的维度时,"早上好,霍布斯"和"早上好,汉尼斯"这样的概念就没有共享的含义。我们需要创建一些消息的降维向量空间模型,以便我们可以用一组连续(浮点)值来标记它们。我们可以为主题和情绪等品质评估消息和单词。我们可以提出以下问题:

  • 这条消息可能是问题吗?
  • 它有多少关于一个人的内容?
  • 它有多少关于我自己的内容?
  • 它听起来有多生气或快乐?
  • 这是我需要回应的事情吗?

想想我们可以给语句的所有评级。我们可以将这些评级按顺序排列,并为每个语句"计算"它们,以编制每个语句的"向量"。我们可以给一组语句赋予一系列评级或维度,这个维度列表应该比可能的语句数量要小得多,并且意思相同的语句应该在所有我们的问题上有类似的值。

这些评级向量变成了机器可以被编程反应的东西。我们可以通过将语句聚集(聚类)在一起,使它们在某些维度上紧密地排列在一起,而在其他维度上则不紧密,进一步简化和概括向量。

但是计算机如何为这些向量维度分配值呢?如果我们将向量维度的问题简化为诸如“它是否包含单词’good’?它是否包含单词’morning’?”等等。你可以看到,我们可能能够提出数百万个问题,导致计算机可以对短语进行数字值分配。这是第一个实用的向量空间模型,称为位向量语言模型,或者“一热编码”向量的总和。你可以看到为什么计算机现在才足够强大,能够理解自然语言。人类可能生成的数百万个百万维向量在 80 年代的超级计算机上简直是“无法计算!”,但在 21 世纪的普通笔记本电脑上却没有问题。自然语言处理变得实用的不仅仅是原始硬件性能和容量;增量、恒定 RAM、线性代数算法是最后一块拼图,使机器能够破译自然语言的密码。

在聊天机器人中可以使用一个更简单但更大的表示法。如果我们的向量维度完全描述了字符序列,会怎么样呢?每个字符的向量将包含关于字母表中每个字母和标点符号的二进制(是/否)问题的答案:

“第一个字母是’A’吗?”

“第一个字母是’B’吗?”

“第一个字母是’z’吗?”

接下来的向量将回答关于序列中下一个字母相同无聊的问题。

“第二个字母是’A’吗?”

“第二个字母是’B’吗?”

尽管这个向量序列中有许多“不”回答或零,但它确实比所有其他可能的文本表示具有一个优势——它保留了原始文本中包含的每一个细节,每一点信息,包括字符和单词的顺序。这就像钢琴手风琴的纸张表示,每次只演奏一个音符。这个自然语言机械演奏的“音符”是 26 个大写和小写字母以及钢琴必须知道如何“演奏”的任何标点符号。与真正的钢琴乐曲相比,纸卷不必比真实的钢琴乐曲宽得多,一首长钢琴曲中的音符数量不会超过一个小型文档中的字符数。

但这种一热字符序列编码表示主要用于记录并重播精确的片段,而不是编写新东西或提取片段的本质。我们不能轻易地将一首歌的钢琴卷轴与另一首歌的卷轴进行比较。而且,这种表示比文档的原始 ASCII 编码表示更长。可能的文档表示数量仅仅因为要保留关于每个字符序列的信息而激增。我们保留了字符和单词的顺序,但扩展了我们 NLP 问题的维度。

在这个基于字符的向量世界中,文档的这些表示无法很好地聚类在一起。俄国数学家弗拉基米尔·莱文斯坦提出了一种快速找到这个世界中向量(字符串)相似性的聪明方法。莱文斯坦的算法使得仅凭这种简单的机械语言视图就能创造出一些令人惊讶有趣和有用的聊天机器人成为可能。但当我们找到如何将这些更高维空间压缩/嵌入到模糊含义或主题向量较低维空间时,真正的魔法发生了。当我们在第四章谈论潜在语义索引和潜在狄利克雷分配时,我们就可以窥探这个魔法帷幕背后,这两种技术可以创建更加密集和有意义的语句和文档的向量表示。

1.8 词序和语法

单词的顺序很重要。那些规定一个序列中(比如句子)单词顺序的规则称为语言的语法。这是我们在早期例子中的词袋或词向量抛弃的东西。幸运的是,在大多数短语和甚至许多完整句子中,这种词向量近似都还可以。如果你只想编码一个简短句子的一般意义和情感,单词顺序并不是那么重要。看看我们“早上好 Rosa”的所有这些排列。

>>> from itertools import permutations
>>> ["  ".join(combo) for combo in\
...     permutations("Good morning Rosa!".split(), 3)]
['Good morning Rosa!',
 'Good Rosa! morning',
 'morning Good Rosa!',
 'morning Rosa! Good',
 'Rosa! Good morning',
 'Rosa! morning Good']

现在,如果你试图单独解释每个字符串(而不看其他字符串),你可能会得出它们可能具有相似意图或含义的结论。你甚至可能注意到“Good”一词的大写,并将该词放在脑海中短语的前面。但你可能也会认为“Good Rosa”是某种专有名词,比如餐馆或花店的名字。尽管如此,在 Bletchley Park 的聪明聊天机器人或聪明的 1940 年代女性很可能对这六种排列中的任何一种做出相同的无害问候,“早上好我亲爱的将军。”

让我们试试(在我们头脑中)在一个更长、更复杂的短语上,一个逻辑陈述,在其中单词的顺序非常重要:

>>> s = """Find textbooks with titles containing 'NLP',  ... or 'natural' and 'language', or  ... 'computational' and 'linguistics'."""
>>> len(set(s.split()))
12
>>> import numpy as np
>>> np.arange(1, 12 + 1).prod()  # factorial(12) = arange(1, 13).prod()
479001600

在我们简单的问候语中,排列的数量从factorial(3) == 6激增到了我们更长的陈述中的factorial(12) == 479001600!而且很明显,单词的顺序包含的逻辑对任何希望以正确回应的机器来说都很重要。即使常见的问候通常不会因词袋处理而混淆,但更复杂的陈述在被丢入词袋时会失去大部分含义。词袋不是处理数据库查询的最佳方式,比如前面示例中的自然语言查询。

无论一句话是用 SQL 等正式编程语言编写,还是用英语等非正式自然语言编写,当一句话意图传达事物之间的逻辑关系时,词序和语法都很重要。这就是为什么计算机语言依赖严格的语法和句法规则解析器。幸运的是,最近自然语言句法树解析器的进展使得从自然语言中提取句法和逻辑关系成为可能,而且准确率非常高(大于 90%)。^([63])在后面的章节中,我们将向您展示如何使用SyntaxNet(Parsey McParseface)和SpaCy等包来识别这些关系。

就像在 Bletchley Park 示例中的问候一样,即使一句话不依赖词序进行逻辑解释,有时候注意词序也可以揭示出微妙的含义暗示,这可能有助于更深入的响应。这些自然语言处理的更深层次在下一节中讨论。第二章向您展示了一个技巧,可以将一些由词序传达的信息纳入我们的词向量表示中。它还向您展示了如何改进在前面的示例中使用的粗糙的标记器(str.split())以更准确地将单词划分到更合适的槽中,以便像"good"和"Good"被分配到相同的槽,而像"rosa"和"Rosa"这样的标记可以被分配到单独的槽,但不包括"Rosa!"。

1.9 聊天机器人自然语言流水线

构建对话引擎或聊天机器人所需的自然语言处理流水线与《Taming Text》(Manning,2013)中描述的构建问答系统所需的流水线相似。^([64])然而,五个子系统块中列出的一些算法可能对您来说是新的。我们将帮助您使用 Python 实现这些算法,以完成对大多数应用程序都至关重要的各种自然语言处理任务,包括聊天机器人。

图 1.7 聊天机器人循环(递归)流水线


聊天机器人需要四种处理方式以及一个数据库来维护过去的语句和响应的记忆。这四个处理阶段中的每一个都可以包含一个或多个并行或串行工作的处理算法(见图 1.4)。

  1. 解析 — 从自然语言文本中提取特征、结构化的数字数据。
  2. 分析 — 通过为情感、语法、语义打分来生成和组合特征。
  3. 生成 — 使用模板、搜索或语言模型组合可能的响应。
  4. 执行 — 根据对话历史和目标计划语句,并选择下一个响应。

这四个阶段中的每一个都可以使用相应方框中列出的一个或多个算法来实现。我们将向您展示如何使用 Python 来实现每个处理步骤的接近最先进的性能。我们还将向您展示实现这五个子系统的几种替代方法。

大多数聊天机器人将包含所有这五个子系统的元素(四个处理阶段以及数据库)。但是许多应用程序仅需要简单的算法来完成其中许多步骤。一些聊天机器人擅长回答事实性问题,而其他一些擅长生成冗长、复杂、令人信服的人类响应。每种能力都需要不同的方法;我们向您展示了两者的技术。

此外,深度学习和数据驱动的编程(机器学习或概率语言建模)迅速使 NLP 和聊天机器人的可能应用多样化。这种数据驱动的方法通过在您想要应用的领域提供越来越多的数据来为 NLP 流水线提供越来越大的复杂性。当发现一种新的机器学习方法,它更好地利用了这些数据,具有更高效的模型泛化或正则化时,可能会实现大幅度的能力提升。

聊天机器人的自然语言处理(NLP)流水线如图 1.4 所示,包含了我们在本章开头描述的大多数 NLP 应用的构建模块。与Taming Text一样,我们将我们的流水线分解成四个主要子系统或阶段。此外,我们明确指出了一个数据库,用于记录每个阶段所需的数据,并在时间上保留其配置和训练集。这可以使每个阶段在聊天机器人与世界交互时进行批处理或在线重新训练。我们还在我们生成的文本响应上显示了一个“反馈循环”,以便我们的响应可以使用用于处理用户语句的相同算法进行处理。然后,响应的“得分”或特征可以结合在一个客观函数中,以评估和选择根据聊天机器人的计划或对话目标选择最佳可能的响应。本书专注于为聊天机器人配置这个 NLP 流水线,但您可能也能够看到与 NLP 问题的文本检索或“搜索”类似的情况,这可能是最常见的 NLP 应用。我们的聊天机器人流水线当然适用于Taming Text关注的问答应用。

将此流水线应用于金融预测或业务分析可能不那么明显。但想象一下由流水线分析部分生成的特征。您的分析或特征生成的这些特征可以针对您特定的金融或业务预测进行优化。这样,它们可以帮助您将自然语言数据纳入用于预测的机器学习流水线中。尽管专注于构建聊天机器人,但本书为您提供了广泛的 NLP 应用程序所需的工具,从搜索到金融预测。

在图 1.4 中的一个处理元素,在搜索、预测或问答系统中通常不会被使用,是自然语言生成。对于聊天机器人来说,这是它们的核心特性。然而,文本生成步骤通常被纳入到搜索引擎 NLP 应用程序中,并且可以给这样的引擎带来很大的竞争优势。总结或概述搜索结果的能力是许多流行搜索引擎(DuckDuckGo、Bing 和 Google)的优势特性。您可以想象,对于金融预测引擎来说,能够根据它从社交媒体网络和新闻源中检测到的商业可操作事件生成声明、推文或整篇文章是多么有价值。

接下来的章节展示了如何将这样一个系统的层次结合起来,以在 NLP 流水线的每个阶段创造更大的复杂性和能力。

1.10 深度处理

自然语言处理流水线的阶段可以被视为层次结构,就像前向神经网络中的层次一样。深度学习就是通过向传统的两层机器学习模型架构(特征提取后跟建模)添加额外的处理层来创建更复杂的模型和行为。在第五章中,我们解释了神经网络如何通过将模型错误从输出层反向传播到输入层来将学习扩展到各层。但在这里,我们谈论的是顶层以及训练每个层独立于其他层时可以做的事情。

图 1.8 NLP 流水线示例层


图 1.8 中的前四个层对应于前一节中聊天机器人流水线的前两个阶段(特征提取和特征分析)。例如,词性标注(POS 标注)是我们聊天机器人流水线中分析阶段内生成特征的一种方式。POS 标记是由默认的SpaCY流水线自动生成的,该流水线包括此图中的前四个顶层。词性标注通常使用有限状态转换器来完成,例如nltk.tag软件包中的方法。

底层的两层(实体关系和知识库)用于填充包含有关特定领域信息(知识)的数据库。然后,使用所有六个层从特定语句或文档中提取的信息可以与该数据库结合使用以进行推理。推理是从在环境中检测到的一组条件中进行逻辑推断,就像聊天机器人用户陈述中包含的逻辑一样。在此图的较深层中,这种“推理引擎”被认为是人工智能的领域,其中机器可以对其世界进行推理,并使用这些推理做出逻辑决策。然而,聊天机器人可以在不使用此知识数据库的情况下做出合理的决策,仅使用顶层的算法。而且这些决策可以组合产生令人惊讶地类似人类的行为。

在接下来的几章中,我们将深入研究自然语言处理的顶层几层。顶层的三层是执行有意义的情感分析和语义搜索以及构建模仿人类的聊天机器人所必需的。事实上,只需使用一层处理,直接使用文本(字符序列)作为语言模型的特征,就可以构建一个有用且有趣的聊天机器人。如果提供足够的示例语句和回复,仅进行字符串匹配和搜索的聊天机器人就能够参与一场相当令人信服的对话。

例如,开源项目ChatterBot通过仅计算输入语句与其数据库中记录的语句之间的字符串“编辑距离”(Levenshtein 距离)来简化此管道。如果其语句-回复对的数据库包含匹配的语句,则可以将对应的回复(从先前“学习”的人类或机器对话中)重新用作对最新用户语句的回复。对于这个管道,只需要我们聊天机器人管道的第 3 步(生成)。而在这个阶段中,只需要一个蛮力搜索算法来找到最佳的回复。使用这种简单的技术(不需要标记化或特征生成),ChatterBot可以作为 Salvius 的对话引擎,Salvius 是由 Gunther Cox 用废弃零件建造的机械机器人。

Will 是由 Steven Skoczen 开发的开源 Python 聊天机器人框架,采用完全不同的方法。1 Will 只能通过编程使用正则表达式来响应语句。这是 NLP 的劳动密集型和数据稀缺的方法。这种基于语法的方法特别适用于问答系统和任务执行助手机器人,例如 Lex、Siri 和 Google Now。这些系统通过使用“模糊正则表达式”来克服正则表达式的“脆弱性”。脚注:Python regex 包与 re 兼容,并添加了模糊性等功能。regex 将在未来的 Python 版本中取代 re 包([pypi.python.org/pypi/regex)。]

类似地,TRE agrep 或“近似 grep”(laurikari.html)是 UNIX 命令行应用程序 grep 的另一种选择,以及其他用于查找近似语法匹配的技术。模糊正则表达式在可能的语法规则(正则表达式)列表中找到最接近的语法匹配,而不是通过忽略一定数量的插入、删除和替换错误来实现精确匹配。然而,为了扩展模式匹配聊天机器人的行为广度和复杂度,需要大量困难的人类开发工作。即使是由全球一些最大的公司(谷歌、亚马逊、苹果、微软)构建和维护的最先进的基于语法的聊天机器人,在聊天机器人的深度和广度方面仍处于中等水平。

浅层 NLP 可以做很多强大的事情。并且几乎不需要人类监督(标记或筛选文本)。通常情况下,机器可以被永久地留在环境中学习(它可以从 Twitter 或其他一些来源中获取的单词流)。2 我们将在第六章中向您展示如何做到这一点。

1.11 自然语言智商

像人类智力一样,NLP 流水线的能力不能仅仅通过单一的智商评分来衡量,而需要考虑多个“智能”维度。衡量机器人系统能力的常见方法是沿着行为复杂性和所需人类监督程度的维度。但对于自然语言处理流水线,目标是构建完全自动化处理自然语言的系统,消除所有人类监督(一旦模型被训练和部署)。因此,更好的智商维度应该捕捉自然语言流水线复杂性的广度和深度。

消费者产品聊天机器人或虚拟助手,如 Alexa 或 Allo 通常被设计为具有极其广泛的知识和能力。然而,用于响应请求的逻辑往往是浅显的,通常由一组触发短语组成,这些短语都会产生相同的响应,并且只有一个 if-then 决策分支。Alexa(以及底层的 Lex 引擎)的行为类似于(if,elif,elif,…)语句的单层、平面树。Google Dialogflow(独立于 Google 的 Allo 和 Google 助手开发)具有与 Amazon Lex、联系流和 Lambda 类似的功能,但没有用于设计对话树的拖放用户界面。

另一方面,谷歌翻译流水线(或任何类似的机器翻译系统)依赖于一个深层次的特征提取器、决策树和知识图谱的树连接世界上关于知识的各个片段。有时这些特征提取器、决策树和知识图谱会被明确地编程到系统中,就像图 1.5 所示。另一种快速超越这个“手工编码”流水线的方法是深度学习数据驱动的方法。深度神经网络的特征提取器是学习而不是硬编码的,但它们通常需要更多的训练数据才能达到与有意设计的算法相同的性能。

在逐步构建一个能够在一个专注的知识领域内进行对话的聊天机器人的自然语言处理流水线时,你将使用这两种方法(神经网络和手工编码的算法)。这将给你提供完成行业或业务领域内的自然语言处理任务所需的技能。在此过程中,你可能会想到如何扩展这个自然语言处理流水线所能做的事情。图 1.6 将聊天机器人放在已经存在的自然语言处理系统中的位置。想象一下你已经与之交互过的聊天机器人。你认为它们可能在这样一个图中的什么位置?你是否尝试用困难的问题或类似智商测试的东西来测试它们的智能?尝试问一个需要常识逻辑和提出澄清问题能力的模棱两可的问题,比如“太阳和一枚镍币哪个更大?”你将有机会在后面的章节中做到这一点,以帮助你决定你的聊天机器人在这张图中与其他一些聊天机器人相比如何。

图 1.9. 自然语言处理系统的 2D 智商


阅读本书的过程中,你将构建一个聊天机器人的元素。聊天机器人需要所有的自然语言处理工具才能发挥良好的作用:

  • 特征提取(通常用于生成向量空间模型)
  • 信息提取以能够回答事实性问题
  • 语义搜索,从以前记录的自然语言文本或对话中学习
  • 自然语言生成,以撰写新的、有意义的陈述

机器学习让我们有办法欺骗机器,让它展现出好像我们花了一辈子用数百个复杂的正则表达式或算法程序来编程它一样的行为。我们可以教会机器响应与正则表达式中定义的模式相似的模式,只需提供用户陈述的例子和我们想要聊天机器人模仿的回应即可。而机器学习产生的语言"模型",FSMs,要好得多。他们对拼写错误和打字错误都不那么挑剔。

机器学习自然语言处理流水线更容易"编程"。我们不必预见语言中每个符号的可能用途。我们只需要向训练流水线提供与已定义的模式相匹配的短语的示例和不匹配的示例短语即可。只要我们在训练过程中标记示例短语,让聊天机器知道哪个是哪个,它就会学会区分它们。甚至有些机器学习方法几乎不需要"标记"数据。

我们已经给了你一些有趣的学习自然语言处理的理由。你难道不想帮助拯救世界吗?而且我们已经尝试用一些正在革新我们交流、学习、做生意乃至思考方式的实际自然语言处理应用来激发你的兴趣。不久之后,你就能够构建一个接近人类对话行为的系统。而且随着后续章节的学习,你应该能够看到如何用任何你感兴趣的领域知识来训练一个聊天机器人或自然语言处理流水线 - 从金融和体育到心理学和文学。只要你能找到有关它的写作语料库,那么你就能训练一个机器理解它。

本书是关于利用机器学习来构建智能的文本阅读机器,而无需你预见人们表达观点的所有方式。每一章都会在本章介绍的聊天机器人的基本自然语言处理流水线上逐步改进。当你学习自然语言处理工具时,你将建立一个可以进行对话并帮助你实现商业和生活目标的自然语言处理流水线。

1.12 自我测试

第一章复习问题

这里有一些复习问题供你测试对自然语言的理解:

  1. 为什么自然语言处理被认为是通用人工智能(AGI)的核心功能?
  2. 为什么高级自然语言处理模型往往表现出明显的歧视性偏见?
  3. 如何可能利用包含反社会示例的训练数据来创建一个亲社交的聊天机器人?
  4. 构建聊天机器人的 4 种不同方法或架构有哪些?
  5. 自然语言处理在搜索引擎中如何使用?
  6. 编写一个正则表达式来识别你的名字以及你见过的所有变体拼写(包括昵称)。
  7. 编写一个正则表达式以尝试识别句子边界(通常是句号(“.”)、问号"?“或感叹号”!"之一)
Tip

积极学习,通过自问自答这些问题,是快速获得对任何新主题深入理解的方法。事实证明,这种方法同样适用于机器学习和模型评估。著有 Python 包nlpiagitlab.com/tangibleai/nlpia)和qarygitlab.com/tangibleai/qary)的 Pooja Sethi 会在 Substack(activelearning.substack.com)和 github(poojasethi.github.io)上分享 NLP 积极学习的见解。在本书印刷之前,为该书作出贡献的作者 ProAI.org 也将在 Substack(proai.substack.com)和他们的主页(proai.org)上做出同样的分享。

1.13 结论

  • 良好的 NLP 可能有助于拯救世界。
  • 机器可以解读单词的含义和意图。
  • 智能的 NLP 流程将能够处理歧义。
  • 我们可以通过教机器常识性知识来节省花费一生的时间来训练机器。
  • 聊天机器人可以被认为是语义搜索引擎。
  • 正则表达式不仅对搜索很有用。

第二章:个思维的标记(自然语言单词)

本章涵盖了

  • 将你的文本解析成单词和n-grams(标记)
  • 对标点符号,表情符号,甚至中文字符进行分词标记
  • 用词干提取、词形还原和大小写折叠巩固你的词汇表
  • 构建自然语言文本的结构化数字表示
  • 为情感和亲社会意图对文本进行评分
  • 使用字符频率分析来优化你的标记词汇表
  • 处理变长的单词和标记序列

所以你想要用自然语言处理(NLP)的力量来拯救世界?首先,你的 NLP 流水线需要计算关于文本的一些内容,为此你需要一种方式来用数字数据结构表示文本。NLP 管道中将你的文本分解以创建这种结构化数字数据的部分被称为解析器。对于许多 NLP 应用程序来说,你只需要将文本转换为一系列单词,这对于搜索和分类文本可能已经足够了。

你现在将学习如何将一个文档,任何字符串,分割成有意义的离散标记。你将能够解析小到单个词,大到整部百科全书的文本文件。而且它们都会产生一致的表示,你可以用来比较它们。在本章中,你的标记将是单词、标点符号,甚至表情符号,如中文字符、表情符号。

书中稍后你将看到,你可以使用这些相同的技术在任何离散序列中找到意义的片段。例如,你的标记可以是由一系列字节表示的 ASCII 字符,也许还有 ASCII 表情符号。或者它们可以是 Unicode 表情符号、数学符号、埃及象形文字、类似汉字和粤语的象形文字。你甚至可以为 DNA 和 RNA 序列定义标记,每个字母代表五个碱基:腺嘌呤(A)、鸟嘌呤(G)、胞嘧啶(C)、胸腺嘧啶(T)和尿嘧啶(U)。自然语言的标记序列就在你身边… 甚至在你体内。

有没有一些你可以用标记做的事情,不需要大量复杂的深度学习?如果你有一个好的分词器,你可以用它来识别关于一组文档中标记出现次数的统计信息,比如你的博客文章或企业网站。然后你可以用纯 Python 编写一个只需一个字典来记录这些词出现的文档链接的搜索引擎。将单词映射到文档链接或页面的 Python 字典称为逆向索引。就像这本书后面的索引一样。这被称为信息检索—这是你 NLP 工具箱中的一个非常强大的工具。

仅仅统计标记通常就足够进行关键词检测、全文搜索和信息检索。你甚至可以使用文本搜索构建客户支持聊天机器人,以在你的文档或 FAQ(常见问题)列表中查找客户问题的答案。直到聊天机器人知道从哪里寻找答案,它才能回答你的问题。搜索是许多最先进的应用程序的基础,如会话型 AI 和开放域问答。分词器是几乎所有 NLP 流程的基础。

2.1 情感标记

另一个你的分词器的实际用途被称为情感分析,或者分析文本以估计情感。你将在本章后面看到一个情感分析流程的示例。现在你只需要知道如何构建一个分词器。而且你的分词器几乎肯定需要处理被称为表情符号表情符号的情感标记。

表情符号是作者情绪或面部表情的文本表示,例如微笑表情符号::-)。它们类似于计算机用户的现代象形文字或图片词,只能通过 ASCII 终端进行通信。表情符号是这些字符的图形表示。例如,微笑表情符号具有一个小的黄色圆圈,两个黑点表示眼睛,U 形曲线表示嘴巴。微笑表情符号是:-)微笑表情符号的图形表示。

表情符号和表情语言都有自己的语言演化。有数百种受欢迎的表情符号。人们为从公司标志到模因和暗示等各种事物创建了表情符号。甚至非商业社交媒体网络如 Mastodon 都允许你创建自定义表情符号。^([1]) ^([2])

表情符号和表情符号

表情符号是 1972 年第一次输入到 ASCII 文本消息中的,当时卡内基梅隆大学的研究人员错误地把一个关于汞泄漏的短信误认为是个笑话。教授斯科特·E·福尔曼博士建议对于笑话,消息末尾应加上:-),对于严肃的警告消息,则用:-(表情符号。我的天,我们走了多远。

“Emoji"的复数可以是"emoji”(像"sushi")或"emojis"(像"Tsunamis"),但大西洋和纽约时报的风格编辑更喜欢"emojis"以避免歧义。无论你如何输入,你的 NLP 流程都将了解你的意思。


2.2 什么是标记?

一个令牌可以是几乎任何你想要视为一组思想和情感的文本块。所以你需要将文本分成捕捉单个思想的块。你可能会认为单词是令牌的明显选择。所以这就是你将从这里开始的内容。你还将学习如何将标点符号、表情符号、数字和其他类似单词的东西包括在你的单词词汇中。后来你会发现你可以使用这些相同的技巧来找到任何离散序列中的意义包。后来你将学习一些更强大的方法来将离散序列分割成有意义的包。你的标记器很快就能分析和结构化任何文本文档或字符串,从一个单词到一个句子,再到整本书。

想象一下一个文档集合,称为语料库,你想要使用 NLP 进行处理。想想对你的 NLP 算法重要的词汇,你将需要跟踪的令牌集合。例如,如果这是你 NLP 流水线中特定语料库的重要内容,那么你的令牌可能是 ASCII 表情符号的字符。或者你的令牌可以是 Unicode 表情符号、数学符号、象形文字,甚至象形文字像汉字和粤语字符。你的标记器和你的 NLP 流水线甚至对 DNA 和 RNA 的核苷酸序列也会有用,其中你的令牌可能是 A、C、T、G、U 等等。当你阅读像这句话这样的文本时,神经科学家有时会创建离散符号序列来表示你大脑中的神经元发射。自然语言的令牌序列在你内部,在你周围,在你身体里流动。很快你将通过你的机器学习 NLP 流水线流动一系列令牌。

从文档中检索令牌将需要一些字符串操作,不仅仅是第一章中使用的str.split()方法。你可能想要将像"you’ll"这样的缩写分割成形成它们的单词,也许是"you"和"'ll",或者是"you"和"will"。你需要将标点符号与单词分开,比如引号在引用语句或单词的开头和结尾,比如前一句中的引号。并且你需要将一些标点符号,比如破折号(“-”)视为一部分,例如"单破折号化"中的单破折号化复合词。

一旦你确定了文档中想要包含在你的词汇表中的令牌,你将返回到正则表达式工具箱中构建一个标记器。你可以使用正则表达式将词的不同形式组合成你词汇中的一个单一令牌,这个过程称为词干提取。然后你将组装一个称为词袋的文档的向量表示。最后,你将尝试使用这个词袋向量来看看它是否能帮助你改进第一章末尾的基本问候识别器。

2.2.1 替代令牌

单词不是我们可以用于标记的唯一含义包。想一想单词或标记对你来说代表着什么。它代表一个单一概念,还是一团模糊的概念云?你能肯定地辨认出一个单词的起始和结束吗?自然语言单词像编程语言关键字一样,具有精确的拼写、定义和语法规则吗?你能编写可靠识别单词的软件吗?

你认为“冰淇淋”是一个单词还是两个单词?甚至可能是三个?在你的心理词典中,“冰”和“淇淋”至少有两个单独的条目,与复合词“冰淇淋”的条目不同?那么缩略词“don’t”呢?这个字符串应该分成一个、两个,甚至三个含义包吗?

甚至可能希望将单词划分为更小的有意义的部分。诸如前缀“pre”、后缀“fix”或内部音节“la”等词素都具有意义。你可以利用这些词素,将你对一个单词含义的理解转移到你词汇表中的另一个类似单词上。你的 NLU 流水线甚至可以利用这些词素来理解新单词。而你的 NLG 流水线可以利用这些词素来创建简洁捕捉集体意识中流传的想法或模因的新单词。

你的流水线甚至可以将单词分解成更小的部分。字母、字符或图形也具有情感和意义!我们还没有找到完美的思维包编码。而且机器计算与大脑不同。我们用单词或术语解释语言和概念。但机器往往能够看到我们忽略的字符使用模式。为了让机器能够将庞大的词汇表压缩到有限的 RAM 中,自然语言需要更高效的编码方式。

用于高效计算的最佳标记与我们人类使用的思维包(单词)不同。字节对编码(BPE)、词元编码和句元编码都可以帮助机器更有效地使用自然语言。BPE 为您的特定文档和字符串找到最佳字符(字节)分组。如果你想要一个可解释的编码,请使用前面部分的词标记器。如果你想要更灵活和准确地预测和生成文本,那么 BPE、WPE 或 SPE 可能更适合你的应用。就像偏差方差权衡一样,NLP 中经常存在着可解释性/准确性的权衡。

有关隐形或隐含的单词呢?你能想到通过单词“不要!”这个命令隐含的其他单词吗?如果你能强迫自己像一台机器一样思考,然后再切换回人类的思维,你可能会意识到这个命令中有三个看不见的单词。单一的声明“不要!”意味着“你,不要这样做!”或者“你,不要做那个!”至少有三个隐藏的意义包袱,总共有五个你希望你的机器了解的标记。

但现在不要担心看不见的单词。对于本章,你只需要一个能够识别拼写出的单词的分词器。在第四章及以后,你将担心隐含的单词、内涵甚至是意义本身。

你的自然语言处理流程可以从这五个选项中的任意一个开始作为你的标记:

  1. 字节 - ASCII 字符
  2. 字符 - 多字节 Unicode 字符
  3. 子词(词片) - 音节和常见字符群
  4. 单词 - 词典单词或它们的词根(词干,引文)
  5. 句子片段 - 短的、常见的词和多个词片段

当你逐渐往下看这个列表时,你的词汇量会增加,你的自然语言处理流程将需要越来越多的数据来训练。基于字符的自然语言处理流程通常用于翻译问题或需要从一些例子中推广的自然语言生成任务。你的流程可以处理的可能单词数量称为其词汇量。一个基于字符的自然语言处理流程通常只需要处理不到 200 个可能的标记,就可以处理许多以拉丁语为基础的语言。这个小词汇量确保了字节和字符为基础的自然语言处理流程能够处理新的未见过的测试示例,而不会产生太多无意义的 OOV(词汇外)标记。

对于基于单词的自然语言处理流程,你的流程将需要开始关注标记的使用频率,然后决定是否“计数”。你不希望你的流程对诸如 asdf 之类的垃圾单词做任何有意义的事情,但即使你确保你的流程只关注出现频率很高的单词,你最终可能会得到一个与典型词典一样大的词汇量——20 到 50 万个单词。

子词是大多数深度学习自然语言处理流程的最佳标记。子词(词片)分词器内置于许多最先进的变换器流程中。对于任何需要结果可解释和可解释的语言学项目或学术研究,单词是首选的标记。

句子片段将子词算法推到了极致。句子片段分词器允许您的算法将多个词片段组合成一个单一标记,有时可以跨越多个词。句子片段的唯一硬性限制是它们不会延伸到句子的末尾。这确保了标记的含义仅与单个连贯的思想相关,并且在单个句子以及更长的文档中都很有用。

N-gram

无论你在流水线中使用哪种类型的标记,你都可能会提取出一对、三元组、四元组,甚至五元组的标记。这些被称为n-grams^([6])。使用n-grams 让你的机器了解到"ice cream"这个标记,以及构成它的个别标记"ice"和"cream"。另一个你想要保留在一起的二元组是"Mr. Smith"。你的标记和你对文档的向量表示可能都希望有一个位置来放置"Mr. Smith"以及"Mr.“和"Smith”。

你将从一个关键词的简短列表作为你的词汇表开始。这有助于保持你的数据结构小而易懂,并且可以更容易地解释你的结果。可解释的模型创造了你可以用来帮助你的利益相关者,希望是用户自己(而不是投资者),实现他们的目标的见解。

目前,你可以跟踪你词汇表中单词的所有短n-grams。但是在第三章,你将学习如何根据单词的文档频率或出现频率来估计单词的重要性。这样,你就可以过滤掉很少一起出现的单词对和三元组。你会发现我们展示的方法并不完美。特征提取很少能保留任何机器学习流水线中输入数据的所有信息内容。这就是自然语言处理的一部分艺术,学会在你的分词器需要调整以从文本中提取更多或不同信息以适用于你特定的应用程序时调整。

在自然语言处理中,从文本中组成数值向量是一个特别"丢失"的特征提取过程。尽管如此,词袋(BOW)向量保留了足够的文本信息内容,以产生有用和有趣的机器学习模型。本章末尾的情感分析器技术与 Google 用来拯救电子邮件技术免受几乎使其无用的大量垃圾邮件的确切技术相同。

2.3 挑战(词干提取的预览)

作为说明文本特征提取难度的例子,请考虑词干提取 —— 将一个词的各种屈折形式分组到同一个"桶"或簇中。一些非常聪明的人花费了他们的职业生涯来开发基于拼写的算法,将单词的屈折形式分组在一起。想象一下这有多难。想象一下尝试从"ending"中移除动词后缀"ing",这样你就会得到一个名为"end"的词干来代表这两个单词。而且你想将单词"running"变成"run",这样这两个单词就被视为相同。这很棘手,因为你不仅移除了"ing",还多了一个额外的"n"。但是你希望单词"sing"保持完整。你不希望从"sing"中移除"ing"后缀,否则你最终会得到一个单个字母"s"。

或者想象一下,试图区分像“words”这样的单词末尾的复数化的“s”和像“bus”和“lens”这样的单词末尾的普通“s”。单词中孤立的个别字母或单词的部分是否提供任何关于该单词含义的信息?字母可能会误导吗?是的,都是。

在本章中,我们将向您展示如何通过使用常规的词干处理方法来使您的自然语言处理流水线更智能化以应对这些单词拼写挑战。稍后,在第五章中,我们将向您展示统计聚类方法,它只需要您收集一些包含您感兴趣的单词的自然语言文本。从该文本集合中,单词使用的统计信息将揭示“语义词干”(实际上,更有用的词族或同义词的集群),而不需要手工制作的正则表达式或词干规则。

2.3.1 标记化

在自然语言处理中,标记化是一种特殊的文档分割。分割将文本分解为更小的块或片段。文本段比整体包含的信息少。文档可以被分割成段落,段落可以分割成句子,句子可以分割成短语,短语可以分割成标记(通常是单词和标点符号)。在本章中,我们重点研究了如何使用标记器将文本分割成标记

你可能以前听说过标记器。如果你学过计算机科学课程,你可能学过编程语言编译器的工作原理。用于编译计算机语言的标记器称为扫描器词法分析器。在某些情况下,你的计算机语言解析器可以直接处理计算机代码,根本不需要标记器。对于自然语言处理,唯一的解析器通常输出一个向量表示,//组合这些句子可能需要一些工作//而不是如果标记器功能与编译器分开,解析器通常称为无扫描器的解析器

计算机语言的有效标记集称为该语言的词汇,或者更正式地称为词汇表。语言学和自然语言处理研究人员使用术语“词汇表”来指代一组自然语言标记。术语“词汇”更自然地用来指代一组自然语言单词或标记。所以这里你将使用它。

计算机语言编译器的自然语言等效物是自然语言解析器。自然语言标记器在计算机语言世界中称为扫描器词法分析器词法分析器。现代计算机语言编译器将词法分析器解析器合并为单一的词法解析器算法。计算机语言的词汇表通常称为词汇表。计算机语言编译器有时将标记称为符号

这里有五个重要的 NLP 术语。以及一些在谈论编程语言编译器时在计算机科学中使用的大致等效术语:

  • 标记器 — 扫描器,词法分析器,词法分析器
  • 词汇表 — 词汇
  • 解析器 — 编译器
  • 标记术语单词,或 n-gram — 标记或符号
  • 语句 — 语句或表达式

分词是 NLP 管道中的第一步,因此它对管道的其余部分有很大的影响。分词器将非结构化数据,自然语言文本,分解成可以被视为离散元素的信息块。这些在文档中标记出现的计数可以直接用作表示该文档的向量。这立即将一个非结构化字符串(文本文档)转换为适合于机器学习的数值数据结构。这些计数可以被计算机直接用来触发有用的动作和响应。或者它们也可能被用于机器学习管道中,作为触发更复杂的决策或行为的特征。通过这种方式创建的词袋向量的最常见用途是文档检索或搜索。

自然语言处理实战第二版(MEAP)(一)(2)https://developer.aliyun.com/article/1517825

相关文章
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
Python自然语言处理实战:文本分类与情感分析
本文探讨了自然语言处理中的文本分类和情感分析技术,阐述了基本概念、流程,并通过Python示例展示了Scikit-learn和transformers库的应用。面对多义性理解等挑战,研究者正探索跨域适应、上下文理解和多模态融合等方法。随着深度学习的发展,这些技术将持续推动人机交互的进步。
118 1
|
3月前
|
自然语言处理 监控 数据挖掘
|
2月前
|
人工智能 自然语言处理 Java
Java中的自然语言处理应用实战
Java中的自然语言处理应用实战
|
3月前
|
机器学习/深度学习 数据采集 人工智能
Python 高级实战:基于自然语言处理的情感分析系统
**摘要:** 本文介绍了基于Python的情感分析系统,涵盖了从数据准备到模型构建的全过程。首先,讲解了如何安装Python及必需的NLP库,如nltk、sklearn、pandas和matplotlib。接着,通过抓取IMDb电影评论数据并进行预处理,构建情感分析模型。文中使用了VADER库进行基本的情感分类,并展示了如何使用`LogisticRegression`构建机器学习模型以提高分析精度。最后,提到了如何将模型部署为实时Web服务。本文旨在帮助读者提升在NLP和情感分析领域的实践技能。
91 0
|
4月前
|
自然语言处理 API 数据库
自然语言处理实战第二版(MEAP)(六)(5)
自然语言处理实战第二版(MEAP)(六)
43 3
|
4月前
|
机器学习/深度学习 自然语言处理 机器人
自然语言处理实战第二版(MEAP)(六)(4)
自然语言处理实战第二版(MEAP)(六)
37 2
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理实战第二版(MEAP)(六)(2)
自然语言处理实战第二版(MEAP)(六)
36 2
|
4月前
|
机器学习/深度学习 自然语言处理 机器人
自然语言处理实战第二版(MEAP)(六)(3)
自然语言处理实战第二版(MEAP)(六)
53 1
|
3月前
|
机器学习/深度学习 自然语言处理 PyTorch
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用
【9月更文挑战第17天】本文主要介绍了AI技术在自然语言处理(NLP)领域的应用,包括文本分类、情感分析、机器翻译和语音识别等方面。通过实例展示了AI技术如何帮助解决NLP中的挑战性问题,并讨论了未来发展趋势。

热门文章

最新文章