如何处理自然言语处理中90%的成绩

图灵汇官网

如何将这五个W和H扫尾的词运用在文本数据中?

想要了解更多相似的内容,请在Twitter上关注Insight和Emmanuel。

文本数据无处不在

无论你是已成立的公司还是努力于推出新服务,你都可以运用文本数据验证、提升和扩展产品的功能与功能。学习并提取文本数据中的意义,这一领域是自然语言处理(NLP)中的一个重要研究课题。

NLP是一个非常庞大的领域,每天都会产生新的令人兴奋的研究成果。然而,Insight团队与数百家公司合作后发现,以下几种关键应用在实际操作中被广泛采用:

  • 辨识不同的用户/客户群体(例如预测客户流失、生命周期、产品偏好)
  • 准确地检测并提取不同类别的反馈(正面或负面的评论/意见,特定属性的评论,例如衣服尺寸/合身)
  • 根据意图对文本进行分类(例如请求基本帮助,紧急的问题)

尽管网上有很多NLP的论文和教程,但很难找到从头开始学习如何高效解决这些问题的指导和技巧。

本文如何提供协助

我们每年指导数百个项目,从美国顶尖团队获得建议后,我们编写了这篇文章来解释如何构建机器学习的解决方案以解决上述问题。我们将从最简单的方法开始,逐步转向更复杂的解决方案,例如特征工程、词向量和深度学习。

读完这篇文章,你将学会如何:

  • 收集、准备并检查数据
  • 建立简单的模型,并在必要时转换为深度学习
  • 解释并理解你的模型,确保你获取到的是信息而非噪声

我们撰写这篇文章作为一个逐步指南,也可以作为高效标准方法的高级概述。文章中包含一个交互式笔记本,用来演示和使用所有这些技术。

随意运行代码,并跟随每一步骤!

第一步:收集你的数据

数据源示例

每个机器学习项目都始于数据,例如电子邮件、帖子或推文。文本信息的常见来源包括:

  • 产品评论(来自亚马逊、Yelp和各种应用商店)
  • 用户生成的内容(推文和Facebook帖子,StackOverflow的问题)
  • 问答(客户请求、服务记录、聊天记录)

“社交媒体上的灾难”数据集

在这篇文章中,我们将使用CrowdFlower提供的数据集,名为“社交媒体上的灾难”。

  • 贡献者查看了超过10000条推文,做了各种各样的搜索,如“火灾”、“隔离”和“混乱”,然后标记这些推文是否对应到一个灾难事件(而不是一个玩笑或影评等无灾难性的语句)。

我们的任务是检测哪些推文是关于灾难事件的,而不是像电影这样的无关话题。为什么这么做?一个潜在的应用是只将关于紧急事件的推文告知执法人员,而忽略掉最近电影的评论。这个任务的一个特殊挑战是这两类推文都包含相似的搜索关键词,因此我们需要运用更精细的差异来区分它们。

在本文接下来的叙述中,我们将关于灾难的推文称为“灾难”,把其他推文称为“相关”。

标签

我们对数据进行了标记,因此我们知道哪些推文属于哪一类。正如Richard Socher所概述的那样,与试图优化复杂的无监督方法相比,找到并标记足够的数据来训练模型通常更快、更简单、也更便宜。

第二步:清理数据

我们遵循的首要原则是:你的模型优劣取决于你的数据。

数据科学家的一项关键技能是知道下一步应该专注于提升模型效果还是处理数据。一个好的经验法则是先查看数据然后清理它。一个干净的数据集将使模型学习到有意义的特征,而不是在无关的噪声上过拟合。

以下是一个清单,用于清理你的数据(更多细节见代码):

  • 删除所有无关字符,如非字母和非数字字符
  • 将文本切分为独立的单词进行标记
  • 移除无关词汇,例如Twitter中的“@”或网址
  • 将所有字母转为小写,以便将“hello”、“Hello”和“HELLO”统一对待
  • 考虑将拼写错误或有多种拼写方式的单词用统一的方式表示(例如“cool”/“kewl”/“cooool”)
  • 考虑词形还原(例如将相似的“am”、“are”、“is”等词语统一缩写为“be”)

在按照这个清单逐步检查之后,我们就可以开始使用清理后的、已经标注好的数据来训练模型了。

第三步:找到一个好的表示数据的方式

机器学习模型将数值作为输入。例如,用于图像处理的模型将每个颜色通道中每个像素的强度矩阵作为输入。

一个数字矩阵,它表现出一副笑脸的样子

我们的数据集是句子的列表,为了让我们的算法从数据中提取特征,我们首先需要找到一种表示方法,使我们的算法能够理解,即用数字列表来表示。

one-hot编码(词袋)

为了让计算机理解,一种自然的文本表示方式是将每个字符编码成一个单独的数字(例如ASCII码)。如果我们直接将这种表示方式喂给分类器,它就需要从头开始,仅仅根据我们的数据学习出单词的结构,这对于大多数数据集来说是不可能的。我们需要使用更高级的方法。

