怎样用机器学习8步解决90%的天然语言处理问题?

欢迎关注咱们,AI教程、趣味科普、论文解读,一网打尽!


文本数据无处不在git

无论你身处已经开张的公司仍是即将开展的新业务,均可以利用文本数据去验证、优化和扩展产品性能。而从文本数据中学习和提取价值的研究科学就叫作天然语言处理(NLP)。github

NLP 天天都能产生新奇而又使人兴奋的结果,也是一个很大的领域。然而,纵观不少公司对NLP 的应用,下面这些应用频繁出现:算法

  • 识别不一样类型的用户/顾客(例如,预测波动情况,终身价值,产品偏好)网络

  • 精准检测和提取不一样种类的反馈(负面或正面评论/意见,说起的特别属性,如衣服尺码/合身与否)架构

  • 根据目标分类文本数据(例如,用户请求的是基本帮助仍是紧急问题)机器学习

虽然当前网上已经有不少 NLP 论文和教程,可是不多介绍怎样从头开始有效解决这些问题的指南和窍门。工具

本文将怎样帮到你post

本文会解释如何用机器学习方法解决上面提到的问题,咱们会介绍一些最简单也有效的方法,而后再谈谈复杂些的方法好比特征工程、词向量和深度学习。性能

阅读本文后,你会知道怎样:学习

  • 收集、准备和检查数据

  • 搭建简单的模型,若是须要,开始和转移至深度学习

  • 演绎和理解你的模型,确保你在获取正确的信息而不是噪声数据

本文是一篇逐步解决问题的教程(建议先收藏,后面一步步动手实践),也能够看做解决 NLP 问题的标准方法的高度归纳。

第一步:收集数据

样本数据来源

每一个机器学习问题都是以数据开始,好比邮件列表、博文或社交网站发布的状态等。

常见文本数据来源包括:

  • 产品评论(如电商网站、点评网站、应用商店上的评论)

  • 用户生成内容(微博、推特、脸书上发布的状态;Quora、知乎等问答网站的问题)

  • 疑难解答(顾客请求,支持问题,聊天记录)

“社交媒体灾难”数据集(“Disasters on Social Media”)

在本文,咱们使用 CrowdFlower 提供的一个数据集,叫作 “社交媒体灾难”

该数据集收集了超过1万条推特推文,包含“着火”“隔离”“混乱”这样的词汇,而后注明推文中说起的灾难事件是否发生过。

咱们的任务是检测哪些推文是和真实灾难有关,而不是某个不相关的话题好比灾难电影。为何是这样?社交网站上可能会添加一项功能专门提醒执法官员出现了紧急状况,但同时不会将灾难电影的评论也考虑在内。这项任务的一个主要挑战就是上面这两种推文都包含一样的搜索关键词,所以咱们必须利用微妙的差别去区分它们。

如下咱们会将关于灾难的推文引述为“灾难推文”,将关于其它事情的推文引述为“无关推文”。

标签

咱们已经将数据打上标签,所以咱们知道哪些推文属于哪一个类别。如图 Richard Socher 以下所说,找到和标记足够的数据来训练模型,每每比试图优化一个很复杂的无监督式方法要快得多、简单的多,也省时省力的多。

第2步:清洗数据

咱们首先要清楚:“你的模型质量始终和数据的质量一致”

数据科学家的一项核心技能就是知道下一步是该处理数据仍是模型。一个好方法就是先检查数据,而后清洗数据。一个干净的数据集会让模型学习到有意义的特征,而不会过拟合无关的噪声数据。

下面是清洗数据的方法列表:

  • 删除全部可有可无的文字好比任何非字符数值的文字。

  • 将文本数据分割为单独文字,也就是将文本数据进行tokenize(将一行拆分为单词长度的片断)。

  • 将全部文字转换为小写字母,目的是将“Hello”“hello”“HELLO”这样的字词一视同仁。

  • 考虑将拼错的单词或交替拼写的单词合并为一个单独的表达方式(好比cool/kewl/coool)。

  • 考虑词形还原(例如将“am”“are”“is”这样的词缩减为常见的表达形式“be”)。

点击连接可查看上述步骤的代码。

遵循以上步骤后,再检查一下其它的错误,而后咱们就能够开始清理和标记数据用于训练模型了!

第三步:找到合适的数据表示形式

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

咱们的数据集是一系列的句子,因此为了能让咱们的算法提取出数据的模式,咱们首先须要找到一个合适方式表示数据,能让咱们的算法理解它,好比,一列数字。

独热编码(One-hot encoding)(词袋模型)

为计算机表示文本数据的一个天然方式就是将每一个字单独编码为一个数字(例如 ASCII)。若是咱们用这种简单表示形式的数据输入分类器,那么它必须从头开始根据咱们的数据学习词汇的结构,这对大多数数据集来讲是行不通的。咱们须要一种更高水平的方法。

