如何解决90%的NLP问题:一步一步的指导
文本数据无处不在
无论您是成立公司还是致力于推出新服务,您都可以利用文本数据来验证,改进和扩展产品的功能。从文本数据中提取意义和学习的科学是一个被称为自然语言处理(NLP)的活跃课题。
NLP是一个非常大的领域。但是,几个关键的实际应用比其他任何应用都要频繁得多:
识别用户/客户的不同群体(例如预测客户流失,生命周期价值,产品偏好)
准确地检测和提取不同类别的反馈(正面和负面评论/观点,提及衣服尺寸/适合度等特定属性)
根据意图对文本进行分类(例如请求基本帮助,紧急问题)
第1步:收集您的数据
示例数据源
每个机器学习问题都以数据开始,例如电子邮件,帖子或推文列表。文本信息的常见来源包括:
产品评论(亚马逊,Yelp和各种应用商店)
用户生成的内容(推文,Facebook帖子,StackOverflow问题)
疑难解答(客户请求,支持票据,聊天记录)
“社交媒体上的灾难”数据集
对于这篇文章,我们将使用CrowdFlower慷慨提供的一个名为“社交媒体灾难” 的数据集,其中:
投稿人查看了超过10,000条推文,搜索了“ablaze(着火)”,“quarantine(隔离)”和“pandemonium(混乱)”等各种搜索,然后注意到推文是否涉及灾难事件(而不是一个或一个电影评论之类的非灾难性的话开玩笑)。
我们的任务是检测哪些推文是关于灾难性事件的,而不是像电影这样的无关紧要的话题。为什么?潜在的应用是专门向执法人员通报紧急紧急情况,而忽视最近的亚当桑德勒电影的评论。这个任务的一个特别挑战是两个类都包含用于查找推文的相同搜索条件,因此我们必须使用更细微的差异来区分它们。
在这篇文章的其余部分中,我们将把有关灾难的推文称为“ 灾难 ”,并将其他推文称为“ 无关紧要的 ”。
标签
我们标记了数据,因此我们知道哪些推文属于哪些类别。正如Richard Socher在下面概述的那样,查找和标记足够的数据以训练模型通常更快,更简单且更便宜,而不是尝试优化复杂的无监督方法。
第2步:清理您的数据
数据科学家的关键技能之一就是了解下一步是否应该在模型或数据上工作。一个好的经验法则是先查看数据,然后清理它。一个干净的数据集将允许一个模型学习有意义的特征,而不是过度使用不相关的噪音。
以下是用于清理数据的清单:(请参阅代码以获取更多详细信息):
删除所有不相关的字符,例如任何非字母数字字符
将您的文本分离为单个词汇,以此进行标记
移除不相关的字词,例如“@”twitter提及或网址
将所有字符转换为小写字母,以便将诸如“hello”,“Hello”和“HELLO”等词语
考虑将拼写错误或拼写错误的单词与单个表示法(例如“cool”/“kewl”/“cooool”)相结合
考虑词法化(将“am”,“are”和“is”等词语缩小为诸如“be”之类的常见形式)
在遵循这些步骤并检查其他错误之后,我们可以开始使用干净的标记数据来训练模型!
第3步:找到一个好的数据表示
机器学习模型将数值作为输入。例如,对图像进行处理的模型采用代表每个颜色通道中每个像素强度的矩阵。
我们的数据集是一个句子列表,所以为了让我们的算法从数据中提取模式,我们首先需要找到一种方法来用我们的算法可以理解的方式来表示它,即作为数字列表。
热门编码(单词包)
表示计算机文本的一种自然方式是将每个字符分别编码为一个数字(例如ASCII)。如果我们要将这个简单的表示形式加入到分类器中,它将不得不根据我们的数据从头开始学习单词的结构,这对大多数数据集来说是不可能的。我们需要使用更高层次的方法。
例如,我们可以在我们的数据集中建立所有独特词汇的词汇表,并将唯一索引与词汇表中的每个词汇相关联。然后,每个句子都被表示为一个与我们词汇表中不同单词的数量一样长的列表。在此列表中的每个索引处,我们标记给定单词在我们的句子中出现的次数。这叫做Bag of Words模型,因为它是一种完全忽略我们句子中单词顺序的表示。如下所示。
可视化嵌入
我们在“社交媒体灾难”例子中的词汇量约为2万字,这意味着每个句子都会被表示为长度为20,000的矢量。该向量将包含大部分0,因为每个句子只包含我们词汇的一小部分。
为了查看我们的嵌入是否捕获与我们问题相关的信息(即推文是否与灾难有关),最好将它们可视化并查看这些类是否看起来很分离。由于词汇通常非常大,并且不可能在20,000个维度上可视化数据,所以像PCA这样的技术将有助于将数据投影到两个维度。这是绘制在下面。
这两个类看起来看起来不太好分开,这可能是我们嵌入的一个特征,或者仅仅是我们的维度降低。为了看看Bag of Words特征是否有用,我们可以根据它们来训练一个分类器。
第4步:分类
当第一次遇到问题时,一般的最佳做法是从可以解决工作的最简单的工具开始。无论何时涉及到对数据进行分类,其通用性和可解释性都是Logistic回归。训练非常简单,结果可以解释,因为您可以轻松从模型中提取最重要的系数。
我们将数据分成一组用于适合我们的模型和测试集的训练集,以了解它如何广泛应用于看不见的数据。训练结束后,我们获得了75.4%的准确度。不是太寒酸!猜测最频繁的班级(“无关紧要”)只会给我们57%。然而,即使75%的精度足够满足我们的需求,我们也不应该在没有试图理解的情况下发布一个模型。
第5步:检查
混淆矩阵
第一步是了解我们的模型产生的错误类型,以及哪种类型的错误是最不可取的。在我们的例子中,误报将不相关的推文分类为灾难,而漏报将灾难归类为不相关的推文。如果优先事项是对每一个潜在事件作出反应,我们会想要降低我们的假阴性。但是,如果我们受限于资源,我们可能会优先考虑较低的误报率,以减少误报。将这些信息可视化的一种好方法是使用混淆矩阵,将我们的模型与真实标签的预测进行比较。理想情况下,矩阵将是从左上角到右下角的对角线(我们的预测完美匹配真相)。
换句话说,我们模型最常见的错误是不准确地将灾难归类为不相关的。
说明和解释我们的模型
为了验证我们的模型并解释它的预测,重要的是要看它使用哪些词来做出决定。如果我们的数据有偏差,我们的分类器将对样本数据做出准确的预测,但该模型在现实世界中不能很好地推广。在这里,我们为灾难和不相关的课程绘制了最重要的单词。由于我们可以提取和排列模型用于预测的系数,因此使用Bag of Words和Logistic Regression来绘制单词重要性很简单。
我们的分类器正确地采取了一些模式(广岛,大屠杀),但显然似乎是过度拟合一些无意义的条款(heyoo,x1392)。现在,我们的Bag of Words模型正在处理不同单词的巨大词汇量,并平等对待所有单词。然而,其中一些词语非常频繁,并且仅对我们的预测产生了噪音。接下来,我们将尝试一种方式来表示可以说明单词频率的句子,以查看我们是否可以从数据中获取更多信号。
第6步:考虑词汇结构
TF-IDF
为了帮助我们的模型更专注于有意义的单词,我们可以在Bag of Words模型上使用TF-IDF评分(术语频率,逆文档频率)。TF-IDF通过我们数据集中的稀少度来衡量单词的重要程度,并将过于频繁的单词进行折扣,并增加噪音。这是我们新嵌入的PCA预测。
我们可以在上面看到,两种颜色之间有更明显的区别。这应该使我们的分类器更容易分离这两个组。让我们看看这是否会带来更好的表现。在我们的新嵌入方面培训另一个Logistic回归,我们得到了76.2%的准确性。
一个非常轻微的改进。我们的模型是否开始采用更重要的单词?如果我们在避免我们的模型“作弊”的同时获得更好的结果,那么我们可以真正将此模型视为升级。
它拾起的单词看起来更相关!尽管我们对测试集的衡量指标仅略有增加,但我们对模型使用的术语更有信心,因此将其部署在与客户交互的系统中会感觉更加舒适。
第7步:利用语义
Word2Vec
我们的最新型号设法采用高信号字。但是,如果我们部署这个模型,我们很可能会遇到我们之前在训练集中没有看到的单词。之前的模型将无法准确分类这些推文,即使它在培训期间看到了非常相似的单词。
为了解决这个问题,我们需要捕捉单词的语义含义,这意味着我们需要理解像'好'和'正'这样的词比'杏'和'大陆'更接近。我们将用来帮助我们捕捉意义的工具称为Word2Vec。
使用预先训练的单词
Word2Vec是一种为单词查找连续嵌入的技术。它通过阅读大量文本来学习,并记忆哪些词倾向于出现在相似的情境中。在对足够的数据进行训练之后,它会为词汇表中的每个单词生成一个300维矢量,并且相似含义的单词彼此更接近。
该报告的作者论文开源了一个非常大的语料库,我们可以利用到包括语义一些知识转化成我们的模型这是预先训练的典范。预先训练好的矢量可以在与这篇文章相关的存储库中找到。
句子级别表示
为我们的分类器获得句子嵌入的一种快速方法是对我们句子中所有单词的Word2Vec分数取平均值。这是一个像以前一样的词袋方法,但是这次我们只丢失了句子的语法,同时保留了一些语义信息。
以下是使用先前技术的新嵌入的可视化:
这两组颜色在这里看起来更加分离,我们的新嵌入应该有助于我们的分类器找到两个类之间的分离。第三次训练同一模型(Logistic回归)后,我们得到了77.7%的准确性分数,这是我们最好的结果!有时间检查我们的模型。
复杂性/可解释性的权衡
由于我们的嵌入没有像我们以前的模型那样被表示为每个单词一维的矢量,因此很难看出哪些单词与我们的分类最相关。虽然我们仍然可以访问Logistic回归的系数,但它们与我们嵌入的300个维度相关,而不是词汇索引。
对于如此低的准确度增益,失去所有可解释性似乎是一种苛刻的折衷。但是,对于更复杂的模型,我们可以利用黑盒解释器(如LIME)来了解我们的分类器如何工作。
LIME
Github通过开源软件包提供 LIME 。黑盒解释器允许用户通过扰乱输入(在我们的例子中从句子中移除单词)并观察预测如何变化来解释任何分类器在一个特定示例上的决策。
让我们来看看我们的数据集中的几个句子的解释。
但是,我们没有时间去探索数据集中的数千个示例。我们要做的是在测试用例的代表性范例上运行LIME,并看看哪些词汇继续成为强大的贡献者。使用这种方法,我们可以获得像以前模型一样的单词重要性分数,并验证模型的预测结果。
看起来这个模型提供了高度相关的词,暗示它似乎做出了可以理解的决定。这些看起来像是以前所有型号中最相关的词,因此我们更愿意部署到生产中。
步骤8:使用端到端方法来利用语法
我们已经介绍了生成紧凑句子嵌入的快速有效方法。但是,通过省略单词的顺序,我们放弃了句子的所有句法信息。如果这些方法不能提供足够的结果,则可以使用更复杂的模型,将整个句子作为输入并预测标签,而无需构建中间表示。要做到这一点的常用方法是把一个句子中的单词矢量序列使用或者Word2Vec或更近的方法,比如 GloVe 或CoVe。这是我们下面要做的。
用于句子分类的卷积神经网络训练非常迅速,并且可以很好地用作入门级深度学习体系结构。虽然卷积神经网络(CNN)主要因其在图像数据上的性能而闻名,但它们在文本相关任务方面提供了出色的结果,并且通常比大多数复杂的NLP方法(例如LSTM和编码器/解码器体系结构)更快地进行训练。这个模型保留了单词的顺序,并且学习了关于哪些单词序列可以预测我们的目标课程的有价值的信息。
培训这个模型不需要比以前的方法更多的工作,并且给了我们一个比以前更好的模型,准确率达到了79.5%!与上述模型一样,下一步应该是使用我们描述的方法来探索和解释预测,以验证它确实是部署给用户的最佳模型。到现在为止,你应该自己处理这个问题。