本文包含:用keras实现文本分类的2种baseline结构:TextCNN、Bi-GRU+conv+pooling;网络结构可视化;采用小样本在本地(乞丐版MacBook Pro)评估baseline效果。
本文不包含:CNN和RNN的计算过程说明

本文是自然语言理解方向的进一步实践,承接之前

陈君:自然语言理解之(一)word2vec​zhuanlan.zhihu.com

zhihu-card-default.svg

对word2vec还不清楚的同学可以先移步上面的链接内容。

为什么是短文本分类

文本分类在nlp是一个经典应用分支,有着极为广泛的应用。而短文本又是伴随着移动互联网用户碎片化行为而爆炸式增长的一类典型产物:商品评论、微博、IM等等。与长文本不同,短文本有它的特性:

首先,短文本通常不遵守语法规则;其次,短文本由于字数少,本身所包含的信息也较少。前者使得传统的自然语言处理方法不能直接适用于短文本,而后者则意味着短文本理解不得不依赖于外部信息。简而言之,短文本具有较稀疏、噪声大、歧义多的特点。

这是美团王仲远在其著作《短文本数据理解》中总结的。我个人认为还可以补充一条,当前NLU实践还体现出了强烈的场景依赖(流转)。例如,智能问答机器人会需要先确定场景,然后让用户填充缺失的语义槽,最终通过对话管理模块(Dialogue Management Module)、语义理解(NLU)、文本生成模块(NLG)。这个不是本文重点,不作展开。

为什么是TextCNN

textcnn在nlp领域是一种效果极好,并且实现容易的网络结构。在文本分类方向已经有多年的积累。特别在进入0202年了,经典的网络结构已经集成在了主流深度学习框架中。对应到实践中只是多几行代码调用(嵌套网络结构)的事情,调包侠都懂~。

TextCNN网络结构可视化和Coding

网络结构的图上传就不清晰,自行下载吧 。地址:https://github.com/jonecherry/QiongB-can-NLP/blob/master/data/network/textcnn.png

def get_model():filter_sizes = [1, 2, 3, 5]num_filters = 32inp = Input(shape=(maxlen,))x = Embedding(max_features, embed_size, weights=[embedding_matrix])(inp)x = SpatialDropout1D(0.4)(x)x = Reshape((maxlen, embed_size, 1))(x)conv_0 = Conv2D(num_filters, kernel_size=(filter_sizes[0], embed_size), kernel_initializer='normal',activation='elu')(x)conv_1 = Conv2D(num_filters, kernel_size=(filter_sizes[1], embed_size), kernel_initializer='normal',activation='elu')(x)conv_2 = Conv2D(num_filters, kernel_size=(filter_sizes[2], embed_size), kernel_initializer='normal',activation='elu')(x)conv_3 = Conv2D(num_filters, kernel_size=(filter_sizes[3], embed_size), kernel_initializer='normal',activation='elu')(x)maxpool_0 = MaxPool2D(pool_size=(maxlen - filter_sizes[0] + 1, 1))(conv_0)maxpool_1 = MaxPool2D(pool_size=(maxlen - filter_sizes[1] + 1, 1))(conv_1)maxpool_2 = MaxPool2D(pool_size=(maxlen - filter_sizes[2] + 1, 1))(conv_2)maxpool_3 = MaxPool2D(pool_size=(maxlen - filter_sizes[3] + 1, 1))(conv_3)z = Concatenate(axis=1)([maxpool_0, maxpool_1, maxpool_2, maxpool_3])z = Flatten()(z)z = Dropout(0.1)(z)outp = Dense(len(list_classes), activation="sigmoid")(z)model = Model(inputs=inp, outputs=outp)model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])return model

Bi-GRU+conv+pooling

Bi-GRU+conv+pooling 可视化
def get_model():inp = Input(shape = (maxlen,))x = Embedding(max_features, embed_size, weights = [embedding_matrix],trainable = False)(inp)x = SpatialDropout1D(0.2)(x)x = Bidirectional(GRU(128, return_sequences = True))(x)x = Conv1D(64, kernel_size = 2, padding = "valid",kernel_initializer = "he_uniform")(x)avg_pool = GlobalAveragePooling1D()(x)max_pool = GlobalMaxPooling1D()(x)x = concatenate([avg_pool, max_pool])x = Dense(len(list_classes), activation = "sigmoid")(x)model = Model(inputs = inp, outputs = x)model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])return model

详细代码已经调试成功(2020年1月)放在公开项目地址 QiongB-can-NLP。里面的数据都是demo数据,模型的性能比较不具备参考意义。同学们可以将自己的数据按照一样的格式组织好,再进行试验。

小结

关于多分类实践

  1. TextCNN的训练速度很快,并且叠加多个二维卷积层效果就已经不错了,可以作为一个强baseline model;
  2. bi-gru模型不仅训练速度慢了很多,而且效果上也不占优。建议在实践的时候可以先从前者入手。

关于实验环境

这个项目至始至终,都是在笔记本上用CPU去跑的,因为穷~。我相信大多数人还是喜欢在本机学习神经网络的demo,很多时候物理机还是比虚拟机快呀。之前用kaggle提供的环境跑过,经常是一个实验跑着跑着就意外断了(可能是国内网络的问题),然后就没有了然后,这个对用户太不友好。也不知道是不是我打开的姿势不对。大佬们如果有好的实验方式(低成本、稳定、可自主安装扩展包的那种),欢迎分享。

