如何解决90%的NLP问题:逐步指导

如何解决90%的NLP问题:逐步指导html

使用机器学习来理解和利用文本。git

                                            如何将5 W和H应用于文本数据!

文本数据无处不在github

不管您是成熟公司仍是致力于推出新服务,您始终能够利用文本数据来验证,改进和扩展产品的功能。从文本数据中提取意义和学习的科学是一个活跃的研究主题,称为天然语言处理(NLP)。算法

天天NLP产生新的使人兴奋的 结果,是一个很是大的领域。然而,Insight团队与数百家公司合做,看到一些关键的实际应用程序比其余任何公司更频繁地出现:网络

  • 识别不一样的用户/客户群(例如预测流失,生命周期价值,产品偏好)
  • 准确地检测和提取不一样类别的反馈(正面和负面评论/意见,说起特定属性,如服装尺码/合身......)
  • 根据意图对文本进行分类(例如请求基本帮助,紧急问题)

虽然许多NLP论文和教程存在于网上,但咱们发现很难找到有关如何从头开始有效解决这些问题的指南和技巧。架构

本文如何提供帮助机器学习

在每一年领导数百个项目并得到美国各地顶级团队的建议后,咱们写了这篇文章来解释如何构建机器学习解决方案来解决上述问题。咱们将从最简单的方法开始,而后转向更细微的解决方案,例如特征工程,单词向量和深度学习。ide

阅读本文后,您将了解如何:工具

  • 收集,准备和检查数据
  • 构建简单的模型,并在必要时过渡到深度学习
  • 解释和理解您的模型,以确保您实际捕获信息而不是噪音

咱们把这篇文章写成了一步一步的指南; 它还能够做为高效标准方法的高级概述。post

这篇文章附有一个交互式笔记本,演示和应用全部这些技术。随意运行代码并继续!

第1步:收集您的数据

示例数据源

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

  • 产品评论(在亚马逊,Yelp和各类应用商店)
  • 用户生成的内容(推文,Facebook帖子,StackOverflow问题)
  • 故障排除(客户请求,支持服务单,聊天记录)

“社交媒体灾难”数据集

对于这篇文章,咱们将使用 Figure Eight慷慨提供的数据集,称为“社交媒体上的灾难”,其中:

贡献者查看了超过

10,000

条推文,其中包括“点燃”,“隔离”和“混乱”等各类搜索,而后注意到推文是否涉及灾难事件(而不是与单词或电影评论相关的笑话或一些非灾难性的事情)。

咱们的任务是检测哪些推文是关于灾难性事件的,而不是像电影那样可有可无的话题。为何?一个潜在的应用是彻底通知执法官员紧急紧急状况,同时忽略对最近的亚当桑德勒电影的评论。这项任务的一个特殊挑战是两个类都包含用于查找推文的相同搜索词,所以咱们必须使用微妙的差别来区分它们。

在本文的其他部分,咱们将把关于灾难的推文称为“ disaster(灾难 )”,并将有关其余任何内容的推文称为“ (irrelevant)可有可无 ”。

标签

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

                                    Richard Socher的专业提示

第2步:清理数据

咱们遵循的首要规则是:

“您的模型将永远与您的数据同样好。”

数据科学家的关键技能之一是了解下一步是应该对模型仍是数据进行处理。一个好的经验法则是首先查看数据而后进行清理。一个干净的数据集将容许模型学习有意义的功能,而不是过分匹配无关的噪音。

如下是用于清理数据的清单:( 有关详细信息,请参阅代码):

  • 删除全部不相关的字符,例如任何非字母数字字符
  • 经过分词将其分割成单个的单词文本
  • 删除不相关的单词,例如“@”twitter说起或网址
  • 将全部字符转换为小写,以便将诸如“hello”,“Hello”和“HELLO”之类的单词视为相同
  • 考虑将拼写错误或交替拼写的单词组合成单个表示(例如“cool”/“kewl”/“cooool”)
  • 考虑词形还原(将诸如“am”,“are”和“is”等词语简化为常见形式,例如“be”)

按照这些步骤并检查其余错误后,咱们能够开始使用干净的标记数据来训练模型!

第3步:找到一个好的数据表示

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

                                        一个微笑的脸表示为数字矩阵。

咱们的数据集是一个句子列表,因此为了让咱们的算法从数据中提取模式,咱们首先须要找到一种方法来表示咱们的算法能够理解的方式,即做为数字列表。

one-hot编码(Bag of Words)

表示计算机文本的一种天然方式是将每一个字符单独编码为数字(例如ASCII)。若是咱们将这个简单的表示提供给分类器,则必须仅根据咱们的数据从头学习单词的结构,这对于大多数数据集是不可能的。咱们须要使用更高级别的方法。