例如,我们可以根据我们的数据集创建一个包含所有单词的词汇表,并使用唯一的索引与词汇表中的每个单词相连。每个句子都被表示成一个与词汇表中单词数量一样长的列表。在这个列表中的每个索引处,我们标记对应单词在句子中出现的次数。这种方法被称为词袋模型,因为它完全忽略了句子中的词语顺序。如下所示。

运用词袋表示句子。句子在左边,右边是句子的表示向量。向量中的每个索引代表一个特定的词。

向量可视化

在“社交媒体的灾难”这个例子中,我们词汇表中有大约20000个单词,这意味着每个句子都被表示成长度为20000的向量。这个向量包含的大部分都是0,因为每个句子只包含词汇表中很少的单词子集。

为了了解我们的表示向量是否捕获到与我们的任务相关的信息(即推文是否与灾难相关),将它们可视化是一种好方法,可以查看这些类别是否看起来可以很好地分离。由于词汇表通常很大,将20000维的数据可视化是不可能的,PCA等技术可以帮助我们把数据降到2维。如下图所示。

词袋向量可视化

这两类看起来没有被很好地分开,可能是向量的特征就是这样,也可能只是由于降维。为了看看词袋特征是否有用,我们可以根据它们训练一个分类器。

第四步:分类

第一次遇到问题时,通常最好的做法是从最简单的工具开始解决问题。每当遇到分类问题时,一个常用的方法是逻辑回归,因为它功能多,可解释性强。训练非常简单,而且结果可以解释,因为你很容易提取模型中最重要的系数。

我们将数据分成训练集和测试集。训练集用来训练我们的模型,测试集用来看看模型在看不见的数据上的表现。训练后,我们得到了75.4%的准确率,不是太差!仅仅猜测频率最高的类别(相关)只能达到57%的准确率。但是,即使75%的准确率已经足够满足我们的需求,我们也不应该不试图了解这个模型就使用它。

第五步:检查

混淆矩阵

第一步是了解模型的错误类型,以及哪些错误是我们无法接受的。在我们的例子中,误报将相关推文分类为灾难,而漏报将灾难推文分类为相关。如果我们希望优先处理每一个潜在的灾难事件,我们可能希望减少漏报率。如果我们受到资源的限制,我们可能优先希望低误报率以减少错误警报。一个将这些信息可视化的良好方法是使用混淆矩阵,将我们的模型预测的标签与真实标签进行比较。理想情况下,这个矩阵是从左上角到右下角的对角线(当我们的预测完美匹配真实标签时)。

混淆矩阵(绿色比例高,蓝色比例低)

我们的分类器产生的漏报比误报(比例)多。换句话说,我们的模型更普遍地错误地将灾难标记为相关。如果误报的执法成本很高,这对于我们分类器来说可能是一个好的偏向。

解释我们的模型

为了验证我们的模型并解释它的预测,很重要的是看看模型使用哪些单词来做预测。如果我们的数据有偏差,我们的分类器将在训练集中做出准确预测,但在现实世界中无法很好地推广。在这里,我们将灾难与相关两类中最重要的单词制成图表。当使用词袋模型和逻辑回归时,将词语重要性制成图表很简单,因为只需要提取模型用于预测的系数并进行排序即可。

我们的分类器正确提取了一些词语(如广岛,屠杀),但很明显,在一些有意义的词语中出现了过拟合(如heyoo,x1392)。现在,我们的词袋模型处理不同词语的词汇表,并将所有单词同等对待。但是,其中某些词语出现的频率很高,对于我们的预测只起到了噪声的作用。接下来,我们将尝试一种考虑词语频率表示句子的方式,看看是否能从我们的数据中提取更多的意义。

第六步:考虑词语结构

TF-IDF

为了让我们的模型专注于更有意义的单词,我们可以在词袋模型的基础上使用TF-IDF分数(词频-逆文档频率)。TF-IDF通过词语在数据集中出现的稀疏程度决定词语权重,减少出现频率太多的词语权重,因为它们可能会带来噪声。以下是使用PCA获得的新向量。

TF-IDF向量可视化

我们从上图中可以看到,两种颜色之间有一个更清晰的区别。这可以让我们的分类器更容易地将两类分开。让我们看看它是否带来了更好的表现。使用另一个逻辑回归模型训练我们的新向量,我们得到了76.2%的准确率。

只改进了一点点。我们的模型是否开始获得更重要的单词?如果我们在避免模型“作弊”的同时得到了一个更好的结果,我们可以考虑升级这个模型。

TF-IDF:词语重要性

它获得的词语看起来相关性更强!即使我们在测试集上的评估指标只是稍微增加了一些,但我们对模型使用的词语有了更多的信心,因此我们在与客户的交互系统中部署它时会感觉更加舒适。

第七步:应用语义

Word2Vec

我们刚刚的模型尝试获取词语的意义。但是,如果我们使用这个模型,我们很可能会遇到在训练集中没有见过的词语。即使在训练过程中遇到了很多相似的词汇,之前的模型也无法将这些推文准确分类。

