首页 > 其他分享 >(一)文本分类经典模型之CNN篇

(一)文本分类经典模型之CNN篇

时间:2024-05-08 16:56:51浏览次数:25  
标签:seq 卷积 模型 batch len 经典 CNN 文本 size

CNN源于计算机视觉研究,后来诸多学者将其应用于短文本分类,其基本结构如下图所示:

image

由上图可知,基于CNN的短文本分类模型,通常包括输入层、卷积层、池化层、全连接层和输出层五部分,其中卷积层和池化层是最为关键的特征提取环节。卷积层通过构造二维卷积核,并将其上下移动,在卷积窗口内与文本表示矩阵进行卷积操作,以此来提取文本特征。池化层则是对提取的特征进行选择,筛选出最为明显的特征。通常,在短文本分类时,需要对卷积层与池化层进行多层交替叠加,经过多次特征提取与特征选择,多角度获取文本特征信息;然后,进入全连接层,将特征信息进行整合,并将结果在输出层展示。

image

TextCNN是Yoon Kim在2014年提出的模型,开创了用CNN编码n-gram特征的先河。模型结构如上图3所示。

image

上图是来源于2016年ACL论文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification

模型详解

数据处理:所有句子padding成一个长度:seq_len

1.模型输入[batch_size, seq_len]

2.经过embedding层加载预训练词向量或者随机初始化,词向量维度为embedding_size:[batch_size, seq_len, embedding_size]

3.卷积层:NLP中卷积核宽度与embedding_size相同,相当于一维卷积。3个尺寸的卷积核(2, 3, 4),每个尺寸的卷积核有100个,卷积后得到三个特征图: [batch_size, 100, seq_len -1][batch_size, 100, seq_len - 2][batch_size, 100, seq_len -3]

卷积操作相当于提取了句中的2-gram、3-gram、4-gram信息,多个卷积是为了提取多种特征,最大池化将提取到最重要的信息保留。

4.池化层:对三个特征图做最大池化[batch_size, 100][batch_size, 100][batch_size, 100]

5.拼接[batch_size, 300]

6.全连接[batch_size, num_classes]

7.预测:Softmax归一化,将num_class个数中最大的数对应的类作为最终预测。

TextCNN是很适合中短文本场景的强baseline,但不太适合长文本,因为卷积核尺寸通常不会设置很大,无法捕获长距离特征。同时max-pooling也存在局限,会丢掉一些有用特征。另外再仔细想的话,TextCNN和传统的n-gram词袋模型本质是一样的,它的好效果很大部分来自于词向量的引入,解决了词袋模型的稀疏性问题。这也正是TextCNN成功的原因,TextCNN的成功并不是结构的成功,而是证明了预训练词向量 + 微调是提升NLP各项任务的关键能力(实验结果如下图4所示)。

image

那么怎么改进TextCNN模型的分类效果呢?从模型上看,无非就是以下几个大的方面:

1.词嵌入Embedding

2.卷积层

3.池化层

4全连接层

而Character-level Convolutional Networks for Text Classification这篇文章则从字符级卷积网络进行文本分类进行了实证探索。这个模型的优点就是模型结构简单,并且在大语料上效果很好,可以用于各种语言,不需要做分词处理,在噪音比较多的文本上表现较好。但是缺点就是字符级别的文本长度特别长,不利于处理长文本的分类,只使用字符级别信息,所以模型学习语义方面的信息较少而且在小语料上效果较差。后来学者们也研究了此问题,在论文Shallow word-level vs. deep character-level中就表明:即使在大量训练数据的情况下,浅层字级CNN也比最先进的超深字符级CNN更准确、更快。

为了进一步提高TextCNN模型的分类效果,弥补在获取短文本语义和上下文信息等方面的不足,学者们试图通过增加层数,增大了卷积核获取信息的视野,构建了深度CNN模型。

受这些的启发,Tencent AI Lab在2017年提出了Deep Pyramid Convolutional Neural Networks for Text Categorization模型,从模型性能上纵向比较来看,其也比经典的TextCNN(表格的第二行ShallowCNN)有了明显提高,在Yelp五分类情感分类任务中提升了近2个百分点。

image

image

DPCNN的模型如上图。

模型详解