例如,咱们能够给数据集中全部特殊的词建立一个词表,为词表中每一个词关联一个特殊索引。而后将每一个句子表示为一个列,和词表中特殊词的数目同样长。在这个列的每一个索引上,咱们标记出给定词在句子中出现的次数。这种方法就叫作词袋模型,由于它的表示形式彻底忽略了句子中词汇的顺序。该模型以下图所示:

可视化词嵌入模型

在本文的“社交媒体灾难”样本中,咱们的词表中大约有 2 万个词汇,这意味着每一个句子会表示为一个长度为 20000 的向量。该向量大部分状况下元素为 0,由于每一个句子只是词表的一个很是小的子集。

为了看清咱们的嵌入是否获取了和咱们的问题相关的信息(例如,推文是否关于灾难),将它们可视化是个很好的方式,能够看清是否很好地进行了分类。因为词表一般很大,于是可视化 2 万个维度的数据是不可能的,像 PCA(主成分分析)这样的方法有助于将数据降至 2 个维度,以下图所绘:

这两个类别看起来并无很好的分离,这多是由于咱们嵌入的某个特征,或仅仅是下降的特征维度。要想看看词袋模型学习到的特征有没有用,咱们能够根据它们训练一个分类器。

第四步:分类

当解决一个问题时,一般最好的实践方法就是先以能解决问题的最简单的工具开始。无论是何时分类数据,从功能性和可解释性的角度讲,最多见的方式是逻辑回归。训练逻辑回归很是简单,结果也是可解释的,咱们能够很容易地从模型中提取最重要的系数。

咱们将咱们的数据切分为一个用于训练模型的训练集,和一个用于检验模型性能的测试集。在训练后,咱们的模型准确率达到了 75.4%。emmmm...还不赖!不过,即使 75%的准确率足以知足咱们的要求,咱们也必须在应用模型前对它有个全面的了解。

第五步:检查

混淆矩阵

第一步是理解咱们模型所犯错误的类型,以及咱们最不但愿出现哪一种错误。在本文例子中,假阳性是将“不相关推文”分类为“灾难推文”,假阴性是将“灾难推文”分类为“不相关推文”。若是优先选项是对每一个潜在的事件作出反应,咱们会但愿下降假阴性。然而,若是资源受限,咱们可能会优先下降假阳性,以下降错误警报。将这种信息可视化的一个好方法就是用混淆矩阵,它会将咱们模型的预测和实际标签进行比较。理想情况下,矩阵会是一个自左上角至右下角的对角线(咱们模型的预测和实际状况匹配的很好)。

咱们的分类器建立的假阴性样本要多于假阳性样本。换句话说,咱们模型的常见错误是没有准确地将“灾难推文”分类为“不相关推文”。若是假阳性样本表明执法人员的成本很高,那么这种错误能够算是咱们模型的一个好的误差。

解释和演绎模型

为了验证模型和演绎模型的预测,查看模型使用什么词汇作出决策很是重要。若是咱们的数据存在偏置,那么分类器会对样本数据作出准确的预测,但模型在现实状况中不会很好地泛化未见数据。这里咱们为“灾难推文”和“不相关推文”划分出最重要的词汇。使用词袋模型和逻辑回归划出词汇的重要性很简单,由于咱们只需提取模型用于作出预测的系数,并将系数排名。

咱们的分类器正确地识别出一些模式,但很明显在某些无心义的词上存在过拟合现象。如今,咱们的词袋模型能处理庞大词汇表内的不一样词汇,并对全部的词汇分配相同的权重。然而,其中有些词出现的很是频繁,只会给模型的预测带来干扰。下一步,咱们会尝试用可以计算词汇频率的方式表示句子,以此弄清咱们是否能从数据中获取更多的信号。

第六步:计算词汇结构

TF-IDF 嵌入模型

为了帮助咱们的模型更多的关注有意义的词汇,咱们能够在词袋模型上使用 TF-IDF 评分(词频-逆向文件频率)。TF-IDF 会根据词汇在数据集中的稀有程度为词汇赋予权值,不考虑词汇是否过于频繁。下面是咱们 TF-IDF 嵌入模型的 PCA 映射:

从上图咱们能够看到,两种颜色之间的不一样更加清晰。这能让咱们的分类器更容易地将两组数据分离。咱们看看这是否会提升模型的性能。用新模型上训练另外一个逻辑回归后,咱们获得了 76.2%的正确率。

虽然稍微有些改善,但咱们的模型开始选择更重要的词汇了吗?若是咱们在防止模型“做弊”的同时,获得的结果也愈来愈好,那么咱们就能够真的相信模型确实获得了改进。

模型选择的词汇看起来比以前相关多了!虽然咱们测试集中的权值仅增长了一点点,但咱们对模型有足够的信心,这样就能够放心大胆地部署模型了。

第七步:利用语义信息

Word2Vec

TF-IDF 嵌入模型可以学习到信号更高频的词汇,可是若是咱们部署这个模型,咱们极可能会遇到在训练集中从未见过的词汇。以前的模型就不能准确分类这些推文,即使在训练中见过很是相近的词汇。

