品玩网

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

2022-06-16 23:09:13


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


文本数据的 5W 和 1H!


文本数据无处不在


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


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


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

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

根据意图对文本进行分类(例如寻求一般帮助,紧急问题)


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


本文给你的帮助


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


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


收集、准备和检验数据

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

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


这篇文章我们将给你提供一步一步的指导;也可以作为一个提供有效标准方法的高水平概述。


这篇文章附有一个交互式 notebook,演示和应用了所有技术。你可以随意运行代码,同步学习:https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb


第 1 步:收集数据


数据源示例


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


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

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

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


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


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


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


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


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


标签


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


Richard Socher 的小建议


第 2 步:清理数据


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


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


下面是一个清理数据的清单:(更多细节见代码 code (https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb)):




将嵌入的词袋可视化。


看起来很难分为两类,也不好去降低维度,这是嵌入的一个特点。为了了解词袋模型特征是否有用,我们可以基于它们训练一个分类器。


第 4 步:分类器


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


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

第 5 步:检验


混淆矩阵(Confusion Matrix)


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






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



这里,这个词对分类器的造成的影响似乎不太明显。


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



Word2Vec:重要单词


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


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


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



高效的端到端结构


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


训练这个模型不用比之前的模型做更多的工作,并且效果更好,准确率达到了 79.5%!详见代码:https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb


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


结语


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


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

解释其预测

了解其错误类型

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


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

更多精彩内容关注公众号《智能制造与数字孪生》,干货内容与你分享!

上一篇:

下一篇:

Copyright© 2015-2020 品玩网版权所有