当前位置: 首页 > 科技观察

教你如何解决90%的NLP问题

时间:2023-03-18 13:07:08 科技观察

介绍:作者EmmanuelAmeisen将在本文中一步步指导你如何使用机器学习方法解决大部分NLP问题。文章中将列举一个典型的分类案例——推特内容是否与灾难事件相关,详细说明我们应该如何处理文本数据。文本数据无处不在,无论是成熟的企业,还是即将上线的新业务,都可以利用文本数据来验证、完善和扩展产品的功能。这种从文本数据中提取意义和学习的科学称为自然语言处理(NLP),它是目前非常热门的研究课题。NLP是一个非常大的研究领域,它每天都会产生一些令人兴奋的新结果。在与数百家公司合作后,我们的Insight团队发现了几个关键的实际应用,这些应用会更频繁地出现:识别用户/客户的不同用户群(如预测用户流失、生命周期价值、产品偏好等)提取反馈分类(例如正面和负面评论/意见,提及一些特殊属性,如衣服尺码、舒适度等)基于意图的文本分类(例如一般帮助请求、紧急问题处理)给定多少篇文章和教程NLP存在于网络上,我们发现很难找到处理这些问题的全面指导或建议。本文如何为您提供帮助一年来,我们参与了数百个项目,并根据美国顶级团队的意见,编写了这篇文章,以说明如何使用机器学习来解决上述问题。我们将从最简单、最可行的方法开始,然后逐步进行更详细的解决方案,例如特征工程、词向量和深度学习。阅读本文后,您将知道如何:从简单模型开始收集、准备和测试数据,必要时使用深度学习来转换解释和理解模型,以确保您实际捕获的是有用的信息而不是噪音文章是分步操作指南和高效标准化过程的高级概述。这篇文章还附有交互式说明,演示并应用了所有涉及的技术。您可以尝试在运行代码时阅读以下内容。第1步:收集样本数据数据源每个机器学习问题都始于数据,例如一组电子邮件、帖子或推文。文本信息的常见来源包括:产品评论(来自亚马逊、Yelp和其他应用程序商店)用户生成的内容(推文、Facebook帖子、StackOverflow问题等)解决问题(客户请求、技术支持、聊天记录)“灾难”inSocialMedia”数据集在本文中,我们将使用CrowdFlower提供的名为“DisastersonSocialMedia”的数据集。贡献者查看了10,000多条带有“火灾”、“隔离”、“混乱”等搜索词的推文,并标记了这条推文是关于灾难性事件(而不是笑话、电影评论等)还是一些非灾难性事件事件)。我们的任务是区分哪些推文真正与灾难事件相关,而不是一些不相关的主题,如电影描述。为什么?一个潜在的应用是专门提醒执法人员注意紧急情况,而不会被其他不相关的信息分散注意力,例如亚当桑德勒的新电影。此任务的一个特殊挑战是,两种情况在搜索推文时都使用相同的搜索词,因此我们只能通过细微差别来区分它们。在接下来的文章中,我们会将与灾难性事件相关的推文称为“灾难”,将其他推文称为“无关紧要”。标记我们已经标记了数据,所以我们知道推文是如何分类的。正如RichardSocher所说,找到并标记足够的数据来训练模型比优化复杂的无监督学习方法更快、更容易、成本更低。RichardSocher的高级技术第2步:清理数据我们遵循的第一个原则是:“你的模型必须和你的数据一样好。”数据科学家必须具备的一项技能是知道你的下一步操作是处理模型还是数据。一个好的经验法则是先观察数据然后清理它。干净的数据集使模型能够学习有意义的特征,而不会受到一些不相关噪声的影响。数据清洗可以参考下面的列表:(更多信息见代码)Removeallirrelevantcharacters,suchasanynon-alphanumericcharactersTomarkyourtext,splitthemintoindependentwordsRemoveirrelevantwords,suchas@suchreminders或url链接将所有字母转换为小写,这样“hello”、“Hello”、“HELLO”将被视为同一个单词将拼写错误的单词或具有多个拼写的单词绑定到特定表达式(例如:“cool”/"kewl"/"cooool")考虑词形还原(例如将“am”、“are”、“is”视为“be”)来完成这些步骤并检查其他错误后,我们可以使用这个干净的、带标签的数据进行模型训练!第3步:找到数据的良好表示机器学习模型将使用值作为输入。例如,用于处理图像的模型将使用表示每个颜色通道像素亮度的矩阵。由数字矩阵表示的笑脸我们的数据集是一系列句子。为了让我们的算法从数据中提取特征,我们首先需要找到一个算法可以理解的表达式,比如一串数字。One-hotencoding-BagofWords计算机解释文本的一种常用方法是将每个字符编码为单独的数字(例如ASCII码)。使用这个简单的表达式作为分类器需要我们的数据从头开始学习单词的结构,这对于大多数数据集来说很难实现。所以我们需要一个更高层次的方法。例如,我们可以为数据集中的所有单词创建一个词汇表,并将每个单词与一个唯一索引相关联。每个句子由一串数字组成,对应于词汇表中独立单词的数量。通过列表中的索引,我们可以统计一个词在句子中出现的次数。这种方法称为词袋模型,它完全忽略了句子中单词的顺序。如下图所示:句子用词袋模型表示。句子在左边,模型表达式在右边。向量中的每个索引代表一个特定的词。嵌入可视化将在“社交媒体灾难”示例词汇表中包含大约20,000个单词,这意味着每个句子将由一个长度为20,000的向量表示。大多数向量将被零填充,因为每个句子只包含词汇表的一小部分。为了查看嵌入是否真的在捕获与问题相关的信息(例如推文是否与灾难有关),一个好方法是将它们可视化并查看结果是否具有良好的分布。考虑到词汇量通常很大,20000维的数据基本无法可视化,我们使用了PCA等技术将数据降维到二维。绘制如下:词袋嵌入的可视化这两个类似乎没有很好地分离,这可能是我们选择的嵌入方法的一个特征,或者仅仅是由于降维。为了查看词袋特征是否有用,我们可以尝试基于它训练分类器。第四步:分类在第一次接触问题时,通常最好的方法是先挑选最简单的能够解决问题的工具。在数据分类方面,一般首选通用且可解释的逻辑回归算法。该算法易于训练且结果可解释,您可以轻松地从模型中提取最重要的系数。我们将数据分成两组,训练集用来匹配模型,测试集用来观察应用对未知数据的影响。经过训练,我们得到了75.4%的准确率。结果还不错!最假定的类别(“无关紧要”)只能达到57%。然而,即使是75%的准确率也足够好,我们不能在不了解它的情况下开始应用该模型。第5步:检查混淆矩阵第一步是了解我们的模型会产生哪些类型的错误,以及我们最不希望出现哪些错误。在示例中,误报是指将不相关的推文归类为灾难,漏报是指将真实的灾难归类为无关紧要。如果我们需要优先响应所有潜在事件,我们需要降低漏报率。如果资源有限,我们需要优先考虑降低误报率来减少误报。我们可以使用混淆矩阵可视化此信息,该矩阵将模型的预测与真实标签进行比较。理想情况下,矩阵会形成一条从左上角到右下角(预测值和真实值完全匹配)的对角线。混淆矩阵(绿色比例高,蓝色比例低)我们的分类器产生的假阴性比假阳性多(按比例)。换句话说,我们模型最常见的错误是将灾难性事件错误分类为不相关的类别。如果误报的执法成本很高,这对我们的分类器来说可能是一件好事。解释和解释模型为了验证我们的模型并解释其预测,我们需要观察它使用哪些词来做出决定。如果我们的数据本身是有偏差的,分类器可以根据样本数据做出准确的预测,但是将模型应用到现实世界中的结果就不会很理想。我们在灾难类和无关类中绘制了一些最重要的词。使用词袋模型和逻辑回归来绘制词的重要性非常简单,我们只需要提取和排序模型在预测时使用的系数即可。词袋:词的重要性我们的分类器正确地拾取了一些特征(hiroshima、massacre),但显然过度拟合了无意义的词(heyoo、x1392)。现在,我们的词袋模型处理大量词汇,每个词都被平等对待。然而,有些词出现的频率很高,以至于它们只会对预测产生干扰。接下来,我们将尝试以一种考虑词频的方式来表示句子,看看我们是否可以从数据中获得更多信息。第六步:解释词结构TF-IDF为了让我们的模型更关注有意义的词,我们可以对词袋模型进行TF-IDF(TermFrequency,InverseDocumentFrequency)评分。TF-IDF根据单词在数据集中的稀有性对它们进行评分,并修剪一些出现过于频繁且只会增加噪音的单词。下面是我们新嵌入的PCA投影:TF-IDF嵌入的可视化正如我们在上图中看到的,两种颜色的区别更加明显。这使我们的分类器更容易??区分两组。让我们看看这是否会带来更好的结果。另一个用我们的新嵌入训练的逻辑回归模型达到了76.2%的准确率。这是一个非常小的改进。我们的模型是否开始注意到更重要的词?如果我们在保证模型不“欺骗”行为的情况下得到更好的结果,那么就可以认为模型得到了改进。TF-IDF:单词重要性所选单词看起来更相关!虽然我们测试集的矩阵只是稍微增加了一些,但是我们对模型选择的词汇更有信心,所以我们可以更有信心的将它部署到一些需要与客户交互的系统中。第7步:使用语义Word2Vec我们最先进的模型设法注意到高级信号词。但是如果我们部署这个模型,很有可能会遇到训练集中没有出现的词。那么之前的模型可能无法准确地对这些推文进行分类,即使它在训练过程中遇到了相似的词。为了解决这个问题,我们需要捕捉单词的语义,这意味着我们需要理解“good”和“positive”比“apricot”和“continent”更接近。我们将使用一个名为Word2Vec的工具来帮助我们获得意义。使用预训练的单词Word2Vec是一种用于查找单词的连续嵌入的技术。它通过阅读大量文本并记住出现在相似上下文中的单词来学习。在对足够的数据进行训练后,它为词汇表中的每个单词生成一个300维的向量,具有相似含义的单词靠得更近。这篇文章的作者开源了一个在大型语料库上预训练的模型,我们可以利用它来将一些语义知识引入到我们的模型中。可以在本文的存储库中找到预训练向量。句子级表示将句子快速嵌入到我们的分类器中的一种方法是对句子中所有单词的Word2Vec分数进行平均。我们使用与之前相同的词袋方法,但这次我们只丢失了句子的语法,同时保留了一些语义信息。Word2VecSentenceEmbeddings下面是使用前面描述的技术形成的新嵌入的可视化:Word2Vec嵌入更清楚地可视化两组颜色,这次新嵌入将帮助我们的分类器找到两个类之间的分离。同一个模型训练三次(逻辑回归)后,我们得到了77.7%的准确率,这是迄今为止最好的结果!是时候测试模型了。复杂性/可解释性权衡考虑到在以前的模型中,我们的嵌入没有表示为每个词的一维向量,因此更难判断哪些词与我们的分类最相关。但是我们仍然可以使用逻辑回归系数,因为它与我们嵌入的300个维度有关,而不是与单词的索引有关。对于如此小的准确性增益,失去所有可解释性似乎是一个苛刻的权衡。但是当处理更复杂的模型时,我们可以利用像LIME这样的黑盒解释器来查看我们的分类器是如何工作的。LIMELIME在Github上作为开源包提供。黑盒解释器允许用户使用典型示例解释任何分类器的决策,方法是扰乱输入(在我们的例子中,从句子中删除单词)以观察预测的变化。让我们看一下数据集中句子的一组解释。正确的灾难词汇被分类为“相关”这里,单词对分类的影响似乎并不明显,但我们没有时间去探索数据集中数以万计的案例。相反,我们在一个有代表性的测试样本上运行LIME,以查看哪些词始终贡献很大。使用这种方法,我们能够像以前的模型一样获得单词重要性分数并验证模型的预测。Word2Vec:找到高度相关的词的词重要性模型似乎能够做出可以理解的决定。这些应该是使用以前的模型生成的最相关的词,因此我们可以更有信心地转向生产。第八步:用端到端的方法处理语法上一篇文章的内容涵盖了快速高效地生成紧凑句嵌入的方法。然而,通过忽略单词的顺序,我们会丢失句子中的所有语法信息。如果这些方法不能提供足够有效的结果,您可以使用更复杂的模型,将整个句子作为输入并预测标签,而无需构建中间表示。一种常见的方法是使用Word2Vec或一些较新的方法(例如GloVe或CoVe)将句子视为一系列独立的词向量。我们将在下面这样做。一种高效的端到端架构(来源)用于句子分类的卷积神经网络(CNN)训练速度非常快,是非常有用的入门级深度学习架构。CNN以其在图像数据上的性能而闻名,但它们在文本相关任务上也能提供出色的结果,并且通常比大多数复杂的NLP算法(例如LSTM和编码器/解码器架构)训练速度更快。该模型保留了单词的顺序,并从我们预测单词顺序的目标类中学习了有价值的信息。与之前的模型相反,他可以区分“Alexeatsplants”和“PlantseatAlex”。训练这个模型不会比之前的方法费力(更多细节请参考代码),但是效果会比之前的更好,准确率可以达到79.5%!使用上述模型,我们接下来的步骤将是探索和解释我们描述的方法所做的预测,以验证这确实是可以交付给用户的最佳模型。现在,您可以安全地尝试自己动手了。***让我们快速浏览一下前面提到的成功方法:从一个快速简单的模型开始解释其预测了解它所犯的错误它是否有效,还是需要更复杂的模型?这些方法适用于特定案例,模型可以理解和处理推文等小文本,但这种思维模式可以广泛应用于其他问题。希望本文能对您有所帮助,也希望能听到您的一些建议或咨询!欢迎在下方发表评论,或在此处或Twitter上联系EmmanuelAmeisen。