机器学习算法在文本分类中的应用综述

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


机器学习的一个主要应用就是在文本分类领域,比如我们去检测一些垃圾邮件,去定义一个文章的属性,或者去挖掘一篇文章的关键信息。在这篇文章中,Roman Trusov 对机器学习如何应用在文本分类做了一个深入的分析。

你可能认为去定义一个最好的文本分类模型是不可能的。在计算机视觉领域,对于模型的设计有一般的共识——具有大量残差链接的深度网络可能具有更好的性能。于此不同的是,在文本分类这个领域还没有一个共识来如何设计一个好的模型。

在这篇文章中,我们主要介绍几种比较通用的方法以及他们的使用场景。随着更加深入的学习,我们会使用一些工具(比如 TensorFlow)来构建自己的模型。

文本分类基准

现再很多的工具箱都会专注于文本挖掘,涵盖的范围从 TF-IDF 到线性SVM,从词嵌入到带有注意力机制的神经网络架构。

当研究人员对各种文本算法进行对比时,他们可能在一些知名的数据集上面,对每个算法加一些 Trick ,然后对结果进行对比。

一些比较著名的文本基准数据集
  • AG’s news articles
  • Sogou news corpora
  • Amazon Review Full
  • Amazon Review Polarity
  • DBPedia
  • Yahoo Answers
  • Yelp Review Full
  • Yelp Review Polarity

我们在 Google drive 上面做了一个文件夹保存这些数据,所以你可以点击这里 进行下载。

深层学习与浅层学习的对比

在NLP研究中,这些数据集的真正意义在于,简单模型和复杂模型都非常适用于它们。为了说明这一点,我们来讨论如下两篇论文:

这两篇论文中所使用的数据集是相同的,而且实验精度结果大致相同。但是两者之间的训练时间和模型设计推理时间却相差很大。

第一个模型只需要几秒钟的时间进行训练,而第二个模型却需要几个小时的训练时间,因为我们需要去选择很多的超参数。

这个方法有意思的是,模型对于数据没有做很多的假设。在模型的最底层,他们将文本当做字符序列,让卷积层直接从内容无关性的字符进行特征提取。

第二篇论文的特定是它是一个更加轻量级的模型,被设计用于在 CPU 上面进行快速工作,是由联合嵌入层和 softmax 分类器组成的。

一个很好的比赛例子是最近的Quora Question Pairs比赛和DeepHack.Turing比赛,排名比较好的选手都用了 gradient boosting machines,RNNs和CNNs。

我们在这里主要是将那些研究中的方法来看看实际效果,但是论文中的算法更像是一种艺术,如果要做实际应用,我们还需要仔细的设计和调整模型的数据管道。

这里有一个获胜的解决方案,你可以参考一下。

基于神经网络的文本分类的通常架构如下:
  • 词嵌入
  • 深度表示
  • 全连接层

词嵌入

词嵌入层采用字的 id 序列作为输入,并且产生一个相对应的词向量作为序列的输出。这个功能非常简单,由于这些词向量的实际语义对我们的问题特别关键,那么现在的问题就是如何采用更好的方法进行初始化权重。

根据问题,我们最好使用自己的语料库来训练自己的 word2vec 模型,但是在实际的生产环境中,我们一般都会使用预训练的模型进行二次训练。但很可能,我们训练出来的模型对原来语义有一点丢失。

但是在这里,这个不重要。

我们这里使用一个预训练的 word2vec 模型,在嵌入层中使用一个较低的学习率(我们将普通的学习率乘以0.1)。

深度表示

深度表示的主要目的是把一些单个样本的信息进行抑制,相关的数据在输出中进行高度压缩。这是非常需要的,因为具有高容量的网络可能在训练集上面过拟合,所以在测试集上面表现不佳。

循环神经网络(RNN)

当问题是给定一个文档(垃圾邮件/非垃圾邮件)去进行二分类时,目前最直接可靠的架构是具有循环神经网络的文本分类器。这种状态的语义被认为是不相关的,整个向量被视为文本的压缩描述。

这里有一些比较有用的连接:

Basic scheme of an RNN-based classifier

因为主要的工作已经在循环层中做完了,这个层保证只获取数据的相关信息。在自然语言处理中,这是一个非常重要和开放的科学问题。也是一个非常常见的挑战。

从更高层次上来讲,这里还有两件事可以做:

  1. 使用双向LSTM结构。这是一个非常好的思路,因为这本质上可以获取每个单词的上下文信息,而不是简单的按照顺序进行阅读。
  2. **使用一个嵌入过渡层。**LSTM可以学习区分序列的重要和不重要的部分,但是我们不能确定嵌入层的表示是否是最好的表示,特别是如果我们没有微调别人的词模型。所以我们可以添加一个过渡层,用来提高精度,其实可以认为是一个注意机制层。

卷积神经网络(CNN)

训练文本分类还有另一种网络结构就是卷积神经网络。通常,给定足够大的语料库,你可以获得和注意机制相同的效果。这里没有一个简单的技巧,但是在开始时使用更多的特征图,可以学习到更多的信息,可以有助于避免一些不相关信息的学习。

这里有一个利用 PyTorch 实现的CNN分类器

全连接层

全连接层连接深度表示层和最后的输出层。这里的具体做法如下:

  1. 全连接层
  2. 批归一化层
  3. (可选)非线性转换(双曲正切或者ELU)
  4. Dropout

我希望你喜欢这个文章,这个文章中的一些算法你都可以进行深入分析,从而得到复杂的模型。

另外,下面的这些连接也可以帮助到你。


来源:Medium

算法社区直播课:请点击这里
微信公众号:coderpai

猜你喜欢

转载自blog.csdn.net/coderpai/article/details/80216306