例如,咱们能够在数据集中构建全部惟一单词的词汇表,并将惟一索引与词汇表中的每一个单词相关联。而后将每一个句子表示为与咱们词汇表中不一样单词的数量同样长的列表。在此列表中的每一个索引处,咱们标记给定单词在句子中出现的次数。这被称为Bag of Words模型,由于它是一种彻底忽略句子中单词顺序的表示。这以下图所示。

   将句子表示为一Bage of Words。左边的句子,右边的表示。向量中的每一个索引表明一个特定的单词。

可视化嵌入

咱们在“社交媒体灾难”示例中的词汇量大约有20,000个单词,这意味着每一个句子都将表示为长度为20,000的向量。向量将主要包含0由于每一个句子只包含咱们词汇表的一小部分。

为了查看咱们的嵌入是否正在捕获与咱们的问题相关的信息(即推文是否与灾难有关),最好将它们可视化并查看类看起来是否分离得很好。因为词汇表一般很是大,而且不可能以20,000维度可视化数据,所以像PCA这样的技术将有助于将数据投影到二维。这个绘制以下。

                            可视化词袋嵌入

这两个类看起来分离不是很好,这多是咱们嵌入的一个特征,或者仅仅是咱们降维的一个特征。为了查看Bag of Words功能是否有用,咱们能够根据它们训练分类器。

第4步:分类

当第一个接近问题时,通常的最佳作法是从能够解决工做的最简单的工具开始。不管什么时候对数据进行分类,其多功能性和可解释性的共同点都是Logistic回归。训练很是简单,结果能够解释,由于您能够轻松地从模型中提取最重要的系数。

咱们将数据分红一个训练集,用于拟合咱们的模型和一个测试集,以查看它对未见数据的归纳性。通过培训,咱们获得75.4%准确率。不是太寒酸!猜想最频繁的分类(“不相关(irrelevant)”)将只给咱们57%。然而,即便75%的精度足以知足咱们的需求,咱们也毫不应该在不试图了解它的状况下运送模型。

第五步:检查

混乱矩阵

第一步是了解咱们的模型所犯的错误类型,以及哪一种错误是最不可取的。在咱们的示例中,false positives将不相关的推文分类为灾难,而false negatives则将灾难归类为不相关的推文。若是优先考虑对每一个潜在事件做出反应,咱们会但愿下降咱们的false negatives。可是,若是咱们在资源方面受到限制,咱们可能会优先考虑较低的false positives率以减小误报。可视化此信息的一种好方法是使用混淆矩阵,该矩阵将咱们的模型预测与真实标签进行比较。理想状况下,矩阵将是从左上角到右下角的对角线(咱们的预测彻底匹配真相)。

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

咱们的分类器比 false negatives(按比例)产生更多的false positives 。换句话说,咱们模型最多见的错误是将灾难分类为不相关。若是false positives表明了执法的高成本,那么这对咱们的分类者来讲多是一个很好的偏见。

解释咱们的模型

为了验证咱们的模型并解释其预测,重要的是要查看它用于作出决策的单词。若是咱们的数据有误差,咱们的分类器将对样本数据作出准确的预测,但该模型在现实世界中不会很好地归纳。在这里,咱们为灾难和无关的分类绘制最重要的单词。使用Bag of Words和Logistic回归绘制单词重要性很简单,由于咱们能够提取和排列模型用于其预测的系数。

                           Bag of words:词重要性

咱们的分类器正确地采用了一些模式(广岛,大屠杀),但显然在某些无心义的术语上过分拟合(heyoo,x1392)。如今,咱们的Bag of Words模型正在处理不一样单词的巨大词汇并平等对待全部单词。然而,这些词中的一些是很是频繁的,而且只会对咱们的预测产生噪音。接下来,咱们将尝试一种方法来表示能够解释单词频率的句子,看看咱们是否能够从咱们的数据中获取更多信号。

第六步:考虑词汇结构

TF-IDF

为了帮助咱们的模型更多地关注有意义的单词,咱们能够在咱们的Bag of Words模型之上使用TF-IDF分数(Term Frequency,Inverse Document Frequency)。TF-IDF根据它们在咱们的数据集中的稀有程度对单词进行加权,对过于频繁的单词进行折扣并仅添加噪声。这是咱们新嵌入的PCA投影。

                             可视化TF-IDF嵌入

咱们能够看到上面两种颜色之间有更明确的区别。这应该使咱们的分类器更容易 分离两个组。让咱们看看这是否会带来更好的性能。在咱们的新嵌入体上训练另外一个Logistic回归,咱们获得76.2%的准确度。

一点点改进。咱们的模型是否开始接受更重要的词汇?若是咱们在防止咱们的模型“做弊”的同时得到更好的结果,那么咱们能够真正认为这个模型是升级。

                                TF-IDF:单词重要性

它所拾取的单词看起来更相关!尽管咱们的测试集上的指标仅略有增长,但咱们对模型使用的术语更有信心,所以在将与客户交互的系统中部署它时会感受更舒服。

第7步:利用语义

Word2Vec

