诸如谷歌的BERT和Open AI的GPT3等转化器模型继续改变着我们对机器学习(ML)和自然语言处理(NLP)的思考方式。不妨看看GitHub最近推出的名为Copilot的预测性编程支持工具。它在数十亿行代码上进行了训练,并声称能够理解 "你所提供的上下文并合成相应的代码"。你的虚拟配对程序员伙伴!
我们已经在最近的文章中写过这些模型和底层的Transformer架构。我们还看了最近对不同Transformer模型的研究,以了解为什么BERT和GPT3的底层架构学习上下文的能力比其他模型好得多。
现在,像Copilot一样,我们想在现实生活场景中实现这些模型的一些功能。因此,在这篇文章中,我们将看看我们可以用变形金刚来预测文本的不同特征的实际方法。在这之前,我们需要确定我们可以预测哪些类型的特征,并理解为什么预测文本与其他形式的预测不同。
预测或不预测?
预测文本与其他形式的预测有什么不同?|来源
预测文本数据与其他形式的预测不同。如果你想预测一种资产的价格,如股票或房子,你给你的模型提供所有可用的数据并预测你认为最能代表有关资产的数字。价格是一个数字,虽然它可能是正确的或错误的,但它不像文本那样有许多潜在的 "不确定性维度"。
以Copilot为例。它预测的是代码片段,所以它可能拼错代码,使用错误的编码语言,使用不正确的变量名称,等等。即使它把所有这些都弄对了,代码本身也可能不工作。
同样,一个句子在语法上可能是正确的,但在语义上却毫无意义。诺姆-乔姆斯基(Noam Chomsky)创作了一个著名的句子 "无色的绿色想法在狂睡",以显示机器能够区分语法和语义的困难。
这就是我们说在预测文本时有比价格更多的 "不确定性维度 "的意思。与其他形式的数据(如资产价格)相比,文本有更多的 "错误 "方式。为了控制这种不确定性的程度,我们试图确定我们想要预测的文本数据的具体特征。
这些特征在大多数以商业为重点的NLP管道中也应该是有用的。考虑到这一点,我们在这篇文章中要看的特征是。
- 预测拼写错误。文本出错的最简单的方式之一就是简单地在一个句子中拼错一个或多个单词。这个词要么拼写正确,要么不正确。我们每天都能在Gmail等应用程序中看到这种自动更正功能,因此我们可以看看你如何使用基于Transformer的模型轻松实现这样的功能。
- 预测语法错误。更加困难的事情是识别一个句子中的语法错误。我们能否使用基于转化器的模型来预测一个句子是否包含语法错误?这可能是你在处理数据时使用的东西,以确定它是否需要被改变或从你的管道中删除,因为它可能会增加你的系统中下游错误的可能性。
- 预测转述的句子。通常当我们看文本数据时,我们试图了解某些句子是否有关联。一种方法是,我们是否可以预测一个句子何时在转述另一个句子。这个任务有更多的细微差别,而不是简单地寻找拼写错误或语法上的错误。原因是它涉及到识别两个句子的上下文,并预测一个句子与另一个句子描述的是同一个意图是否合理。这在处理大量文本数据时很有用,你想搜索或识别可能有关联但不完全相同的文本。
当我们研究这些功能时,我们还将调查一些不同的NLP库,这些库使用变形金刚来执行一系列的NLP功能。这些库将是你可以在你的NLP管道中使用的东西,它们也应该帮助你更好地了解你如何使用变形金刚来完成你的具体任务和使用情况。
这篇文章中描述的代码可以在相关的Githubrepo中找到。
用变形金刚预测文本数据
数据集
对于预测文本数据,我们希望使用一个代表 "真实 "查询和对话的数据集。我们所说的 "真实 "是指它包含了你在Slack上或电子邮件中输入的所有混乱的东西。也就是说,它应该包含语法错误和拼写错误,使用缩略语,以及所有其他我们能找到的不太完美的方式来制作一个句子。
这类数据的一个伟大资源是亚马逊客户支持QA数据集。具体来说,我们将使用软件类的问题,因为我们想看看我们的方法是否能够识别相关领域的主题。这个数据集很好,因为。
- 它包含了真实的问题,有我们想要的所有乱七八糟的东西,比如拼写错误、作为陈述的问题、有否定和无否定的问题,以及我们关心的以不同方式提出相同问题的其他各种方式。
- 所有的**问题都有相关的答案,**其中一些是长答案,一些是短的是/否答案。
- 数据集被分成了不同的类别。有些数据集包含了各种不同主题的一般问题的混合物。这并不复制典型的商业客户数据集,它将与特定的业务或技术领域有关。
- 它包含了关于如何最好地将其转换为不同格式的代码示例。作者提供了有用的代码片段,以协助将数据转换为你认为最有用的解析格式。
按照数据集作者概述的步骤,我们最终得到了一个Pandas DataFrame,如下所示。
我们在这里使用DF,但你可以把你的数据转换成任何你认为最容易处理的数据结构。| 来源:《中国新闻周刊》。作者
预测拼写错误
我们能不能用转化器来更好地预测一个词被拼错的情况?|来源
作为对我们预测技能的第一个测试,我们将尝试在我们的数据集中识别拼写错误。我们现在几乎在每个应用中都能看到这个特征,所以我们可能认为这是一个简单的问题。然而,这里的关键区别在于,我们正在执行一项预测任务,而不仅仅是向人类操作员建议一个潜在的拼写。
例如,如果你有一个管道,你正在做清理新的或传入的数据等事情,你可能会有一个下游任务来消耗这些数据。下游任务可能是一个将数据用于训练目的的模型,或将其用于聚类,或一个问题和答案类型的模型。在这些情况下,重要的是,领域特定的数据或特定的术语或俚语不会被错误地识别为一个拼写错误的词而被改变。这可能会导致你的下游任务的严重后果。
由于有了预训练的模型,变压器已经使许多这类应用更容易实现。然而,尽管这些模型很神奇,你仍然需要关注你的特定用例。也许你不需要预训练模型的所有功能和口哨,只需要一个简单的拼写检查就可以了。另外,你可能想看看一些最新的转化器模型应用,看看它们是否为你的用例增加了任何新的和独特的价值。
这种方法的一个好例子是神经拼写校正库NeuSpell。NeuSpell是在神经网络上训练的,通过使用相邻单词的上下文而不仅仅是字符扰动来学习拼写纠正。为了学习这种语境,他们使用了ELMo和BERT等模型以及其他神经网络。你可以在这里找到github repo。
另一种方法是基于上下文的方法,如spaCy通过其上下文拼写检查提供的方法。在识别错误或建议更正时,它使用BERT来利用一个词的上下文。
让我们先看一下这两种方法的一些例子,看看它们在行动中的表现如何。我们将从我们的测试集中抽取20个句子的样本,看看这两个模型,看看它们认为什么是拼写错误。
for
在上面的代码中,你可以看到spaCy模型使我们能够检查在一个给定的字符串中是否确实检测到拼写错误。你还可以查看最可能的建议更正和相应的分数。这些都是非常有用的功能,使你能够看到事实上是否存在错误,以及模型对潜在的替代词的信心如何。
例如,查询 "你需要一个procceser"似乎有一个明显的可识别的拼写错误。然而,spaCy模型似乎认为这更像是一个上下文任务,而不是一个拼写错误。
do you need a procceser
=======================
spaCy: spelling error detected
-----------------------
{procceser:
而NeuSpell模型确实识别了正确的拼写错误。
-----------------------
NeuSpell:
-----------------------
do you need a processor
spaCy模型在这个例子中也显示了更多与语境有关的修正。
Does this work well
潜在的修正是有趣的,因为它们似乎更多地与上下文相关的变化有关,而不是一个拼写错误。如果你把 "canada "换成大写的 "C",就不会检测到拼写错误,也就是说,"这对加拿大有好处吗?"使用spaCy模型不会导致任何改变。NeuSpell模型即使在加拿大的小写拼写下也不会纠正原句。
你可以通过数据集来看看这些模型相互之间的比较的更多例子。即使从粗略的观察来看,我们似乎在这两个模型上都可能有问题。一般来说。
- spaCy模型似乎专注于背景。spaCy模型有很多很好的特性,比如为潜在的替换提供一个信心分数。然而,它的建议更多的是基于上下文而不是拼写错误。在几个简单的例子中,如果我们的主要重点是纠正潜在的拼写错误的单词,它产生的一些建议似乎是有问题的。这只是一个例子,可能有办法使用其他spaCy工具来调整它,或者改变它,使它更适合你的使用情况。但就目前而言,它似乎对预测拼写错误的单词的纠正并没有什么用。
- NeuSpell模型并不提供信心分数。NeuSpell模型作为一个预测拼写错误的单词的纠正的模型,似乎表现得更好。它比spaCy模型产生了更多合理的建议,所以它是你可以考虑使用的东西。它是否比其他标准(即非基于神经网络的)模型更好,还有待商榷。此外,它似乎没有为其建议提供一个信心分数,这一事实可能会限制其预测能力。如果能够看到一个信心分数,并选择是否接受建议,那就太好了。这将使它更容易在NLP管道中实现自动化过程,并确信你没有 "纠正 "像产品名称这样的特定领域的术语。
- 传统的拼写检查器可能更适合你的任务:看起来基于转化器的拼写检查可能比传统类型的方法没有什么优势。但是,关注这样的新应用总是好的,这些应用可能会被新的NLP模型如BERT或GPT所改进。
同时检查
预测语法错误
像T5这样的转化器模型是否能更容易地预测句子中的语法错误?|来源
虽然我们的拼写模型可能没有取得轰轰烈烈的成功,但希望我们在识别数据集中的语法错误方面会有更好的运气。同样,如果你想把你的数据用在下游任务上,这是很有用的。
或者你可能想用一个句子来寻找其他类似的句子。在这种情况下,了解原始文本是否是一个好的、干净的、结构良好的句子会很有用。如果它确实包含一些语法错误,那么这可能是你在看相似性匹配分数等东西时要考虑的问题。
像谷歌在2020年发布的 T5文本转化器这样的模型,是基于转化器的模型的例子,可以执行多种任务,如识别正确或错误的语法。T5模型的有趣之处在于。
- 它是在许多NLP任务上训练的。该模型是在广泛的NLP任务上训练的,从识别相似性、总结文本到识别语法错误。所有这些任务都使用相同的模型、损失函数和超参数。在理论上,这类似于你或我学习语言的方式,即我们学习字母表,我们学习读写和拼写,回答问题,然后我们把所有这些知识建立在一起,能够完成非常高级的语言任务。现在,我们并不是说这些模型以与我们相同的方式理解语言,但它们开始在一些NLP任务中表现出或接近于人类。
- 它使用文本作为输入和输出。这个模型的另一个关键之处在于,你只需通过文本告诉模型你想要它做什么,而它提供的结果也总是以文本的形式出现。这与BERT等模型非常不同,BERT的输入可能是一个句子,但输出是一个实体,如一个巨大的多维矢量。相反,在T5中,你通过文本告诉它你希望它执行什么任务,提供该任务的文本,它就会用文本告诉你结果。这在抽象性方面是一个很大的跳跃。想想C或Java等编码语言与Python之间的区别。Python是如此高的抽象水平,它使更多的人能够编程,并开辟了更多的潜在用例。同样,当人们惊叹于GPT-3的强大功能时,我对其界面的简单性印象深刻。真正的天才不在于数以百万计的参数,而在于它的易用性,它使那些本来无法测试先进的基于变压器的模型的人能够生成文本,回答问题,并对他们所看到的感到惊奇。
你可以通过其github页面或HuggingFace库直接使用T5。另外,也是我喜欢首先使用的方法,你可以尝试找到另一个库,其中涉及到一层抽象,这使得它更容易使用。这样你就可以快速测试这个模型,看看它是否适合你的用例。
如果它适合,你就可以投入时间部署和测试 "原始 "模型,这可能使你能够在更多的定制基础上训练和调整它。最近,许多这些 "抽象 "类型的库也让你执行这些任务,所以你可能不需要再看了。
识别有语法错误的句子
如果你看一下我们的亚马逊数据集,你可以看到一些在语法上不正确的句子,例如 "用户在下载时有什么问题吗?"或 "这对开餐馆有好处吗"。
这是可以预期的,因为这是一个真实的数据集,而且我们都知道,在网上聊天时,这些类型的错误很容易发生。正如我们前面指出的,如果你将客户数据用于下游任务,或者只是作为最佳实践来清理你的数据,那么你会想在句子中出现语法错误时加以识别。结合拼写错误,你可以为你的管道创建一种质量分数,你可以为你心中的任何下游任务排名更高的质量数据。
T5执行这些类型的任务,而建立在T5任务基础上的一个好的 "抽象 "库是John Snow实验室的Spark NLP库。 Spark NLP是一个类似于spaCy或NLTK这样的NLP库,在一个屋檐下提供一系列的NLP功能。John Snow实验室是一家为医疗保健等行业提供NLP服务的公司,但也提供一系列免费的NLP工具。不用说,这就是为什么我们在这里看他们。
为了设置任务,你需要首先确定你要使用的模型。John Snow实验室提供了其他模型,但现在我们将使用T5。
documentAssembler = DocumentAssembler() \
.setInputCol(
然后你需要告诉它你想执行的任务。
t5.setTask(
现在我们只需要从我们的测试数据中获得一些样本句子。
sentences = test_dataset_df[
这是识别哪些句子在语法上是正确的例子输出 | 来源。作者
你可以从上面的例子中看到,它既能识别语法错误,也能识别拼写错误。我们可以把它和上面的拼写纠正库结合起来使用,看看我们需要对哪些句子进行拼写检查。这可能是另一种方法来解决我们先前注意到的问题,即我们没有一个关于一个词被拼写错误的可能性的信心分数。一旦我们知道有一个语法错误,我们就可以通过拼写检查,因为我们知道这个句子有问题。
同样,这是我们可以用来检查数据质量的另一根 "弓上的羽毛"。你可以在这里查看John Snow库中大量的例子和演示。
你可以找到大量其他使用T5和其他转化器模型预测文本的例子。你也可以使用库中的管道结构,轻松创建你自己的ML管道,依次执行所有这些任务。关于所有可用任务的列表,你可以阅读这篇列出所有T5任务和解释的介绍性文章 。
预测意译的句子
BERT能帮助我们预测被转述的句子吗?|来源
到目前为止,我们已经试图预测我们的测试句子是否包含拼写错误的单词或语法错误。现在,想象一下,我们将这些 "检查 "添加到我们的NLP管道,其输出将是一个 "干净 "句子的预测器。这些 "干净 "的句子可以代表正确形成的客户查询。这个管道的最后一步可能是尝试预测一个句子是否是你的数据集中已经存在的句子的转译。
这可能是一个有用的工具,可以看出你是否需要处理或分组任何新进来的句子。如果它们已经存在,那么你可能已经有了这些信息。如果你正在创建一个训练数据集,那么你可能想对句子进行相应的分组和标记。以这种方式预测转述的句子有两个主要的好处。
- 速度快:与其预测一个被转述的句子,不如找到类似的句子。这将涉及将每个句子与其他每个句子进行比较,以找到最相似的句子。如果你有大量的数据,这可能是非常缓慢的。
- 它可以使用预训练的模型。由于我们只是在寻找句子的转述版本,我们可以使用预先训练好的模型。另外,如果我们直接比较句子,我们可能需要对模型进行微调,以理解医学或法律术语等内容,如果我们在该领域的话。当我们使用转述时,希望模型应该主要关注问题的不同措辞方式。例如,想一想 "deefee要多少钱?".这是一个有一个编造的词*的句子,没有任何意义,但这并不妨碍我们对它进行意译。
- deefee的价格是多少?
- 参加deefee的费用是多少?
- deefee的费用是多少?
- paragoinment是deefee吗?
- paragoinment是deefee吗?
- deefee的费用很高吗?
*deefee*--* 我通过一个很酷的网站生成了这个词,这个网站名为 "这个词不存在",它基于GPT2,生成了,嗯,不存在的词,但它也生成了它们的定义。看看这个模型想出的东西很有趣。例如,它将deefee定义为 "一种赌博活动"。
用Sentence BERT预测转述的情况
Sentence BERT是一个伟大的模型库,最初开始使用BERT与连体网络来生成有语义的句子嵌入,然后你可以将其用于分类或句子相似性等方面。它现在有一系列不同的模型,你可以用于一些NLP任务,而且它现在也可以作为HuggingFace库的一部分。
还请检查
我们将使用他们的转述模型来识别我们的亚马逊数据集中的转述句子。注意,你也可以通过HuggingFace库或作为句子转换库本身的一部分使用该模型。
我们首先需要下载该模型,现在这很容易,因为它是HuggingFace的一部分。
from
然后我们需要从我们的数据集中获得一个句子样本来测试。
sentences = test_dataset_df[
1
这里看起来没有很多类似的句子,所以让我们看看模型的想法。
paraphrases = util.paraphrase_mining(model, sentences, top_k=
用句子BERT预测转述|来源:《中国新闻周刊》。作者
我们可以看到,这些样本句子中有些是相互转述的可能性很低,42%是我们在这里看到的 "这在Macbook mid 2010笔记本电脑上能用吗? (Macintosh HD OS X version 10.9.4)"是对 "我怎么能在我的mac 0s x上播放它?"
这样做的好处是,我们可以很容易地把它应用于大量的例子。在我们的亚马逊数据集中,我们有超过7500个例子。让我们看看我们可以预测哪些是可能的转述。处理所有7,588个例子只需要超过14秒。这个时间可能会因你运行笔记本的地方不同而不同,但总的来说,考虑到它在引擎盖下所做的事情,它是很快的。
%%time
paraphrases = util.paraphrase_mining(model, all_sentences, top_k=
CPU times: user
我们的顶级结果是几乎相同的句子,所以它们并不是真正意义上的相互转述。
用Sentence BERT预测转述|来源:《中国日报》。作者
但是,如果我们看一些较低的分数,我们可以看到它确实捕捉到一些有趣的语言细微差别。
para_df.query(
用句子BERT预测转述|来源:作者。作者
为了更好地观察,让我们看一下随机抽样的结果。
for
Is this version a subscription product that has to be renewed every year?
------------------
这里有一些有趣的细微差别,因为人们对 "许可证交易是什么?"这样的问题的措辞混乱而真实。".上面我们可以看到这个问题被表述为。
- 许可证交易是什么?这里的交易是什么?
- 你能更具体地说明许可证规格吗?谢谢你的信息
这些例子被看作是彼此的转述,得分是0.76。这很好,因为这些句子的结构相当不同。你或我都会知道它们是相似的,但要想通过编码规则来知道这些类型的句子是相似的,是很困难的。
同样地,如果我们看一下这些例子。
- 是否包括电子档案?- 在产品的比较中没有特别提到其他内容
- 是否包括免费的电子档案
我们看到这些被预测为转述的句子,得分是0.79。同样,第一句话比第二句话长得多,而且包括的信息对于识别这些是否与同一主题有关并没有什么用处,也就是说,说明产品中没有提到它是额外的信息,但并不能起到改变问题性质的作用。对 "它包括免费电子档案吗?"的答案很可能与第一个问题的答案相同。
在上面的例子中,我们预测了数据集中的最佳释义句子的例子。换句话说,对于每一个句子,模型都会在数据集中找到一个最佳的转述替代例子。我们可能想找到不止一个例子,因为在像这样的数据集中,很可能有多个潜在的意译例子。我们可以通过改变top_k参数来做到这一点。
paraphrases = util.paraphrase_mining(model, all_sentences, top_k=
用句子BERT预测释义|来源:《中国新闻周刊》。作者
总结
在这篇文章中,我们看了一些基于转化器的模型被用来预测文本的不同特征的方法。我们研究了三个主要领域,它们的复杂性从基于单词到基于语法再到研究整个句子。我们研究的主要领域是。
- 预测拼写错误。我们使用了一些库,如spaCy和NeuSpell,并展示了它们如何使用底层转化器模型来尝试和预测拼写错误。最终,基于转化器的模型在纠正拼写错误方面可能不会比传统算法增加多少价值。但这里的关键是,我们看了一些有用的库,现在更好地理解了这个问题,既然我们知道了这些库,可能会将其用于其他一些功能上
- 预测语法错误。然后,我们看了John Snow实验室的NLP库,它提供了一系列有趣的功能。我们使用了语法错误特征,试图预测我们的数据集中的一个句子在语法上是否正确。基于转化器的模型似乎更适合这项任务,它似乎能正确识别出样本句子中的一些措辞错误。在实施你的下一个NLP管道时,肯定要牢记这一点。
- 预测转述句子。具有讽刺意味的是,随着我们任务的语言复杂性的增加,转化器模型似乎提供了更多的价值。我们使用句子转化器库来寻找亚马逊数据集中的句子,这些句子是数据集中其他句子的转述。鉴于该模型对我们例子中使用的技术术语、版本和短语没有具体的知识,这似乎非常有用。这似乎是一个功能,你可以用来识别一个新的客户查询是否实际上只是一个更常见的查询的改写。
很明显,有越来越多的应用程序被建立在基于转化器的模型之上,这将使你更容易找到并使用一个特定的使用案例。理想情况下,你可以找到一个库来执行你所需要的所有功能,但是,正如我们在这里看到的,如果你不能在一个地方找到你需要的所有功能,你可以一起使用不同的库。
参考资料
下面是我们在这篇文章中使用的库的列表。你可以在这些库中找到更多的功能,所以一旦你开始使用它们,我鼓励你去看看你认为对你的使用情况可能有用的其他功能。
- spaCy项目。spaCy项目是一个检查很酷的新模型的好地方。如果你喜欢,你可以在这里上传你自己的模型。
- Neuspell。我们用这个库做了一个不同的拼写检查的例子。
- John Snow实验室。对于语法检查,我们使用了这个库的例子。正如我所指出的,这里有许多很酷的NLP功能和模型是免费提供的,你很可能会找到对你的使用情况有用的东西。
- 句子转换器。最后,对于转述,我们使用了句子变换器库。和John Snow实验室一样,在他们的网站上有很多基于变换器模型的不同应用的例子。
在Intercom的ML团队工作,他创造了人工智能产品,帮助企业提高支持和与客户沟通的能力。他对哲学和技术的交叉感兴趣,尤其对深度学习等技术如何创造可能有一天能理解人类语言的模型感到着迷。他最近完成了商业分析的硕士课程。他的主要学位是电气和电子工程,但他也拥有一个哲学学位和精神分析研究的硕士学位。
阅读下一页
如何构建和管理自然语言处理(NLP)项目
Dhruvil Karani | 发布于2020年10月12日
如果说我在ML行业工作学到了一件事,那就是:机器学习项目是混乱的。
这并不是说人们不想把事情组织起来,只是在项目过程中,有很多事情很难组织和管理。
你可能一开始就很干净,但事情就来了。
一些典型的原因是。
- 笔记本中的快速数据探索。
- 从github上的研究报告中提取的模型代码。
- 在一切都已准备好的情况下加入新的数据集。
- 发现了数据质量问题,需要对数据进行重新标记。
- 团队中有人 "只是快速尝试了一下",并改变了训练参数(通过argparse传递),而没有告诉任何人这一点。
- 来自高层的推动,把原型变成生产,"就这一次"。
在多年的机器学习工程师工作中,我学到了很多东西,这些东西可以帮助你保持在事情的顶端,并保持你的NLP项目的控制(就像你真的可以有ML项目的控制:))。
在这篇文章中,我将分享我在从事各种数据科学项目时学到的关键指针、准则、技巧和窍门。许多东西在任何ML项目中都是有价值的,但有些是专门针对NLP的。