1-文本分类之综述

1-文本分类之综述

前言

在NLP的很多字任务中,有绝大部分场景可以归结为文本分类任务,比如:

情感分析(细粒度情感分析),

领域识别(Domain Detection),

意图识别(Intent Detection),

等等.......最近在对话系统任务中接触到部分文本分类任务,在阅读了部分paper和知乎大牛的文章后,决定结合学习笔记以及工程代码,整理出文本分类的系列文章,一来备忘,二来通过写文章的方式来加深自己的理解。


定义

  • 在给定的分类体系中,将文本分到指定的某个或某几个类别当中
    • 分类对象:短文本(句子/标题/商品评论)、长文本(文章)
  • 分类体系一般由人工构造
    • 新闻分类:政治、体育、军事、社会
    • 情感分类:正能量、负能量
    • 微博评论分类:好评、中性、差评
  • 分类模式
    • binary:2类问题,属于或不属于,positive,negative
    • multi-class:多类问题
    • multi-label:多标签问题,一个文本可以属于多类。多标签分类是文本分类的一大难点,以前面试的时候被问到这个问题,扒拉扒拉了一堆~


方法

  • 人工方法
    • 基于规则的特征匹配,容易理解(足球、联赛->体育)
    • 依赖专家系统,不同人物需要专门构建特征规则。费时费力
    • 准确率不高
  • 机器学习方法
    • 特征工程+算法(Naive Bayes/SVM/LR/KNN……)
  • 深度学习方法
    • 词向量+模型(FastText/TextCNN/TextRNN/TextRCNN/DPCNN/BERT/VDCNN)

此处着重关注深度学习方法。


深度学习方法介绍

传统机器学习算法主要问题的文本表示是高纬度高稀疏的,特征表达能力很弱,而且神经网络很不擅长对此类数据的处理;此外需要人工进行特征工程,成本很高。而深度学习最初在之所以图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。接下来会分别介绍:

1,FastText

  • 论文:Bag of Tricks for Efficient Text Classification

原理是把句子中所有的词进行lookup得到词向量之后,对向量进行平均(某种意义上可以理解为只有一个avg pooling特殊CNN),然后直接接 softmax 层预测label。在label比较多的时候,为了降低计算量,论文最后一层采用了层次softmax的方法,既根据label的频次建立哈夫曼树,每个label对应一个哈夫曼编码,每个哈夫曼树节点具有一个向量作为参数进行更新,预测的时候隐层输出与每个哈夫曼树节点向量做点乘,根据结果决定向左右哪个方向移动,最终落到某个label对应的节点上。
特点就是快,在效果和其他方法差不多的情况下,训练速度比其他方法快一个量级。

2,TextCNN


论文:Convolutional Neural Networks for Sentence Classification

详细原理如下:

首先,对句子做padding或者截断,保证句子长度为固定值 s=7 ,单词embedding成 d=5 维度的向量,这样句子被表示为(s,d)(s,d)大小的矩阵(类比图像中的像素)。然后经过有 filter_size=(2,3,4) 的一维卷积层,每个filter_size 有两个输出 channel。第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示了,最后接一层全连接的 softmax 层,输出每个类别的概率。
重点1:卷积是一维卷积,只在ss方向上做卷积,不在dd方向上做卷积,既卷积核的宽度大小为dd。因为文本和图像不同,文本的局部特征只存在于上下文单词之间,既所谓的n-gram。卷积核大小设置为(2,3,4)就是为了分别寻找2-gram,3-gram,4-gram特征。
重点2:这里的特征就是词向量,有静态(static)和非静态(non-static)方式。static方式采用比如word2vec预训练的词向量,训练过程不更新词向量,实质上属于迁移学习了,特别是数据量比较小的情况下,采用静态的词向量往往效果不错。non-static则是在训练过程中更新词向量。推荐的方式是 non-static 中的 fine-tunning方式,它是以预训练(pre-train)的word2vec向量初始化词向量,训练过程中调整词向量,能加速收敛,当然如果有充足的训练数据和资源,直接随机初始化词向量效果也是可以的。

3,TextRNN


论文:Recurrent Neural Network for Text Classification with Multi-Task Learning 利用CNN进行文本分类,说到底还是利用卷积核寻找n-gram特征。卷积核的大小是超参。而RNN基本是处理文本信息的标配了,因为RNN先天就是为处理时间序列而设计的,它通过前后时刻的输出链接保证了“记忆”的留存。但RNN循环机制过于简单,前后时刻的链接采用了最简单的f=activate(ws+b)f=activate(ws+b)的形式,这样在梯度反向传播时出现了时间上的连乘操作,从而导致了梯度消失和梯度爆炸的问题。RNN的 变种LSTM/GRU在一定程度上减缓了梯度消失和梯度爆炸问题,因此现在使用的其实要比RNN更多。
利用RNN做文本分类也比较好理解。对于英文,都是基于词的。对于中文,首先要确定是基于字的还是基于词的。如果是基于词,要先对句子进行分词。之后,每个字/词对应RNN的一个时刻,隐层输出作为下一时刻的输入。最后时刻的隐层输出h_ThT​catch住整个句子的抽象特征,再接一个softmax进行分类。


