如何解决90%的天然语言处理问题:分步指南奉上


天然语言处理(NLP)与计算机视觉(CV)同样,是目前人工智能领域里最为重要的两个方向。如何让机器学习方法从文字中理解人类语言内含的思想?本文中,来自 Insight AI 的 Emmanuel Ameisen 将为咱们简述绝大多数任务上咱们须要遵循的思路。文章选自InsightDataScience,做者:Emmanuel Ameisen,由机器之心编译。

文本数据无处不在

不管是成立的公司,仍是致力于推出新服务,你均可以利用文本数据来验证、改进和扩展产品的功能。从文本数据中提取信息并从中学习的科学是天然语言处理(NLP)的一个活跃的研究课题。git

NLP 覆盖领域很广,天天都会有新的使人兴奋的结果。但通过与数百家公司合做,Insight 团队发现其中有几个重要应用出现得尤为频繁:github

  • 识别不一样的用户/客户群(例如预测客户流失、顾客终身价值、产品偏好)算法

  • 准确检测和提取不一样类别的反馈(正面和负面的评论/意见,提到的特定属性,如衣服尺寸/合身度等)网络

  • 根据意图对文本进行分类(例如寻求通常帮助,紧急问题)机器学习

尽管网上有不少 NLP 论文和教程,但咱们很难找到从头开始高效学习这些问题的指南和技巧。ide

本文给你的帮助

结合每一年带领数百个项目组的经验,以及全美国最顶尖团队的建议,咱们完成了这篇文章,它将解释如何利用机器学习方案来解决上述 NLP 问题。咱们将从最简单的方法开始,而后介绍更细致的方案,如特征工程、单词向量和深度学习。工具

阅读完本文后,您将会知道如何:学习

  • 收集、准备和检验数据测试

  • 创建简单的模型,必要时转化为深度学习优化

  • 解释和理解模型,确保捕获的是信息而非噪声

这篇文章咱们将给你提供一步一步的指导;也能够做为一个提供有效标准方法的高水平概述。

这篇文章附有一个交互式 notebook,演示和应用了全部技术。你能够随意运行代码,同步学习:github.com/hundredbloc…


第 1 步:收集数据

数据源示例

每一个机器学习问题都从数据开始,例如电子邮件、帖子或推文(微博)。文本信息的常见来源包括:

  • 产品评论(来自亚马逊,Yelp 和各类应用商店)

  • 用户发布的内容(推文,Facebook 上的帖子,StackOverflow 上的问题)

  • 故障排除(客户请求,支持票据,聊天记录)


「社交媒体中出现的灾难」数据集

本文咱们将使用由 CrowdFlower 提供的一个名为「社交媒体中出现的灾难」的数据集,其中:

编者查看了超过 1 万条推文,其中包括「着火」、「隔离」和「混乱」等各类搜索,而后看推文是不是指灾难事件(排除掉用这些单词来说笑话或评论电影等没有发生灾难的状况)。

咱们的任务是检测哪些推文关于灾难性事件,排除像电影这种不相关的话题。为何?一个可能的应用是仅在发生紧急事件时(而不是在讨论最近 Adam Sandler 的电影时)通知执法官员。

这篇文章的其它地方,咱们将把关于灾难的推文称为「灾难」,把其它的推文称为「不相关事件」。


标签

咱们已经标记了数据,所以咱们知道推文所属类别。正如 Richard Socher 在下文中概述的那样,找到并标记足够多的数据来训练模型一般更快、更简单、更便宜,而非尝试优化复杂的无监督方法。

Richard Socher 的小建议


第 2 步:清理数据

咱们遵循的首要规则是:「你的模型受限于你的数据」。

数据科学家的重要技能之一就是知道下一步的工做对象是模型仍是数据。一个好的方法是先查看数据再清理数据。一个干净的数据集可使模型学习有意义的特征,而不是过分拟合无关的噪声。

下面是一个清理数据的清单:(更多细节见代码 code (github.com/hundredbloc…)):

1. 删除全部不相关的字符,如任何非字母数字字符

2. 把文字分红单独的单词来标记解析

3. 删除不相关的词,例如推文中的「@」或网址

4. 将全部字符转换为小写字母,使「hello」,「Hello」和「HELLO」等单词统一

5. 考虑将拼写错误和重复拼写的单词归为一类(例如「cool」/「kewl」/「cooool」)

6. 考虑词性还原(将「am」「are」「is」等词语统一为常见形式「be」)

按这些步骤操做并检查错误后,就可使用干净的标签化的数据来训练模型啦!


第 3 步:寻找好的数据表示

机器学习模型的输入是数值。如图像处理的模型中,用矩阵来表示各个颜色通道中每一个像素的强度。

一个笑脸能够表示为一个数字矩阵

若是咱们的数据集是一系列的句子,为了使算法能够从数据中提取特征,咱们须要表示为能够被算法识别的形式,如表示为一系列数字。


One-hot encoding(词袋模型)