展望

神经网络结构文本信息抽取是自动的,但很快又达到它的上限。更为复杂的网络结构在计算上又比较耗时。我在实践中是针对20多类的用户投诉内容进行学习,采用categorical_crossentropy作为损失函数,准确率并不高。主要原因两点:

  1. 类别不平衡问题突出;
  2. 可用的训练样本又很少。

未来工作重点在结合传统机器学习特征工程去表征文本信息。参考大众点评搜索基于知识图谱的深度学习排序实践。

参考

  1. https://www.kaggle.com/konohayui/bi-gru-cnn-poolings/code 参考了部分代码
  2. https://blog.rocuku.cc/toxic-comment-classification-challenge-summary/ 对优秀的实践进行了汇总 里面的外链资源
  3. https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52557 kaggle 1st 选手总结
  4. 大众点评搜索基于知识图谱的深度学习排序实践 每次看都有新收获

基于cnn的短文本分类_自然语言理解之(二)短文本多分类TextCNN实践相关推荐

  1. 磁共振线圈分类_磁共振硬件(二)主磁体分类

    一切从基础做起,从简单开始! -------青花瓷讲师团 本节主要介绍主磁体系统的分类.  前面"磁共振理论"中讲解的磁共振现象的过程,即给处于主磁场中的人体组织一个射频脉冲(RF ...

  2. python 二分类的实例_深入理解GBDT二分类算法

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 微信公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容, ...

  3. fasttext 文本分类_一文综述经典的深度文本分类方法

    作者 |  何从庆 转载自AI算法之心(ID:AIHeartForYou) 笔者整理最近几年比较经典的深度文本分类方法,希望帮助小伙伴们了解深度学习在文本分类中的应用. Convolutional N ...

  4. mysql数据库语句分类_细数MySQL中SQL语句的分类

    1:数据定义语言(DDL) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(C ...

  5. One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?

    1 多标签问题的简单解决思路 利用神经网络,我们可以很轻松处理一个多标签问题.如标题图所示,为前馈神经网络添加适当数量的隐含层,同时在输出层使用某个阈值判断标签分类结果即为一种基础的解决思路. 上述是 ...

  6. python实现二分类_感知器做二分类的原理及python numpy实现

    本文目录: 1. 感知器 2. 感知器的训练法则 3. 梯度下降和delta法则 4. python实现 1. 感知器[1] 人工神经网络以感知器(perceptron)为基础.感知器以一个实数值向量 ...

  7. 基于Spring Security的认证方式_编程理解PasswordEncoder工作原理_Spring Security OAuth2.0认证授权---springcloud工作笔记125

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 .然后我们再看一下PasswordEncoder 这个编码器,密码加密器怎么用. 可以看到现在我们 ...

  8. One-Error多标签分类_微信好友多,微信标签怎么分类,微信好友批量分组技巧

    微信聊天推广很强,方便,快捷,但是微信里的好友越来越多,如果想找某一个人聊天,都要找很久,我们可以像QQ 一样建立分组,这样找起来比较方便,在微信里叫做加标签,小编就为您介绍下怎么加标签! 1.首先在 ...

  9. python asyncio理解_深入理解asyncio(二)

    Asyncio.gather vs asyncio.wait 在上篇文章已经看到多次用asyncio.gather了,还有另外一个用法是asyncio.wait,他们都可以让多个协程并发执行.那为什么 ...

最新文章

  1. 从Web2.0到Enterprise 2.0(三)Enterprise 2.0的三个方向
  2. git 代码托管使用方法
  3. nagios二次开发(一)---开发思想
  4. 《Android进阶之光》--多线程编程
  5. esxi服务器3d性能,ESXi主机性能问题(示例代码)
  6. php mysql query 创建_借助PHP的mysql_query()函数来创建MySQL数据库的教程_MySQL
  7. P3723 [AH2017/HNOI2017]礼物(FFT)
  8. 一个智能运维算法测试方法
  9. Linux升级glibc版本汉字乱码,Linux CentOS6升级glibc库过程
  10. 常用的分布式唯一ID生成方案
  11. 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理
  12. Windows下VC++显示UTF-8编码中文
  13. 我就不信发不出去,工 作 时候用的,来啊=》模板下载
  14. 【优化算法】闪电连接过程优化算法(LAPO)【含Matlab源码 1444期】
  15. 更新ati显卡bios
  16. Node与Express学习笔记3_版本控制与质量保证
  17. hdu4889Scary Path Finding Algorithm【构造】搞坏spfa-slf 2014多校联合
  18. CF1633D Make Them Equal(bfs + 01背包)
  19. 树莓派4B安装QT5
  20. 第十一周OJ-Q50解题方法

热门文章

  1. GNN 系列:Graph 基础知识介绍
  2. 中科院DeepMind联手,用深度学习揭示大脑如何识别人脸|Nature子刊
  3. 谷歌研究院最新发现:训练结果不准确,超大数据规模要背锅!
  4. 人工智能,能治工人!
  5. 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
  6. 追番必备,动漫角色也可以用人脸识别了
  7. 计算机系男同学追班里一女同学,未果......
  8. 明确REST接口开发的核心任务
  9. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`meiduo`.`
  10. 美多商城之验证码(短信验证码2)