文本分类-TextCNN
简介
TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷积神经网络来处理NLP问题的模型.相比较nlp中传统的rnn/lstm等模型,cnn能更加高效的提取重要特征,这些特征在分类中占据着重要位置.论文所提出的模型结构如下图所示:

可以看出TextCNN的结构还是比较简单的,下面我们分块介绍一下TextCNN.
输入层
首先是输入层,输入跟大多数深度学习在nlp方面的处理一样,需要将文本转换成词索引,每个句子是一个向量,向量中每个元素代表这该词在词典中的词索引.其中词向量矩阵embedding可以在该模型中一起训练,也可以使用word2vec或者其他框架预训练好的词向量,然后在模型训练过程中进行Fine tune.这也就是上图中第一部份会有两个channel,一个non-static channels是表示词向量随着模型一起训练,static channels是表示使用预训练的词向量.而实验表明,在数据量小的情况下,使用non-static channels容易引起过拟合.
这部分的变量维度分别是:输入-[batch_size,sentence_length],词向量矩阵-[vocab_size,embedding_size],经过embedding处理后输出embedded-[batch_size,sentence_length,embedding_size],也就是图1中第一部分显示的内容.下面就要使用卷积操作进行处理了,但是卷积操作是四维的,除了embedded的三维之外,还有channels(在图像处理中,最后一维是三通道的颜色编码,但是在文本处理中该维值是1).所以在使用卷积处理前需要把embedded进行扩维处理.经过扩维处理后embedded变成了[batch_size,sentence_length,embedding_size,1]的矩阵.

卷积层
在该部分使用卷积核对embedded做卷积处理,在论文中卷积核的size取了三个[2,3,4],这对应着n-gram模型,使得特征信息包含临近词信息,这里就不在过深说明,详细内容可以去看n-gram语言模型.如果卷积核的size为[2,3,4],那么就有三种卷积核,其中size为2的卷积核的shape是[2,embedding_size,1,num_filter],其他类似,其中num_filter代表着卷积核的数量,是超参数.这样我们以1的步长去进行卷积,会得到size_len*num_filter个列向量,其中size_len是size的种类数,这里是3个size.对应着图1中的第二部分.这部分的作用是提取了语义信息,其中包括n-gram模型.同时因为卷积操作的特点参数共享,所以可以减少了大部分参数,节约内存使用.
池化层
文中提到的pooling操作是max_pooling,就是将列向量中最大值取出来,对输入补0做过滤(有兴趣的朋友也可以试试平均池化,看看结果有神马不同),池化操作是对整个向量,所以它的shape是[1,sentence_length-size+1,1,1],其中sentence_length-size+1是上文提到的经过卷积处理后得到的列向量长度.然后对卷积得到的每个列向量进行池化操作后,会得到size_len*num_filter个元素,将他们合并在一起形成一个size_len*num_filter维的向量.也就是图1的第三部分.

全连接层
全连接层就是正常的softmax,输入是池化后的向量,输出维度是我们要分类的类别数,为了防止过拟合,可以加一个l2正则,同时也可以在上述过程后加上dropout.

总结
上本文在搜狗10分类新闻数据集进行测试,只使用了停用词,由于电脑内存不足,所以对文本内容进行了截断,只取了200个单词,所以测试结果可能不是最好的,进行调参或者添加一些其他trick可以使精度更高一些.

Loss

ACC

TextCNN结构简单,精度比较高,只是速度相比没有Fasttext快,模型这种东西,没有绝对的好坏之说,所以根据不同数据集选择不同的模型,也是一门技术.
文本分类-TextCNN的更多相关文章
- 文本分类TextCNN
参考来源:https://blog.csdn.net/u012762419/article/details/79561441 TextCNN结构 TextCNN的结构比较简单,输入数据首先通过一个em ...
- 文本分类实战(二)—— textCNN 模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...
- 文本分类(TFIDF/朴素贝叶斯分类器/TextRNN/TextCNN/TextRCNN/FastText/HAN)
目录 简介 TFIDF 朴素贝叶斯分类器 贝叶斯公式 贝叶斯决策论的理解 极大似然估计 朴素贝叶斯分类器 TextRNN TextCNN TextRCNN FastText HAN Highway N ...
- 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅
Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...
- 基于Text-CNN模型的中文文本分类实战
Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...
- Bert文本分类实践(二):魔改Bert,融合TextCNN的新思路
写在前面 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,博主水平有限,只能将平时用到的方法和trick在此做个记录和分享 ...
- 文本分类实战(十)—— BERT 预训练模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- 文本分类实战(九)—— ELMO 预训练模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
随机推荐
- CSS3-阴影参数基础
box-shadow 语法:text-shadow: x-shadow y-shadow distance color; 值 描述 x-shadow 必需.水平阴影的位置.允许负值. y-sha ...
- 霍金:AI或许能根除疾病和贫穷,但也可能摧毁人类 | GMIC 2017
在我的一生中,我见证了社会深刻的变化.其中最深刻的,同时也是对人类影响与日俱增的变化,是人工智能的崛起.简单来说,我认为强大的人工智能的崛起,要么是人类历史上最好的事,要么是最糟的.我不得不说,是好是 ...
- DQL-条件查询
二 :条件查询 语法:select 列表名 from 表名 where 筛选条件 例如: select salary from employees where salary> ...
- 第三天-零基础学习python
1.回忆.列表方法,append(),extend(),insert() 2.列表获取元素: >>> member = ['HU','YU','HUYAN','HUJIAMU'] ...
- Git&GitHub-初步使用
Git 1.安装 下载安装包,安装,默认安装了 Git GUI Here 和 Git Bash Here. 需要在哪里使用 git,只需在文件夹空白处右键,选择Git Bash Here即可打开 gi ...
- IPC进程间通信---共享内存
共享内存 共享内存:共享内存就是分配一块能被其它进程访问的内存.每个共享内存段在内核中维护着一个内部结构shmid_ds, 该结构定义在头文件linux/shm.h中,其结构如下: struct sh ...
- BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3467 Solved: 1438[Submit][Status][Discuss] Descripti ...
- mysql 导出行数据到txt文件,指定字符分割
select id,name, concat('tel:',phone) from user order by time INTO outfile 'user.txt' FIELDS terminat ...
- STM32 时钟配置的坑
今天在调试公司的一款产品的时候发现8M的晶振用完了,于是找了一个16M的替代 坑爹的就在这里,明明已经把时钟按照时钟树配置好了,但是串口等外设一直无法正常工作 折腾了一下午,终于发现这位老兄的文章ht ...
- Java异常链
是什么 一种面向对象的编程技术,将捕获到的异常重新封装到一个新的异常中,并重新抛出. 有什么用 可以保留每一层的异常信息,用户查看异常的时候,能够从顶层异常信息看到底层异常信息. 怎么用 catch异 ...