表示文本的一种常见方法是将每一个字符单独编码为一个数字(例如 ASCII)。若是咱们直接把这种简单的形式用于分类器,那只能基于咱们的数据从头开始学习单词的结构,这对于大多数数据集是不可实现的。所以,咱们须要一个更高级的方法。

例如,咱们能够为数据集中的全部单词创建一个词汇表,每一个单词对应一个不一样的数字(索引)。那句子就能够表示成长度为词汇表中不一样单词的一个列表。在列表的每一个索引处,标记该单词在句子中出现的次数。这就是词袋模型(Bag of Words),这种表示彻底忽略了句子中单词的顺序。以下所示。

将句子表示为词袋。左边为句子,右边为对应的表示,向量中的每一个数字(索引)表明一个特定的单词。


可视化词嵌入

在「社交媒体中出现的灾难」一例中,大约有 2 万字的词汇,这表明每一个句子都将被表示为长度为 2 万的向量。向量中有不少 0,由于每一个句子只包含词汇表中很是小的一个子集。

为了了解词嵌入是否捕获到了与问题相关的信息(如推文是否说的是灾难),有一个很好的办法,就是将它们可视化并看这些类的分离程度。因为词汇表很大,在 20,000 个维度上可视化数据是不可能的,所以须要主成分分析(PCA)这样的方法将数据分到两个维度。以下图所示。

将嵌入的词袋可视化

看起来很难分为两类,也很差去下降维度,这是嵌入的一个特色。为了了解词袋模型特征是否有用,咱们能够基于它们训练一个分类器。


第 4 步:分类器

遇到一个问题时,一般从寻找解决问题的工具入手。当咱们要对数据进行分类时,出于通用性和可解释性的考虑,一般使用 Logistic 回归(Logistic Regression)。训练很是简单,结果也可解释,由于易于从模型提取出最重要的参数。

咱们将数据分红一个用于拟合模型的训练集和一个用于分析对不可见数据拟合程度的测试集。训练结束后,准确率为 75.4%。还看得过去!最频繁的一类(「不相关事件」)仅为 57%。但即便只有 75% 的准确率也足以知足咱们的须要了,必定要在理解的基础上建模。


第 5 步:检验

混淆矩阵(Confusion Matrix)

首先要知道咱们模型的错误类型,以及最不指望的是哪一种错误。在咱们的例子中,误报指将不相关的推文分类为灾难,漏报指将关于灾难的推文归为不相关事件。若是要优先处理每一个可能的事件,那咱们想下降漏报的状况。若是咱们优先考虑资源有限的问题,那咱们会优先下降误报的状况,从而减小误报的提醒。咱们能够用混淆矩阵来可视化这些信息,混淆矩阵将咱们模型预测的结果与真实状况进行比较。理想状况下(咱们的预测结果与真实状况彻底相符),矩阵为从左上到右下的一个对角矩阵。


混淆矩阵(绿色比例大,蓝色比例小)

咱们的分类器的漏报状况(相对)高于误报状况。也就是说,这个模型极可能错误地将灾难归为不相关事件。若是误报状况下执法的成本很高,那咱们更倾向于使用这个分类器。


解释模型

为了验证模型并解释模型的预测,咱们须要看哪些单词在预测中起主要做用。若是数据有误差,分类器会对样本数据做出准确的预测,但在实际应用时模型预测的效果并不理想。下图中咱们给出了关于灾难和不相关事件的重要词汇。咱们能够提取并比较模型中的预测系数,因此用词袋模型和 Logistic 回归来寻找重要词汇很是简单。

词袋:重要词汇

咱们的分类器正确地找到了一些模式(广岛,大屠杀),但显然这是无心义数据的过分拟合(heyoo, x1392)。如今咱们的词袋模型正在处理一个庞大的词汇表,全部词汇对它来讲都是同样的。但一些词汇出现地很是频繁,并且只会对咱们的预测加入噪声。接下来,咱们试着用一个方法来表示词汇出现的频率,看咱们可否从数据中得到更多的信号。


第 6 步:统计词汇

TF-IDF

为了使模型更关注有意义的单词,咱们可使用 TF-IDF(词频-逆文档频率)对咱们的词袋模型进行评估。TF-IDF 经过对数据集中词汇出现的频率来加权,并减少高频但只是增长噪音的单词的权重。这是咱们新嵌入的 PCA 预测。

将 TF-IDF 嵌入可视化

由上图咱们看到,两种颜色的数据差异更加明显。这使分类器分组更加容易。让咱们来看一下这样结果是否会更好。训练新嵌入的 Logistic 回归,咱们获得了 76.2%的准确率。

只是稍稍地进行了改进。那如今咱们的模型能够选择更重要的单词了吗?若是模型预测时有效地绕过了「陷阱」,获得了更好的结果,那就能够说,这个模型获得了优化。

TF-IDF:重要词汇

挑出来的单词彷佛更加相关了!尽管咱们测试集的指标稍有增长,但模型使用的词汇更加关键了,所以咱们说「整个系统运行时与客户的交互更加温馨有效」。