1.模型输入:[batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化,词向量维度为embedding_size。[batch_size, seq_len, embedding_size]

3.进行卷积,250个尺寸为3的卷积核,论文中称这层为region embedding。[batch_size, 250, seq_len - 2]

4.接两层卷积,每层都是250个尺寸为3的卷积核(等长卷积,先padding再卷积,保证卷积前后的序列长度不变)[batch_size, 250, seq_len - 2]

5.Repeat

a.进行大小为3,步长为2的最大池化,将序列长度压缩为原来的二分之一。(进行采样)

b.接两层等长卷积,每层都是250个尺寸为3的卷积核

c.a的结果加上b的结果

重复以上操作,直至序列长度等于1。[batch_size, 250, 1]

6.全连接 + softmax归一化:

[batch_size, num_class] ==> [batch_size, 1]

DPCNN的核心改进如下:

1.在Region embedding时不采用CNN那样加权卷积的做法,而是对n个词进行pooling后再加个1 * 1的卷积(这儿有疑问,查看一下源码),因为实验下来效果差不多,且作者认为前者的表示能力更强,

2.使用1/2池化层,用size=3 stride=2的卷积核,直接让模型可编码的sequence长度翻倍

3.残差连接,参考ResNet,减缓梯度弥散问题。

TextCNN的过程类似于提取n-gram信息,而且只有一层,难以捕捉长距离特征。而DPCNN,可以看出来它的region embedding就是一个去掉池化层的TextCNN,再将卷积层叠加。

每层序列长度都减半,如图7所示。可以这么理解:相当于在n-gram上再做n-gram。越往后的层,每个位置融合的信息越多,最后一层提取的就是整个序列的语义信息。

image

上面的DPCNN是从纵向增加层数构建的深度CNN模型,那么横向改变模型是否可行呢?比如在论文A Convolutional Neural Network for Modelling Sentences中使用了动态池化K-Max这一概念细化了短文本特征提取;同时,在池化层保留前K个最大特征值,从多个维度获取短文本特征。

标签:seq,卷积,模型,batch,len,经典,CNN,文本,size
From: https://www.cnblogs.com/jokewl/p/18180218

相关文章

  • shell 获取文本特定行数据
    在Shell脚本中获取文件的特定行数据,尤其是获取第N行数据,有多种方法。以下是几种常见且简便的方法:使用sed命令:如果你想获取文件的第N行,可以使用sed命令,其中N是你想获取的行号。sed-n'Np'filename例如,获取第5行:sed-n'5p'filename结合使用head和tail命令:这是一种......
  • string:Python的文本常量与字符串模板
    前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理,也是自然语言处理的基础知识。而python3中,处理字符串的库为:string。本篇将详细介绍各种字符串的高效处理方式。首字母大写对于英文单词......
  • textwrap:Python格式化文本段落
    前言前文是针对普通的字符串数据进行处理。今天,我们要讲解的textwrap库,是对多文本进行处理的库。比如对于段落的缩进,填充,截取等,都可以通过textwrap库进行操作。特别是自己编写打印程序的时候,可以使用该库进行校正文档非常便捷,大大的加快了文本格式的处理。话不多说,我们来一步步......
  • Rich:终端打印富文本
    Rich——一个让程序更高级的Python库在这个多彩缤纷的数字时代,命令行界面似乎太过单调乏味。想象一下,如果你的终端输出能够像现代网页一样丰富多彩,是不是会带给你更愉快的开发体验?这时,一个强大的库——Rich——悄然走进了你的视野。它让颜色和样式的添加变得异常简单,不仅......
  • golang生成二维码图片,支持图片下方增加多行居中文本
    golang生成二维码图片,支持图片下方增加多行居中文本效果工具类代码packageUtilsimport( "bytes" "fmt" "github.com/golang/freetype/truetype" "github.com/skip2/go-qrcode" "golang.org/x/image/font" "golang.org/x/image/math......
  • Ftfy:文本编码修复
    你是否曾面对过这样的情形:打开一个文本文件,只为发现里面全是奇怪的字符,比如"文档"代替了"文档",或许这是某种神秘的外星文字?然而,现实往往是这个文件的编码发生了错误,而你并不知道如何去修复它们。就像生活中遇到各种意外情况一样,幸好有一个名叫FTFY的Python类库,像......
  • text_blind_watermark%3A 给文本加隐水印
    项目简介文本隐水印,用来把一段信息嵌入到一段明文中,使信息隐密不可见,并且旁人无法察觉到嵌入后明文的变化。经测试,在这些场景下信息隐藏比较完美MacBook版本的Chrome浏览器,包括知乎网页版、微博网页版等。微信、钉钉。Mac/Iphone版均可苹果备忘录用Chrome打开github......
  • LangSegment:多语言(97种语言)的混合文本自动分词工具
    项目简介它是一个强大的多语言(97种语言)的混合文本自动分词工具。[中日英韩:已测试]主要用途:它非常适合各种TTS语音合成项目,多语种混合文本的前端推理,和预处理后端训练。它基于py3langid的扩展实现(>=python3.6)。LangSegmentItisamulti-lingual(97languages)textcon......
  • 文本自动生成PPT的AI工具——轻竹AIPPT
    PPT(PowerPointPresentation)是商务、教育和各种演讲中不可或缺的工具。但是,设计一份既吸引人又能有效传达信息的PPT确实不容易。在这个过程中,选择一个好的工具能够事半功倍。而现在,AI技术的介入,让这个过程变得更加简单和有趣,今天就分享一款免费的AI一键生成PPT的工具。轻竹AIPPT......
  • 基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览优化前:    优化后:   2.算法运行软件版本matlab2022a 3.算法理论概述       时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(ConvolutionalNeuralNetwork,C......