实战文本分类,深度学习是最优算法吗?

    2017-07-12 15:55  浏览次数:393

 

 

1 什么是文本分类?

文本分类 (Text classification) 指的是给定一篇文章,自动判断该文章所属的预先定义好的标签类别 (比如体育、娱乐或者新闻类别等),是自然语言处理 (Natural language processing,NLP) 领域的主要研究方向之一 [1]。

文本分类有着广阔的应用场景,比如垃圾邮件检测 (Spam email detection) 和评论情感分析 (Sentiment analysis) ,本质上都可以看做是具有两种标签类别的文本分类任务:

垃圾邮件检测——判断邮件是否属于垃圾邮件和非垃圾邮件这两类;
评论情感分析——判断评论是否属于正面邮件和负面评论这两类。

每天,热巢的工程师都会分析上百万中国社交网络上的热门内容,热巢平台上的大量功能,背后都有机器学习处理文本分类的功劳。

2 文本分类的技术发展历史

对文本分类的研究可以追溯到二十世纪五十年代,当时主要依据特定的人工规则进行文本分类。
到二十世纪九十年代,统计机器学习 (Statistical machine learning) 成为主流,一些统计机器学习方法,比如支持向量机 (Support vector machine, SVM) [2] 和朴素贝叶斯 (Naive Bayes) [3] 等分类方法在文本分类中取得了非常高的分类准确率。然而,统计机器学习方法首先需要进行特征工程 (Feature engineering) 工作,该工作需要深入理解业务需求,并且非常耗时耗力。
随着大数据量 (Big data) 和图形处理单元 (Graphics processing unit, GPU) 强计算力的支持,深度学习 (Deep learning) 近年来发展迅速,在计算机视觉 (Computer vision, CV)、语音识别 (Speech recognition) 和自然语言处理领域都有着广泛研究与应用 [4]。与统计机器学习方法相比,深度学习方法可以自动提取特征,使得人们将注意力更多地集中在数据和模型上。

3 实战文本分类:CNN模型 VS fastText模型

关于卷积神经网络(Convolutional neural network, CNN)

卷积神经网络 (Convolutional neural network, CNN) [5] 是经典的深度学习模型之一,在大规模图像识别竞赛 (Large scale visual recognition challenge, ILSVRC) 中取得巨大成功。CNN模型的局部连接 (Local connectivity) 和权值共享 (Parameter sharing) 两大特性有效地提取了数据特征并降低了模型参数以加快模型训练。

图1:Kim Yoon 提出的用于文本分类的CNN模型结构
图1:Kim Yoon 提出的用于文本分类的CNN模型结构

KimYoon [6] 首次提出将CNN模型应用在文本分类中(见图1)。在该模型中,第一步是词嵌入层 (Word embedding layer),将每个词表示为固定长度的稠密的词向量 (关于词嵌入的理论部分,我们还会继续发文介绍)。第二步是卷积层 (Convolutionallayer),采用不同大小的卷积核从上到下依次对词向量进行卷积操作。第三步是池化层 (Pooling layer),采取的是最大池化 (Max-pooling) 操作。第四步是全连接层 (Fully connected layer, 包括了Dropout层),对输出标签类别进行预测。

关于fastText

2016年8月份,Facebook开源了fastText工具,用于快速进行文本表示与文本分类任务 [7]。fastText的模型结构非常简单 (图2),单个词或者ngram组合词的词向量取平均后代表该文本的向量,使用softmax函数预测文本所属各标签类别的概率,损失函数 (Loss function) 是真实标签类别与预测标签类别之间的负对数似然 (Negative log-likelihood)。与“深层”的CNN模型相比,fastText的模型结构是“浅层”的。

图 2. fastText模型结构。x1, x2, …, xN 分别表示文本的N个ngram 特征
图 2. fastText模型结构。x1, x2, …, xN 分别表示文本的N个ngram 特征

开始实验

接下来将分别使用CNN模型和fastText模型在公开数据集上进行文本分类,以分类准确度和模型训练耗时两个角度评估两个模型的表现。

相对于图像和语音来说,文字已经是高度抽象的概念了,因此对文本分析并不需要太深的网络结构。在这里使用深度学习框架keras [8] 搭建了CNN模型,其结构为:词嵌入层-Dropout层-卷积层-Dropout层-池化层-全连接层-Dropout层-全连接层。在fastText 的官方GitHub上 [9] 下载并编译了fastText模型。

