简介

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

图1

可以看出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]的矩阵.

图2

卷积层

在该部分使用卷积核对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的第三部分.

图3

全连接层

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

图4

总结

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

图5

Loss

图6

ACC

图7

TextCNN结构简单,精度比较高,只是速度相比没有Fasttext快,模型这种东西,没有绝对的好坏之说,所以根据不同数据集选择不同的模型,也是一门技术.

文本分类-TextCNN的更多相关文章

  1. 文本分类TextCNN

    参考来源:https://blog.csdn.net/u012762419/article/details/79561441 TextCNN结构 TextCNN的结构比较简单,输入数据首先通过一个em ...

  2. 文本分类实战(二)—— textCNN 模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  3. fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择

    https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...

  4. 文本分类(TFIDF/朴素贝叶斯分类器/TextRNN/TextCNN/TextRCNN/FastText/HAN)

    目录 简介 TFIDF 朴素贝叶斯分类器 贝叶斯公式 贝叶斯决策论的理解 极大似然估计 朴素贝叶斯分类器 TextRNN TextCNN TextRCNN FastText HAN Highway N ...

  5. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  6. 基于Text-CNN模型的中文文本分类实战

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  7. Bert文本分类实践(二):魔改Bert,融合TextCNN的新思路

    写在前面 ​ 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,博主水平有限,只能将平时用到的方法和trick在此做个记录和分享 ...

  8. 文本分类实战(十)—— BERT 预训练模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  9. 文本分类实战(九)—— ELMO 预训练模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

随机推荐

  1. delect 删除

    delete ---整表数据删除 (慎用) delete  * from 表名; ---条件删除 delete  * from  表名  where  限制条件;

  2. 转:Java中的cas

    引自:https://blog.csdn.net/mmoren/article/details/79185862 本篇的思路是先阐明无锁执行者CAS的核心算法原理然后分析Java执行CAS的实践者Un ...

  3. Flask第三方组件之flask_session

    flask默认提供了session, 但是存在以下问题: ① session数据存在客户端, 不安全 ② 大小有限制 ③ 增加了客户端的压力 所以才产生了很多第三方的session机制, 我使用的是f ...

  4. TypeScript : 语法及特性

    当let声明一个变量的时候它使用的词法作用域或者是块作用域.块作用域指的就是他们包含的块以外的不能访问. const声明:是let声明有相同的作用域规则,但是它被赋值后不能再被改变.类似于java的f ...

  5. 谈谈php对象的依赖

    通过构造函数的方法 <?php //定义一个类,后面的类依赖这个类里面的方法 class play { public function playing() { echo "I can ...

  6. drawImage画本地资源,在真机无法显示

    把图片的路径改成本地的绝对路径

  7. linux运维视频教程

    视频教程:https://www.bilibili.com/video/av31023006/?p=2 1.文件系统 文件系统树形结构: 对于linux系统的user和application来说,并不 ...

  8. Python3爬虫(十七) Scrapy框架(一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 1.框架架构图: 2.各文件功能scrapy.cfg 项目的配置文件items.py 定义了Item数据结构,所有 ...

  9. 链表--数据结构与算法JavaScript描述(6)

    链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...

  10. Hibernate怎么用

    一.为什么用Hibernate? [核心:对象关系映射] Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作, 在该框架之前,数据库的操作步骤是: 1.根据连接字串获取连接 2.执行s ...