第 7 步:利用语义

Word2Vec

咱们最新的模型能够挑出高信号的单词。但极可能咱们运做模型时会遇到训练集中没有单词。所以,即便在训练中遇到很是类似的单词,以前的模型也不会准确地对这些推文进行分类。

为了解决这个问题,咱们须要捕获单词的含义,也就是说,须要理解「good」和「positive」更接近而不是「apricot」或「continent」。用来捕获单词含义的工具叫 Word2Vec。


使用预训练的单词

Word2Vec 是寻找单词连续 embedding 的技术。经过阅读大量的文本学习,并记忆哪些单词倾向于类似的语境。训练足够多的数据后,词汇表中的每一个单词会生成一个 300 维的向量,由意思相近的单词构成。

论文《Efficient Estimation of Word Representations in Vector Space》的做者开源了一个模型,对一个足够大的可用的语料库进行预训练,将其中的一些语义归入咱们的模型中。预训练的向量能够在这篇文章相关的资源库中找到:https://github.com/hundredblocks/concrete_NLP_tutorial。


句子的表示

快速获得分类器的 sentence embedding 的一个方法是平均对句子中的全部单词的 Word2Vec 评估。这和以前词袋模型是一个意思,但此次咱们保留一些语言信息,仅忽略句子的语法。


如下是以前技术的新嵌入的可视化:

可视化 Word2Vec 嵌入

这两种颜色的数据更明显地分离了,咱们新的嵌入可使分类器找到两类以前的分离。通过第三次训练同一个模型后(Logistic 回归),咱们获得了 77.7%的准确率,这是目前最好的结果!能够检验咱们的模型了。


复杂性/可解释性的权衡

咱们的 embedding 没有向以前的模型那样每一个单词表示为一维的向量,因此很验证看出哪些单词和咱们的向量最相关,。虽然咱们仍可使用 Logistic 回归的系数,但它们和咱们 embedding 的 300 个维度有关,而再也不是单词的索引。

它的准确率这么低,抛掉全部的可解释性彷佛是一个粗糙的权衡。但对于更复杂的模型来讲,咱们能够利用 LIME 之类的黑盒解释器(black box explainers)来深刻了解分类器的工做原理。


LIME

能够经过开源软件包在 Github 上找到 LIME:https://github.com/marcotcr/lime

黑盒解释器容许用户经过扰乱输入并观察预测的变化来解释一个特定例子的任何分类器的决定。

让咱们看一下数据集中几个句子的解释。

挑选正确的灾难词汇并归类为「相关」。


这里,这个词对分类器的形成的影响彷佛不太明显。

可是,咱们没有时间去探索数据集中的数千个示例。咱们要作的是在测试例子的表明样本上运行 LIME,看哪些词汇作的贡献大。使用这种方式,咱们能够像以前的模型同样对重要单词进行评估,并验证模型的预测结果。


Word2Vec:重要单词

模型提取的高度相关的词意味它能够作出更加可解释的决定。这些看起来像是以前模型中最相关的词汇,所以咱们更愿意将其加入到咱们的模型中。


第 8 步:使用端到端(end-to-end)方法

咱们已经介绍了生成简洁句嵌入快速有效的方法。可是因为忽略了单词的顺序,咱们跳过了句子全部的语法信息。若是这些方法提供的结果不充分,那咱们可使用更复杂的模型,输入整个句子并预测标签,而不须要中间表示。一个常见的方法是使用 Word2Vec 或更相似的方法(如 GloVe 或 CoVe)将句子看做一个单词向量的序列。这就是咱们下文中要作的。

高效的端到端结构

用于句子分类的卷积神经网络训练很是迅速,做为入门级深度学习体系效果很是理想。虽然卷积神经网络(CNN)主要由于在图像处理的使用而广为人知,但它们在处理文本相关任务时获得的结果也很是好,并且一般比大多数复杂的 NLP 方法(如 LSTMs 和 Encoder/Decoder 结构)训练地更快。这个模型考虑了单词的顺序,并学习了哪些单词序列能够预测目标类等有价值的信息,能够区别「Alex eats plants」和「Plants eat Alex」。

训练这个模型不用比以前的模型作更多的工做,而且效果更好,准确率达到了 79.5%!详见代码:github.com/hundredbloc…

与上述模型同样,下一步咱们要使用此方法来探索和解释预测,以验证它是不是给用户提供的最好的模型。到如今,你应该对这样的问题轻车熟路了。


结语

下面对咱们成功使用的方法进行简要回顾:

  • 从一个简单快速的模型开始

  • 解释其预测

  • 了解其错误类型

  • 根据以上知识来判断下一步的工做——处理数据仍是寻找更复杂的模型

这些方法只用于特定的例子——使用适当的模型来理解和利用短文本(推文),但这种思想适用于各类问题。但愿这篇文章对你有所帮助,也欢迎你们提出意见和问题!

相关文章
相关标签/搜索