实验所需公开测试数据来自搜狗实验室新闻数据完整版 [10],包括了搜狐新闻2012年6月到7月期间国内、国际、体育、社会和娱乐等18个标签类别的新闻数据。在依次经过数据提取、中文分词、去停用词、过滤小于10个词的文本和文本去重一系列文本预处理操作后,选取其中汽车、财经、IT、健康、体育和娱乐6个标签类别,每个标签类别下随机打乱后选取15,000个样本作为训练数据集 (Training data),3,000个样本作为测试数据集 (Testing data),即实验使用的训练数据集大小为90,000,测试数据集大小为18,000。

本实验在CentOS 平台运行,由于fastText模型训练不需要GPU加速,因此在训练CNN模型时也没有使用GPU。实验使用的相关软件以及版本分别是中文分词工具jieba (0.38) [11], 词向量训练工具gensim (2.1) [12] 和CNN模型实现深度学习框架keras (2.0)。编程语言是 Python 2.7。

实验结果

经过一系列超参数 (Hyper-parameter) 调整后,在分类准确度方面,CNN模型迭代 (Epoch) 训练数据7次后,在测试数据集上的分类准确度为95.7 % (图3)。fastText模型在相同测试数据集上的分类准确度为 95.8 % (图4)。也就是说,在该测试数据集上,两个模型的分类准确度是基本一致的


图 3. CNN模型实验结果

图 3. CNN模型实验结果


图 4. fastText模型实验结果
图 4. fastText模型实验结果

运行时间方面,fastText模型总共只需要27秒钟就可以完成模型的训练与预测 (图4),而CNN模型完成相同的操作耗时2212秒 (图3),也就是说fastText模型远远快于CNN模型。实验使用的标签类别和相应数据量并不是太大,在工业界业务需求中往往有成百上千个标签类别,fastText在更大规模的数据集上的优势更加明显 [7]。

值得注意的是,fastText除了可以进行有监督学习的文本分类外,还可以进行无监督的词向量学习。有了词向量后,可以直观地查看语义相关词。



比如,图5展示了与输入词“梁朝伟”最相关的词是:听风者。《听风者》是梁朝伟和周迅等在2012年主演的一部影片,由于训练数据是2012年采集的,因此词向量准确地捕捉到了两个词之间的相关关系。与输入词“奔驰”语义最相关的词是:宝马,可以想象2012年两个车系的竞品关系。

实验讨论

如前文所述,与图像和语音不同,人类的语言已经是高度抽象的概念了。对于文本分类任务来说,在良好的特征工程基础上,线性分类器也可以取得很好的效果 [7]。文本分类还是比较偏线性的任务,因此“浅层”的fastText模型就可以达到与“深层”的CNN模型相似的分类准确度。依此类推,为了解决业务需求,具体在选择算法模型时要充分理解任务属性,依据数据量大小和算法模型本身的优缺点选择合适的解决方案。

除了将CNN模型应用在文本分类任务上之外,还可以将其他深度学习模型应用在文本分类上,比如循环神经网络 (Recurrent neural network, RNN) [13],基于注意力 (Attention) 机制的递归神经网络 [14],循环卷积神经网络 (Recurrent convolutional neural network, RCNN) [15] 等。由于在此实验中CNN模型已经取得了不错的结果,因此在这里没有尝试其他深度学习模型。

目前深度学习已经分别在计算机视觉和语音识别领域取得了state-of-the-art的结果,近年来在自然语言处理领域有着广阔的研究。有趣的是,有人指出深度学习并不能很容易地应用在自然语言处理上 [16]。该文章指出神经网络适用于处理连续稠密的数据 (比如图像和语音),而自然语言在单词/符号水平 (Word/symbol level) 上的并不是连续的,在概念/意义水平 (Concept/meaning level) 上才是连续的。神经网络在单词水平上进行分析会受限于训练数据集,模型训练完毕后泛化误差 (Generalization error) 较大。

因此,不同的算法模型都有不同的优势和劣势,技术团队势必需要充分理解具体的业务需求后,才能提供最佳的技术解决方案并提升解决问题的效率。

 


近期公开课

官方微博
官方微信

联系我们

购买:sales@evgetedu.com

意见与建议: service@evgetedu.com

Tel:400-700-1020(免费)

023-66090381