4,TextRNN + Attention


RNN虽然号称能保持长久“记忆”,但其实还是无法“记住”太长久的东西。越靠后的字词对最终输出的影响越大,但是这和人类阅读文本的习惯是不一样的。一句话中对文本意义影响最大一必定是句子中间的某几个重点词汇。Attention的提出就是为了应对这个问题。详细介绍Attention恐怕需要一小篇文章的篇幅,感兴趣的可 参考14年这篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。具体原理不作介绍,大家可以看论文呀~
Attention运用到文本分类当中,参考论文Hierarchical Attention Networks for Document Classification。论文为了对doc进行分类,将doc从两个层次进行特征提取,首先在word层面提取sentence特征,然后从sentence层面提取doc特征,并且每个层次都运用了Attention。在此我类比到句子分类中,讲一下Attention是怎么运用的。
假设RNN每个时刻的输出为 [h_1, h_2,...,h_T] ,在上文TextRNN中我们已经提到,最后时刻的输出会用作softmax的输入,既 h=f(wH_T+b) 。Attention层其实就是普通的一层,它接收 h_t ​,得到一个相应score,并经过归一化之后代表当前词的重要性,既 u_t=f(w_{attetion}h_t+b_{attention}) , \alpha_t = \frac{exp(u_t)}{\sum_{k=1}^Texp(u_k)} 。Attention向量是每个时刻输出的加权平均,既 c=\sum_t\alpha_th_t 。最终输出为 logit = softmax(f(w[h;c] + b))


5,TextRCNN

论文 Recurrent Convolutional Neural Networks for Text Classification

利用前向和后向RNN得到每个词的前向和后向上下文的表示:
c_l(w_i)=f(W^{(l)}c_l(w_{i-1})+W^{(sl)}e(w_{i-1}))

c_r(w_i)=f(W^{(r)}c_l(w_{i+1})+W^{(sr)}e(w_{i+1}))
这样词的表示就变成词向量和前向后向上下文向量concat起来的形式了,即:
x_i=[c_l(w_i);e(w_i);c_r(w_i)]
最后再接跟TextCNN相同卷积层,pooling层即可,唯一不同的是卷积层 filter_size = 1就可以了,不再需要更大 filter_size 获得更大视野,这里词的表示也可以只用双向RNN输出


6,HAN

论文:Hierarchical Attention Networks for Document Classification (NAACL 2016)

Yang等人提出了一种用于文档分类的层次注意力机制网络,简称HAN。这篇文章和Tang等人都是针对于文档分类的问题,然而,这篇文章在句子级别以及文档级别提出了注意力机制,使得模型在构建文档时是能够赋予重要内容不同的权重,同时,也可以缓解RNN在捕捉文档的序列信息产生的梯度消失问题。HAN模型的模型示意图如下所示。

HAN模型首先利用Bi-GRU捕捉单词级别的上下文信息。由于句子中的每个单词对于句子表示并不是同等的贡献,因此,作者引入注意力机制来提取对句子表示有重要意义的词汇,并将这些信息词汇的表征聚合起来形成句子向量。具体的注意力机制的原理可以参考:

FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEMS

然后,对于所有的句子向量输入到Bi-GRU中,捕捉句子级别的上下文信息,得到文档向量。同样地,为了奖励对文档进行正确分类的线索句,作者再次使用注意力机制,来衡量句子的重要性,得到文档向量。最后将文档向量均输入到softmax层,得到标签的概率分布。

图3: HAN模型结构示意图


7,BERT

Google提出的BERT模型,突破了静态词向量无法解决一词多义的问题。BERT是基于语言模型的动态词向量,在自然语言处理的多项任务中取得了最优秀的结果。笔者对BERT模型进行微调,在文本分类的多个领域,诸如法律、情感等,取得了非常有竞争性的性能。

BERT的模型架构是一个多层的双向Transformer编码器(Transformer的原理及细节可以参考 Attention is all you need)。作者采用两套参数分别生成BERTBASE模型和BERTLARGE模型(细节描述可以参考原论文),所有下游任务可以在这两套模型进行微调。

代码参考:github.com/google-resea

图8:BERT的Pre-training结构和Fine-Tuning结构

8,VDCNN
论文:Very Deep Convolutional Networks for Text Classification 上述提到的文本分类模型都是浅层模型,目前NLP领域的模型,无论是机器翻译、文本分类、序列标注等问题大都使用浅层模型。这篇论文探究的是深层模型在文本分类任务中的有效性,文中最优性能网络达到了29层。


小结

这篇文章主要对深度学习的文本分类方法做了大概的介绍,后续会结合代码(项目)和理论对上面介绍的模型进行详细分析。并且我已经全部封装了restful接口,可供外部工程随时调用。此外,代码全部上传在github上,地址为:

charlesXu86/Chatbot_CNgithub.com图标

(欢迎star~~~~~~~~~~)


QQ群:聊天机器人开发实战

发布于 2019-06-05

文章被以下专栏收录