为了解决这个问题,咱们须要获取词汇的语义意义,也就是说咱们须要理解像“good”(好的)和“positive”(正的)这样的词汇之间的语义,比“apricot”(杏子)和“continent”(大洲)之间的语义要相近的多。帮咱们获取词汇语义意义的工具叫作Word2Vec。

使用预训练模型

Word2Vec 是 Google 开源的一款用于词向量计算的工具。它能够经过阅读大量的文本和记忆哪些词倾向于出如今相同语境中进行学习。在用足够多的数据训练 Word2Vec 后,它会为词表中的每一个词汇生成一个 300 维度的向量,而且意思相近的词汇离得更近。

有人开源了一个用超大数据集训练而成的预训练模型,咱们能够利用它将一些语义方面的知识添加进咱们的模型。预训练向量能够在本教程的相关代码仓库中找到。

语句分级表示

为咱们的分类器获得句式嵌入(sentence embedding)的快速方法就是用 Word2Vec 给咱们句子中全部的词评分。这其实就是咱们刚才用的词袋模型法,但此次咱们只丢弃句子的语法,而保留语义信息。

下面是用刚才提到的方法将咱们的新嵌入可视化后的效果:

这两种颜色群组看起来进一步分离,咱们的新嵌入应该帮助了分类器发小两种类别的分离之处。又一次训练这个模型后,咱们获得了 77.7% 的准确率,迄今最好结果!是时候检查模型了。

复杂性与可解释性之间的权衡取舍

因为新模型没有像以前模型那样,将单词表示为一个一维向量,于是查看和咱们的分类最相关的词汇更难了。虽然咱们仍然能获取逻辑回归的系数,但它们和咱们词汇的 300 个维度相关而非词汇的索引。

虽然模型的准确度有所提升,但若是没法进行可解释性分析那就有点得不偿失了。然而,若是模型的复杂性进一步提升,咱们能够用 LIME 这样的“黑盒解释器”,从而对分类器的工做原理有一点了解。

LIME

能够在 GitHub 上获取 LIME 的开源工具包

黑盒解释器可让用户经过扰乱输入(在咱们的案例中是从句子中移除单词)和查看预测的改变状况,根据一个特定的例子就能解释任何分类器作出的决策。

咱们看几个对咱们数据集中的语句所作的解释:

图:正确分类的灾难性词汇被归类为“相关”

图:这个词对分类的影响彷佛不太明显

然而,咱们并无时间探究数据集中的数千个样本。相反,咱们会在测试集的表明样本上运行 LIME ,看看哪些词对分类预测的影响一直很大。经过这种方式,咱们能够像以前同样获取单词的重要性分数,验证模型的预测结果。

看来模型可以提取高度相关的词汇,代表它能作出可解释的决定。这些词的相关度在全部模型中彷佛是最高的,所以咱们会更愿意部署这样的模型。

第八步:用端到端的方法使用语法信息

咱们已经介绍过怎样快速高效地生成紧凑的句子嵌入。不过,经过省略了词汇的顺序,咱们也放弃了句子的所有语法信息。若是这些方法未能产生满意的结果,你可使用更复杂的模型:将整个句子做为输入和预测标签,并没有需建立中间表示。这么作的一个常见方法是将句子看做词向量的序列,使用 Word2Vec 或一些新工具如 GloVe 和 coVe 等均可以。

下面咱们详细说说。

用于语句分类的卷积神经网络(CNN)训练起来很快,做为一个入门级的深度学习架构效果也很好。虽然 CNN 向来以处理图像数据著称,但它们在处理文本相关的任务上一样效果良好,并且经常比大多数复杂的天然语言处理方法速度快得多(好比 LSTM)。CNN 在保留词汇顺序的同时,还会学习词汇序列等有价值的信息。相较于以前的模型,它能区分出“Alex eats plants”(Alex 吃植物)和“Plants eat Alex”(植物吃 Alex)之间的不一样。

相比先前模型,训练 CNN 并不须要作更多工做,点击查看详细代码 ,并且获得的模型比咱们以前的模型性能还要好,准确率达到了 79.5% !

与前面介绍的步骤同样,下一步应该是用咱们讲的方法探究和解释模型的预测结果,以验证确实是能够部署的最佳模型。到了这一步,你应该能本身完成这里的操做了。

最后小结

咱们迅速回顾一下各步所用的方法:

  • 首先以一个简单迅速的模型着手

  • 解释模型的预测结果

  • 弄懂模型犯了什么类型的错误

  • 根据这些知识决定你的下一步——处理数据仍是应用更复杂的模型

虽然本教程所用的方法只用于特定的例子——使用合适的模型进行理解和应用推文这样的短文本,但这种理念和思路适用于各类问题。但愿本文对你有所帮助,若有问题和建议,欢迎提出!

向你推荐:

一文读懂CNN如何用于NLP

边看边练的简明机器学习教程

相关文章
相关标签/搜索