专栏首页机器学习AI算法工程CNN-RNN中文文本分类,基于TensorFlow 实现

CNN-RNN中文文本分类,基于TensorFlow 实现

使用卷积神经网络以及循环神经网络进行中文文本分类

CNN做句子分类的论文可以参看:

https://arxiv.org/abs/1408.5882

还可以去读dennybritz大牛的博客:

http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

以及字符级CNN的论文:

https://arxiv.org/abs/1509.01626

本文是基于TensorFlow在中文数据集上的简化实现,使用了字符级CNN和RNN对中文文本进行分类,达到了较好的效果。

使用THUCNews的一个子集进行训练与测试,数据集请自行到THUCTC:一个高效的中文文本分类工具包

下载,请遵循数据提供方的开源协议。

代码、子数据集获取:

关注微信公众号 datayx 然后回复 文本分类 即可获取。

本次训练使用了其中的10个分类,每个分类6500条数据。

类别如下:

体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐

数据集划分如下:

  • 训练集: 5000*10
  • 验证集: 500*10
  • 测试集: 1000*10

从原数据集生成子集的过程请参看helper下的两个脚本。其中,copy_data.sh用于从每个分类拷贝6500个文件,cnews_group.py用于将多个文件整合到一个文件中。执行该文件后,得到三个数据文件:

  • cnews.train.txt: 训练集(50000条)
  • cnews.val.txt: 验证集(5000条)
  • cnews.test.txt: 测试集(10000条)

预处理

data/cnews_loader.py为数据的预处理文件。

  • read_file(): 读取文件数据;
  • build_vocab(): 构建词汇表,使用字符级的表示,这一函数会将词汇表存储下来,避免每一次重复处理;
  • read_vocab(): 读取上一步存储的词汇表,转换为{词:id}表示;
  • read_category(): 将分类目录固定,转换为{类别: id}表示;
  • to_words(): 将一条由id表示的数据重新转换为文字;
  • process_file(): 将数据集从文字转换为固定长度的id序列表示;
  • batch_iter(): 为神经网络的训练准备经过shuffle的批次的数据。

经过数据预处理,数据的格式如下:

CNN模型

具体参看cnn_model.py的实现。

大致结构如下:

训练与验证

运行 python run_cnn.py train,可以开始训练。

在验证集上的最佳效果为94.12%,且只经过了3轮迭代就已经停止。

准确率和误差如图所示:

测试

运行 python run_cnn.py test 在测试集上进行测试。

在测试集上的准确率达到了96.04%,且各类的precision, recall和f1-score都超过了0.9。

从混淆矩阵也可以看出分类效果非常优秀。

RNN循环神经网络

配置项

RNN可配置的参数如下所示,在rnn_model.py中。

RNN模型

具体参看rnn_model.py的实现。

大致结构如下:

训练与验证

这部分的代码与 run_cnn.py极为相似,只需要将模型和部分目录稍微修改。

运行 python run_rnn.py train,可以开始训练。

若之前进行过训练,请把tensorboard/textrnn删除,避免TensorBoard多次训练结果重叠。

在验证集上的最佳效果为91.42%,经过了8轮迭代停止,速度相比CNN慢很多。

准确率和误差如图所示:

测试

运行 python run_rnn.py test 在测试集上进行测试。

在测试集上的准确率达到了94.22%,且各类的precision, recall和f1-score,除了家居这一类别,都超过了0.9。

从混淆矩阵可以看出分类效果非常优秀。

对比两个模型,可见RNN除了在家居分类的表现不是很理想,其他几个类别较CNN差别不大。

还可以通过进一步的调节参数,来达到更好的效果。

为方便预测,repo 中 predict.py 提供了 CNN 模型的预测方法。


本文分享自微信公众号 - 机器学习AI算法工程(datayx)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Faster R-CNN的安全帽目标检测

    数据的标注仍然采用VOC格式的数据标注形式,如果是其他的标注形式比如COCO请自行实现相关代码。将数据最终转化为如下形式:

    机器学习AI算法工程
  • 使用scikit-learn解释随机森林算法

    文/CSDN 译者/赵屹华 校检/刘帝伟、朱正贵、李子健 责编/周建丁 赵屹华,计算广告工程师@搜狗,前生物医学工程师,关注推荐算法、机器学习...

    机器学习AI算法工程
  • 基于CNN的中文文本分类算法(可应用于垃圾文本过滤、情感分析等场景)

    IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW

    机器学习AI算法工程
  • Python Pytest中fixture之yield唤醒teardown和终结函数addfinalizer

    引入 我们之前学习的都是测试用例的前置固件,也就是相当于“setup”。说到这,细心的你可能想到了,那有没有什么方式可以表示出“teardown”?这就是我们今...

    橙子探索测试
  • C#中调用python

    为了记录自己的学习成果,防止遗忘,同时为了帮助在C#学习过程中遇到同样问题的同志们,所以将原版代码奉上!!!

    zls365
  • 牛顿迭代法与二分法计算平方根

    因为不是科班出身,所以即使编程一段时间也时常感觉自身基础知识非常不扎实,于是在最近开始补习算法和计算机理论的基础知识。

    Originalee
  • phpstudy8在windows2016上安装后在服务列表找不到服务

    phpstudy最新版用了mysql8.0,安装之前先安装VC库http://www.pc6.com/softview/SoftView_104246.html

    shawyang
  • javascript正则表达式入门先了解这些

      当执行写操作后,需要保证从缓存读取到的数据与数据库中持久化的数据是一致的,因此需要对缓存进行更新。

    不会飞的小鸟
  • CMDB管理系统

    py3study
  • Spring Cloud(二)Consul 服务治理实现

    Spring Cloud Consul 项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,具有分布式、高可用、高扩展性。 Consul...

    搜云库

扫码关注云+社区

领取腾讯云代金券