咱们最新模型设法得到高信号词。可是,若是咱们部署此模型,咱们极可能会遇到之前在训练集中没有看到过的单词。即便在培训期间看到很是类似的单词,以前的模型也没法准确地对这些推文进行分类。

为了解决这个问题,咱们须要捕捉词语语义,这意味着咱们须要理解像“好”和“积极”这样的词比“杏”和“大陆”更接近。咱们将用来帮助咱们捕获意义的工具称为Word2Vec。

使用预先训练过的单词

Word2Vec是一种查找单词连续嵌入的技术。它经过阅读大量文本并记住哪些词语倾向于出如今相似的语境中来学习。在对足够的数据进行训练以后,它为词汇表中的每一个单词生成300维向量,其中具备类似含义的单词彼此更接近。

该报告的做者论文开源了一个很是大的语料库,咱们能够利用到包括语义一些知识转化成咱们的模型这是预先训练的典范。能够在与此帖相关联的存储库中找到预先训练的向量。

句子级别表示

为咱们的分类器设置句子嵌入的快速方法是平均句子中全部单词的Word2Vec分数。这是一个像以前同样的Bag of Words方法,但此次咱们只丢失了句子的语法,同时保留了一些语义信息。

                              Word2Vec句子嵌入

如下是使用之前技术的新嵌入的可视化:

                              可视化Word2Vec嵌入

这两组颜色看起来更加分离,咱们的新嵌入应该有助于咱们的分类器找到两个类之间的分离。在第三次训练相同模 型(Logistic回归)后,咱们获得77.7%的准确度得分,咱们的最佳结果呢!是时候检查咱们的模型了。

复杂性/可解释性权衡

因为咱们的嵌入不像咱们以前的模型那样表示为每一个单词一维的向量,所以很难看出哪些单词与咱们的分类最相关。虽然咱们仍然能够访问Logistic回归的系数,但它们与嵌入的300维有关,而不是单词的索引。

对于如此低的准确度增益,失去全部可解释性彷佛是一种严厉的权衡。可是,对于更复杂的模型,咱们能够利用LIME黑盒解释器,以便深刻了解分类器的工做原理。

LIME

LIME 经过开源软件包在Github上得到。黑盒解释器容许用户经过扰乱输入(在咱们的状况下从句子中删除单词)并查看预测如何变化来解释任何分类器在一个特定示例上的决定。

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

                 挑选正确的灾难词语以归类为“相关”。
               在这里,单词对分类的贡献彷佛不太明显

可是,咱们没有时间探索数据集中的数千个示例。咱们要作的是在有表明性的测试用例样本上运行LIME,看看哪些词会继续成为强大的贡献者。使用这种方法,咱们能够像之前的模型同样得到单词重要性分数,并验证模型的预测。

                                Word2Vec:单词重要性

看起来该模型选择了高度相关的词语,暗示它彷佛作出了能够理解的决定。这些彷佛是之前全部型号中最相关的词,所以咱们更愿意部署到生产中。

步骤8:使用端到端方法利用语法

咱们已经介绍了生成紧凑句嵌入的快速有效方法。可是,经过省略单词的顺序,咱们将丢弃句子的全部句法信息。若是这些方法不能提供足够的结果,您可使用更复杂的模型,将整个句子做为输入并预测标签,而无需构建中间表示。要作到这一点的经常使用方法是把一个句子中的单词矢量序列使用或者Word2Vec或更近的方法,好比GloVeGoVe。这是咱们将在下面作的。

                          高效的端到端架构( 源代码

用于句子分类的卷积神经网络训练很是快,而且做为入门级深度学习架构运行良好。虽然卷积神经网络(CNN)主要以其在图像数据上的性能而闻名,但它们在文本相关任务上提供了出色的结果,而且一般比大多数复杂的NLP方法(例如LSTM编码器/解码器架构)更快地进行训练。该模型保留了单词的顺序,并学习了有关哪些单词序列能够预测目标类的有价值信息。与以前的型号相反,它能够区分“Alex吃植物”和“植物吃Alex”之间的区别。

训练此模型不须要比之前的方法更多的工做(详见代码),并为咱们提供了比之前更好的模型,准确度达到79.5%!与上述模型同样,下一步应该是使用咱们描述的方法探索和解释预测,以验证它确实是部署到用户的最佳模型。到如今为止,您应该本身解决这个问题。

最后的笔记

如下是咱们成功使用的方法的简要回顾:

  • 从快速简单的模型开始
  • 解释它的预测
  • 了解它正在犯的错误
  • 使用该知识为下一步提供信息,不管是对您的数据仍是更复杂的模型。

这些方法适用于特定的示例案例,使用为理解和利用短文本(如推文)而定制的模型,但这些思想普遍适用于各类问题。我但愿这对你有帮助,咱们很乐意听到你的意见和问题!

点击英文原文

更多文章欢迎访问 http://www.apexyun.com/

联系邮箱:public@space-explore.com

(未经赞成,请勿转载)

相关文章
相关标签/搜索