为了处理这个问题,我们需要捕捉单词的语义,也就是说我们需要了解像“好”和“积极”的间隔比“杏”和“大陆”的间隔更近。我们使用的工具叫作Word2Vec,它可以帮助我们捕捉语义。

使用预训练的词语

Word2Vec是为词语寻找连续向量的工具。它通过阅读大量的文本来学习,并记住哪些词语倾向于在相似的上下文中出现。在足够数据中训练后,它为词汇表中的每一个单词生成一个300维的向量,其中语义相似的词语向量间的距离更近。

这篇论文的作者开源了一个使用庞大语料集预训练的模型,我们可以利用它将语义知识纳入我们的模型中。预训练词向量可以在这篇博客的相关存储库中找到。

句子级别的向量表示

为我们的分类器快速获得句向量的一种方法是对句子中所有的词使用平均词向量得分。这与以前一样,是一个词袋的方法,但这一次我们只丢失了句子的语法信息,而保留了一些语义信息。

Word2Vec句向量

这是我们对使用以前技术获得的新向量的可视化:

Word2Vec 向量可视化

这两种颜色看起来更容易分离,我们的新向量应该可以帮助我们的分类器将两类分开。在第三次使用相同的模型(逻辑回归)训练后,我们得到了77.7%的准确率,这是我们目前最好的结果!是时候检查我们的模型了。

困惑度/可解释性的权衡

我们的向量不像之前的模型那样将每一个单词表示成一个一维的向量,因此更容易看出哪些词语对分类的相关性最强。虽然我们仍然可以使用逻辑回归的系数,它们对应的是我们向量的300个维度,而不是词语的索引。

对于如此低的准确率提升,得到所有的可解释性看起来是一个不太好的权衡。但是,对于更复杂的模型,我们可以应用LIME等黑盒解释器来解释分类器的工作原理。

LIME

LIME可以通过GitHub开源的包得到。一个黑盒解释器允许用户扰动输入(在这种情况下是移除句子中的词语)并查看在预测中如何改变,通过这种方法在一个特例中解释分类器的决策。

我们来看看我们的数据集中几个句子的解释。

正确的灾难词汇被分类为“相关”。

这里,词语对分类的贡献看起来不太明确。

但是我们没有时间查看数据集中的数千个例子。我们能做的是在测试集中的代表性样例中运行LIME,并查看哪些单词持续做出很多贡献。使用这种方法,我们可以得到像以前模型一样的单词重要性分数,并验证模型的预测结果。

Word2Vec:词语重要性

看起来模型可以获取高度相关的词汇,暗示它做出了可理解的决策。这些看起来是在以前的所有模型中最相关的词汇,当我们将其应用于产品中时会感觉更舒适。

第八步:应用端到端方法应用语法

我们已经介绍了快速高效地获得句向量的方法。但是,通过省略单词的顺序,我们放弃了句子所有的语法信息。如果这些方法无法提供足够的结果,你可以应用更复杂的模型,将整个句子作为输入并预测模型,而不需要建立中间的表示向量。一个常见的方法是将句子作为词向量的序列,可以通过Word2Vec或者最近的GloVe与CoVe等方法获得词向量。这是我们接下来要做的。

一个搞笑的端到端结构(源)

用于句子分类的卷积神经网络训练非常迅速,并且作为入门级深度学习结构表现出色。虽然卷积神经网络(CNN)主要因其图像处理中的表现而闻名,但它们在文本相关任务中也取得了很好的效果,并且通常比大多数复杂的NLP方法(如LSTM和编码器/解码器结构)快得多。这个模型保留了单词的顺序,并学习到哪些词语序列可以预测目标类别这些有价值的信息。与以前的模型相反,它可以区分“Alex吃植物”和“植物吃Alex”的区别。

训练这个模型不需要比以前的方法更多的工作(详见代码),并让我们得到了比以前更好的模型,准确率达到79.5%!与下面的模型一样,下一步我们应该使用我们讲解过的方法探索并解释预测,以验证它确实是部署给用户的最佳模型。现在,你应该可以自己处理这个问题了。

最后的笔记

以下是对我们成功使用的方法的快速回顾:

  • 从一个简单快速的模型开始
  • 解释它的预测
  • 了解它正在犯的是哪种错误
  • 运用这些知识决定下一步应该处理数据还是使用一个更复杂的模型

我们将这些方法应用于一个特例中,使用模型理解和应用诸如推文的短文本。但这些思想在许多问题中都适用。希望这对你有所帮助,我们很乐意听到你的意见和问题!你可以通过在下面回复或在Twitter上@EmmanuelAmeisen联系我们!

博客原址

https://blog.insightdatascience.com/how-to-solve-90-of-nlp-problems-a-step-by-step-guide-fda605278e4e

更多文章,关注雷锋网

添加雷锋字幕组微信号(leiphonefansub)为好友

备注「我要加入」,To be a AI Volunteer!

[align=center][attach]84830[/attach][/align]

雷锋网

本文来源: 图灵汇 文章作者: 苏慧娟