1. 概述
文本分类识别是自然语言处理中一个经典问题,其目的是将标签或标记分配给文本单元(包括句子、段落、文档),即识别文本单元的类型。它的应用范围很广,可用于垃圾邮件检测、新闻分类、内容审核等等。细化到数据安全领域,可以用于敏感文件的检测,比如:合同文件、电子邮件、简历等。但是由于文本数据来源的广泛性和数据非结构化的性质,文本分类识别任务也是一项非常具有挑战性和耗时的任务。本篇文章将介绍思维世纪在敏感文件分类识别过程中所作的尝试和取得的一些成果。
为什么要采用的是深度学习的方法来做文本分类识别,传统的方法就不行吗?我们首先简单地介绍下使用传统方法存在的问题。
2. 传统文本分类方法
使用传统的方法构造特征工程,然后将特征送入浅层机器学习模型,最终得出分类结果。流程图如下:

2.1 特征工程
特征工程在机器学习项目中是最耗时的部分,但是又非常重要。数据和特征决定了机器学习的上限,而模型和算法只是去尽量逼近这个上限而已。有时候,我们花了大量时间去调节模型参数,最终仅仅只是将模型的精度提升了1%;反而,如果提取出了一个有用的特征,那么可能直接将模型的精度提升5%。
2.1.1 文本预处理
对于中文文本处理任务,文本预处理的工作主要包括文本分词和去停用词两个阶段。分词的目的是为了后续将词语映射为词向量,而中文分词不同于英文有天然的空格间隔,如果想要获取很好的分词效果还需要设计非常复杂的分词算法。由于分词算法不是本篇文章的重点,所以在这里就不做阐述了。另外,去停用词就是过滤掉文本中那些没有实际意义的代词、连词、介词或者是特定情境下没有意义的词语。
例如:将”成都思维世纪科技有限责任公司成立于2001年,是国内数据安全、内容安全、安全服务的先导企业。”这句话经过文本分词和去停止词之后的结果如下:
[‘成都’, ‘思维’, ‘世纪’, ‘科技’, ‘有限责任’, ‘公司’, ‘成立’, ‘2001’, ‘年’, ‘国内’, ‘数据’, ‘安全’, ‘内容’, ‘安全’, ‘安全’, ‘服务’, ‘先导’, ‘企业’]
2.1.2 特征提取
传统的特征提取方式主要有TfidfVectorizer和CountVectorizer等。
- TfidfVectorizer:基于Tf-idf算法,Tf-idf主要描述的是某个词语出现在某个文章中的频率越高,而且在其他的文章中出现的频率越少,说明这个词语专有属性是属于这篇文章的。比如:一篇关于”劳动合同”的文章中,虽然多次出现”解约”,”补偿”这样的词语,但是这些词在其他文章中出现的频率也很高,所以就不是专属于该篇文章;而像”试用期”,”裁员”在本篇文章中出现的次数多,但是在别的文章出现的次数少,因此是专属于该篇文章的。
- CountVectorizer:也称为词袋法,只考虑每个词语出现的频次,不考虑其出现顺序。
特征提取好之后,就需要将其喂入分类器。
2.1.3 文本分类模型
我们尝试过使用一些比较经典的机器学习算法,比如:LR、SVM等,也尝试过很多次的参数调节,最终的识别效果都不是很好,那么问题就出现在特征提取环节了。经过分析,根据上面的特征提取方式,有以下几个缺陷:
- 特征向量特别稀疏:由于所需要识别的文本都是长文本,因此通过词袋法构造出来的特征向量会特别稀疏,这会导致整个模型的收敛非常慢,甚至不收敛,从而出现模型精度不高的情况。
- 特征向量不能反映上下文关系:不管是通过Tf-idf还是Count,最终提取出来的特征向量都没有反映出词语之间的依赖关系,当然也就无法让模型学习到能准确分类的信息。
传统的机器学习算法的优势在于处理结构化数据,并且过程是可解释的。在通信行业,思维世纪已经成功地将一些传统的机器学习算法运用在了异常流量检测、异常IP检测等业务场景中,并且取得了很好的效果。
如果是要处理非结构化的数据,深度学习则更具有优势。接下来,我们将介绍思维世纪使用深度学习算法在敏感文件分类识别中的应用。
3. 深度学习文本分类方法
3.1 数据准备
首先,当然是先要准备好需要识别文档的训练数据和测试数据。这部分工作很繁杂,且很痛苦,这里就不详细展开。
3.2 文本表示
文本表示,即将中文词语转化为计算机可以理解格式,我们使用的是文本的分布式表示,即词向量(word embedding)。
所谓word embedding,就是将不同的词语映射为对应的向量。比如,对于“成都思维世纪”这句话,通过word embedding得到的结果:“成都”对应的向量为[0.1,0.2,0.3],“思维”对应的向量为[0.2,0.9,0.7],“世纪”对应的向量为[0.4,0.5,0.2](这里的数值只是用来举例)。
3.3 文本分类模型
在解决了文本表示的问题后,接下来就是提取特征了。前面已经提到,深度学习基于传统方法的优势之一就是能够自动进行特征提取,然后基于特征自动进行分类。下面会介绍一些经典的分类模型,以及思维世纪所选择的分类模型。
1、FastText
使用FastText实现文本分类的思路及其简单,其流程图如下:

从上图可以看出,Fasttext最大的特点是模型简单,只有一层的隐层以及输出层。其原理就是把文档中所有的词向量进行平均,然后直接接输出层,输出文本的类别。
2、TextCNN
上面FastText模型是完全没有考虑词语前后的序列关系的,直接是对所有的词向量求平均,而CNN(卷积神经网络)模型就不一样了。虽然CNN网络最初是在图像领域取得巨大成功(思维世纪已经成功地将基于CNN的深度学习算法应用在敏感图片识别的业务场景中,且有很高的识别精度),但其核心就是可以捕捉局部相关性,因此,也可将CNN用来处理文本分类任务,获取上下文词语之间的局部特征。其核心原理图如下:

- 上图最左边所表示的是一个7 x 5的矩阵,每行表示一个词语对应的词向量,词向量的维度为5。
- 然后定义了两个4 x 5的卷积核,两个3 x 5的卷积核,两个2 x 5的卷积核。这里的2,3,4表示关注该词语周围上下文多大范围的信息,即在生成词向量的过程中需要考虑上下文之间的序列关系。
- 将定义的卷积核同原始句子矩阵做卷积操作,再通过激活函数得到特征图(能概括该句话的特征)。
- 在特征图的基础上做最大池化,其目的是减少参数的数量,提升模型的泛化能力。
- 将池化后的所有特征拼接到一起,形成最终的特征向量。
- 最后一层连接的是softmax层,输出属于每个类别的概率。
3、TextRNN
尽管TextCNN能够在很多任务里面能有不错的表现,但是CNN适合短句子文本,无法构建更长的序列模型,即无法处理更长的文本内容。而在自然语言处理中,更常用的还是递归神经网络(RNN)。在具体的文本分类任务中,常用的是RNN的变种,即LSTM。LSTM的优势是可以记住序列中重要的信息,遗忘那些不重要的信息。
思维世纪实现敏感文件分类识别的网络结构图如下:

训练阶段
- 输入层:将输入的文档词语进行embedding,这里的embedding可以是随机初始化,也可以是训练好的embedding。当然,使用预训练模型的embedding可以加速模型的收敛。
- LSTM层:有两层LSTM,分别为前向和后向,即不仅要考虑正向编码的信息,也要考虑反向编码的信息。每个LSTM设定的输出维度为128维向量,在前向层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在后向层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合前向层和后向层的相应时刻输出的结果进行拼接得到最终的输出。因此输出的维度为256维。
- 全连接层:将高维转化为低维,保留重要的信息。
- 输出层:对于多分类任务,使用softmax函数得出属于各个类别的概率值。
将得到的最大的那个概率值所对应类别同标签值进行对比(即得到的类别是不是就是该篇文档应该所属的类别),求损失值。然后反复迭代计算,更新模型的参数,直到最后的损失值降到最低或者基本不再变化为止。
识别阶段
将待识别的文档传入模型,模型输出文档类别。
思维世纪就是采取基于RNN的深度学习算法来识别非结构化敏感文件类别,目前已经取得较大进展,并逐步在产品中开始应用。
4、BERT
作为word2vec的替代者,BERT将NLP领域中的多项任务的精度大幅提升,可以说是近年来自残差网络以后最具有突破性的一项技术了。其特点如下:
- 使用Transformer作为算法的主要框架,Transformer能够更彻底地捕获语句中的上下文关系。
- 使用了更强大的机器训练了更大规模的数据,这使得BERT的结果达到了全新的高度。
更通俗地来讲,BERT可以得到比word2vec(词向量)更好的表征。即,训练出来的词向量能更好地代表该词。
在实际的自然语言处理任务中,我们可以直接使用BERT的特征表示作为词语的嵌入特征,然后根据下游任务进行特征微调就可以运用到我们下游的任务中了。其好处在于,即使我们下游任务的数据量很好,那么基于BERT的特征再次进行训练,也会达到非常高的精度,大大降低了模型的训练难度和训练时间。以中文文本分类为例,即使训练数据集不够,那么也可以基于预训练好的BERT模型,再次对我们的数据集进行训练,最后,也能得到非常好的分类效果。
模型架构如下图:

模型输入:从上图可以看出,模型的输入是一个一个的字,然后会将字转换为字向量。这里的字向量可以随机初始化,也可以是用word2ver算法预训练好的字向量。此外,模型的输入除了字向量外,还包含另外两个部分:
- 文本向量:该向量的取值在模型训练过程中自动学习,用于刻画文本的全局语义信息。
- 位置向量:每个位置对应一个向量,每个向量的参数跟着网络一起更新,学习到该位置对应的信息。
最后,BERT模型将字向量、文本向量和位置向量的加和作为模型输入。
模型输出:文本中各个字/词融合了全文语义信息后的向量表示
对于不同的下游任务,以命名实体识别为例,模型的输入和对模型输出的利用也有差异。模型的输入会在文本前插入一个”[CLS]”符号,模型输出的是该字符所属的实体类别。模型结构如下:

- ORG:表示该字符属于组织机构名的第一个位置
- ORG:表示该字符属于组织机构名的中间位置
- E-ORG:表示该字符属于组织机构名的最后一个位置
经过实验发现,相比较于LSTM等其他模型,基于BERT的命名实体识别精度大幅提高。在对非结构化文本中的敏感元素识别时,我们也采取了基于BERT模型的深度学习算法。
对比上面的4个模型:CNN、RNN、FastText和BERT,其各有优势。CNN对于特征提取比较明显;RNN对于字词的关联性比较好,且适用于长文本;FastText相对于前面两个模型最大的优势是性能好,速度快;而BERT模型是将预训练模型和下游任务模型结合在一起的,其优势在于下游任务不需要很多的训练数据就能训练一个精度非常高的模型,能更好地做迁移学习。
4. 经验总结
模型选择:对于自然语言处理任务而言,好的模型的确是能够得到很好的效果。但是,在一些简单的中文分类应用中,使用一些简单的模型就能够达到很好的效果了,有时使用复杂的模型,效果也不会提升多少。比如,对于文档级别的文本分类任务而言,就不适合使用BERT模型。因为BERT模型有最大输入长度的限制,适合句子和段落级别的任务。
业务理解:虽然深度学习有一个很大的优势就是不需要繁琐的人工特征工程,但还是要先对业务数据有足够的理解,要明白你的数据是否适合该模型,以及在出现模型精度不高的情况下是否同数据有关系。
参数调节:写深度学习模型不难,难的是怎么得到高精度的模型。要想获得高精度模型,参数调节就是一项非常重要的工作了。
在自然语言处理领域,每年新出的学术paper有很多,其更多的是对模型设计的优化和创新,更重要的是提出新的思路;而在实际的业务场景中,则更多地是关注模型是否能落地。因此,不能一味地追求前沿技术,而忽略业务本身。