作者:孟廉
编辑:田旭
前 言
文章来自:https://blog.insightdatascience.com 作者:Emmanuel Ameisen
无论您是一个成熟的公司,还是致力于推出一个新服务,您都可以利用文本数据来验证、改进和扩展您的产品的功能。从文本数据中提取有意义的信息并对其进行学习是自然语言处理(NLP)的一个研究活跃的课题。
NLP领域每天都会产生新的令人兴奋的结果,在与数百家公司合作之后,Insight团队发现一些比较关键的实际应用比其他应用出现得更为频繁,具体来说有以下几种:
在每年领导数百个项目的经验,并从美国各地的顶级团队那里获得建议之后,我们撰写了这篇文章,解释了如何构建机器学习解决方案来解决上面提到的问题。我们将从最简单的方法开始,然后转向更细致的解决方案,比如特征工程、单词向量和深度学习。
读完这篇文章,你会知道如何:
我们把这篇文章作为一个循序渐进的指南,它也可以作为高度有效的标准方法的高级概述,这篇文章附有一个交互式 notebook,你可以随意运行代码同步学习:
https://github.com/hundredblocks/concrete_NLP_tutorial/blob/master/NLP_notebook.ipynb
1
收集你的数据
示例数据来源
每一个机器学习问题都是从数据开始的,比如电子邮件、帖子或推文(微博)。文本信息的来源包括:
本文我们将使用由 CrowdFlower提供的一个名为「社交媒体中出现的灾难」的数据集,其中:
编者查看了超过 1万条推文,其中包括「着火」、「隔离」和「混乱」等各种搜索,然后看推文是否是指灾难事件(排除掉用这些单词来讲笑话或评论电影等没有发生灾难的情况)。
我们的任务是检测哪些推文关于灾难性事件,排除像电影这种不相关的话题。为什么?一个可能的应用是仅在发生紧急事件时(而不是在讨论最近 Adam Sandler 的电影时)通知执法官员。这篇文章的其它地方,我们将把关于灾难的推文称为「灾难」,把其它的推文称为「不相关事件」。
2
清洗数据
我们遵循的第一条规则是:“你的模型会受你数据的影响。”
数据科学家的关键技能之一是知道下一步的工作对象应该是模型还是数据。对于数据清洗,一个好的经验法则是先查看数据然后再进行清理。一个干净的数据集将使得一个模型学到有意义的特性,而不是过度拟合无关的噪音。
以下是用来清理你的数据的清单:
在遵循这些步骤并检查额外的错误之后,我们就可以开始使用干净的、标记的数据来训练模型!
3
寻找好的数据表示
机器学习模型以数值作为输入。例如,在图像上工作的模型,可以采用表示每个颜色通道中每个像素强度的矩阵。
一个以数字矩阵表示的笑脸
我们的数据集是一个句子的列表,所以为了让我们的算法从数据中提取模式,我们首先需要找到一种方法来使得以我们的算法能够理解的方式来表示它,也就是一个数字列表。
将句子表示为词袋。左边为句子,右边为对应的表示,向量中的每个数字(索引)代表一个特定的单词。
将嵌入的词袋可视化
这两个类看起来并没有很好地分离,这可能是我们嵌入的一个特性,或者仅仅是我们的维度缩减。为了了解这些词的特点是否有任何用途,我们可以根据它们来训练一个分类器。
4
分类
面对一个问题时,一般好的做法是从最简单的工具开始由浅入深地解决问题。当提到数据分类时,人们最喜欢方法是的 Logistic 回归(Logistic Regression),这是一种非常简单的训练方法,结果是可以解释的,因为你可以很容易地从模型中提取最重要的参数。
我们将数据分解为一个训练集,用于拟合我们的模型和一个测试集,以查看它对不可见的数据的概括程度。经过训练,我们的准确率达到了75.4%,不至于太难看。然而,即使75%的精度满足了我们的需求,我们也不应该在不理解模型的情况下发布模型。
5
检查
第一步是了解我们模型所出的错误类型,以及哪些错误是最不可取的。在我们的例子中, false positive将一个无关的推文归类为灾难,而 false negtive则将灾难分类为不相关的tweet。如果首要任务是对每一个潜在事件优先处理,我们就想降低我们的false negtive结果。如果我们优先考虑资源受限的问题,我们可能会优先考虑降低false positive率以减少误报的提醒。一个很好的可视化这个信息的方法是使用一个混淆矩阵,它比较了我们的模型和真实的标签的预测。理想情况下,矩阵将是一条从左上到右下的对角线(即我们的预测完全符合事实)。
我们的分类器创造了更多的false negtive,而不是false positive(比例)。换句话说,我们的模型最常见的错误是错误地将灾难分类为无关紧要的。如果误报是执法的高成本,我们更倾向于使用这个分类器。
为了验证我们的模型并解释它的预测,重要的是看一下它用哪些单词在预测中起主要作用。如果我们的数据有偏差,我们的分类器会在样本数据中做出准确的预测,但是模型在实际应用效果并不理想。在这里,我们给出了灾难和不相关事件的重要词汇。用词袋模型和Logistic 回归来描绘单词的重要性是很简单的,因为我们可以提取和排列模型用于预测的系数。
我们的分类器正确地选择了一些模式(广岛,大屠杀),但显然似乎是过度拟合一些无意义的术语(heyoo, x1392)。现在,我们的词袋模型是处理大量不同单词的词汇,并对所有单词一视同仁。然而,有些词是非常频繁的,而且只会对我们的预测造成干扰。接下来,我们将尝试着用一个方法来表示词汇出现的频率,看我们能否从数据中获得更多的信号。
6
检查
为了帮助我们的模型更多地关注有意义的单词,我们可以在我们的单词模型包上使用TF-IDF评分(词频-逆文档频率)。TF-IDF 通过对数据集中词汇出现的频率来加权,并减小高频但只是增加噪音的单词的权重,这是我们新嵌入的 PCA 预测。
TF-IDF 嵌入可视化
我们可以看到,这两种颜色之间有更明显的区别,这将使我们的分类器更容易区分两个组。让我们看看这会不会带来更好的性能。在我们新嵌入的逻辑回归,我们得到了76.2%的精确度。
一个非常轻微的改善,我们的模型是否可以选择更重要的词汇?如果我们在防止模型从“欺骗”中得到更好的结果,那么我们就可以说这个模型得到了优化。
TF-IDF:重要词汇
它挑选的单词看起来更加相关了!虽然我们在测试集上的指标只稍微增加了一点,但是我们对我们的模型使用的词汇更加关键,因此在将它部署到与客户交互的系统中会更舒适有效。
7
利用语意信息
下面是我们使用以前的技术实现的新嵌入的可视化:
可视化 Word2Vec 嵌入
这两组颜色看起来更加分离,我们的新嵌入应该帮助分类器找到两个类之间的分离。在训练了相同的模型第三次(Logistic 回归)后,我们得到了77.7%的准确率,这是我们最好的结果!是时候检查我们的模型了。
8
利用端到端(end-to-end)的方法
我们已经介绍了快速和有效的方法来生成紧凑的句子嵌入。然而省略了单词的顺序,我们跳过了句子所有的句法信息。如果这些方法没有提供足够的结果,我们可以使用更复杂的模型,将整个句子作为输入并预测标签,而不需要构建中间表示。一种常见的方法是使用Word2Vec或更类似的方法,如GloVe或CoVe,将句子看作一个单词向量的序列,这就是我们接下来要做的。
高效的端到端结构
论文《Convolutional Neural Networks for Sentence Classification》中的模型训练分类模型非常快,并且它是作为入门级的深度学习体系效果非常理想。虽然卷积神经网络(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。与上面的模型一样,下一步应该使用我们描述的方法来探索和解释预测,以验证它确实是给用户提供的最佳模型。到现在为止,你应该对解决这类问题很熟练了。
最后的话
下面是我们成功使用方法的简要回顾:
这些方法只应用于一个特定的例子,使用的模型是针对理解和利用短文本(如tweet)而进行的,但是这些想法广泛适用于各种问题。希望这会对你有所帮助,我们很乐意听到你的评论和问题!
end
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有