代码已上传到github:https://github.com/taishan1994/tensorflow-text-classification

往期精彩:

利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料)

利用RNN进行中文文本分类(数据集是复旦中文语料)

利用CNN进行中文文本分类(数据集是复旦中文语料)

利用transformer进行中文文本分类(数据集是复旦中文语料)

基于tensorflow的中文文本分类

数据集:复旦中文语料,包含20类
数据集下载地址:https://www.kesci.com/mw/dataset/5d3a9c86cf76a600360edd04/content
数据集下载好之后将其放置在data文件夹下;
修改globalConfig.py中的全局路径为自己项目的路径;
处理后的数据和已训练好保存的模型,在这里可以下载:
链接:https://pan.baidu.com/s/1ZHzO5e__-WFYAYFIt2Kmsg 提取码:vvzy

目录结构:
|--checkpint:保存模型目录
|--|--transformer:transformer模型保存位置;
|--config:配置文件;
|--|--fudanConfig.py:包含训练配置、模型配置、数据集配置;
|--|--globaConfig.py:全局配置文件,主要是全局路径、全局参数等;
|-- data:数据保存位置;
|--|--|--Fudan:复旦数据;
|--|--|--train:训练数据;
|--|--|--answer:测试数据;
|--dataset:创建数据集,对数据进行处理的一些操作;
|--images:结果可视化图片保存位置;
|--models:模型保存文件;
|--process:对原始数据进行处理后的数据;
|--tensorboard:tensorboard可视化文件保存位置,暂时未用到;
|--utils:辅助函数保存位置,包括word2vec训练词向量、评价指标计算、结果可视化等;
|--main.py:主运行文件,选择模型、训练、测试和预测;

初始配置:

  • 词嵌入维度:200
  • 学习率:0.001
  • epoch:50
  • 词汇表大小:6000+2(加2是PAD和UNK)
  • 文本最大长度:600
  • 每多少个step进行验证:100
  • 每多少个step进行存储模型:100

环境:

  • python=>=3.6
  • tensorflow==1.15.0

当前支持的模型:

  • bilstm
  • bilstm+attention
  • textcnn
  • rcnn
  • transformer

说明

数据的输入格式:
(1)分词后去除掉停止词,再对词语进行词频统计,取频数最高的前6000个词语作为词汇表;
(2)像词汇表中加入PAD和UNK,实际上的词汇表的词语总数为6000+2=6002;
(3)当句子长度大于指定的最大长度,进行裁剪,小于最大长度,在句子前面用PAD进行填充;
(4)如果句子中的词语在词汇表中没有出现则用UNK进行代替;
(5)输入到网络中的句子实际上是进行分词后的词语映射的id,比如:
(6)输入的标签是要经过onehot编码的;

"""
"我喜欢上海",
"我喜欢打羽毛球",
"""
词汇表:['我','喜欢','打','上海','羽毛球'],对应映射:[2,3,4,5,6],0对应PAD,1对应UNK 
得到:
[
[0,2,3,5],
[2,3,4,6],
]

  1. python main.py --model transformer --saver_dir checkpoint/transformer --save_png images/transformer --train --test --predict

参数说明:

  • --model:选择模型,可选[transformer、bilstm、bilstmattn、textcnn、rcnn]
  • --saver_dir:模型保存位置,一般是checkpoint+模型名称
  • --save_png:结果可视化保存位置,一般是images+模型名称
  • --train:是否进行训练,默认为False
  • --test:是否进行测试,默认为False
  • --predict:是否进行预测,默认为False

结果

  1. transformer为例:
  2. 部分训练结果:
  3. 2020-11-01T10:43:16.955322, step: 1300, loss: 5.089711, acc: 0.8546,precision: 0.3990, recall: 0.4061, f_beta: 0.3977 *
  4. Epoch: 83
  5. train: step: 1320, loss: 0.023474, acc: 0.9922, recall: 0.8444, precision: 0.8474, f_beta: 0.8457
  6. Epoch: 84
  7. train: step: 1340, loss: 0.000000, acc: 1.0000, recall: 0.7500, precision: 0.7500, f_beta: 0.7500
  8. Epoch: 85
  9. train: step: 1360, loss: 0.000000, acc: 1.0000, recall: 0.5500, precision: 0.5500, f_beta: 0.5500
  10. Epoch: 86
  11. Epoch: 87
  12. train: step: 1380, loss: 0.000000, acc: 1.0000, recall: 0.7500, precision: 0.7500, f_beta: 0.7500
  13. Epoch: 88
  14. train: step: 1400, loss: 0.000000, acc: 1.0000, recall: 0.7000, precision: 0.7000, f_beta: 0.7000
  15. 开始验证。。。
  16.  
  17. 2020-11-01T10:44:07.347359, step: 1400, loss: 5.111372, acc: 0.8506,precision: 0.4032, recall: 0.4083, f_beta: 0.3982 *
  18. Epoch: 89
  19. train: step: 1420, loss: 0.000000, acc: 1.0000, recall: 0.5500, precision: 0.5500, f_beta: 0.5500
  20. Epoch: 90
  21. train: step: 1440, loss: 0.000000, acc: 1.0000, recall: 0.5500, precision: 0.5500, f_beta: 0.5500
  22. Epoch: 91
  23. Epoch: 92
  24. train: step: 1460, loss: 0.000000, acc: 1.0000, recall: 0.7000, precision: 0.7000, f_beta: 0.7000
  25. Epoch: 93
  26. train: step: 1480, loss: 0.000000, acc: 1.0000, recall: 0.7500, precision: 0.7500, f_beta: 0.7500
  27. Epoch: 94
  28. train: step: 1500, loss: 0.000000, acc: 1.0000, recall: 0.6000, precision: 0.6000, f_beta: 0.6000
  29. 开始验证。。。
  30.  
  31. 2020-11-01T10:44:57.645305, step: 1500, loss: 5.206666, acc: 0.8521,precision: 0.4003, recall: 0.4040, f_beta: 0.3957
  32. Epoch: 95
  33. train: step: 1520, loss: 0.000000, acc: 1.0000, recall: 0.6000, precision: 0.6000, f_beta: 0.6000
  34. Epoch: 96
  35. Epoch: 97
  36. train: step: 1540, loss: 0.000000, acc: 1.0000, recall: 0.7500, precision: 0.7500, f_beta: 0.7500
  37. Epoch: 98
  38. train: step: 1560, loss: 0.000000, acc: 1.0000, recall: 0.7000, precision: 0.7000, f_beta: 0.7000
  39. Epoch: 99
  40. train: step: 1580, loss: 0.000000, acc: 1.0000, recall: 0.8000, precision: 0.8000, f_beta: 0.8000
  41. Epoch: 100
  42. train: step: 1600, loss: 0.000000, acc: 1.0000, recall: 0.5000, precision: 0.5000, f_beta: 0.5000
  43. 开始验证。。。
  44.  
  45. 2020-11-01T10:45:47.867190, step: 1600, loss: 5.080955, acc: 0.8566,precision: 0.4087, recall: 0.4131, f_beta: 0.4036 *
  46. <Figure size 1000x600 with 10 Axes>
  47. 绘图完成了。。。
  48. 开始进行测试。。。
  49. 计算Precision, Recall and F1-Score...
  50. precision recall f1-score support
  51.  
  52. Agriculture 0.89 0.90 0.89 1022
  53. Art 0.80 0.95 0.86 742
  54. Communication 0.19 0.26 0.22 27
  55. Computer 0.95 0.94 0.94 1358
  56. Economy 0.86 0.91 0.89 1601
  57. Education 1.00 0.11 0.21 61
  58. Electronics 0.35 0.39 0.37 28
  59. Energy 1.00 0.03 0.06 33
  60. Enviornment 0.88 0.96 0.92 1218
  61. History 0.79 0.48 0.60 468
  62. Law 1.00 0.12 0.21 52
  63. Literature 0.00 0.00 0.00 34
  64. Medical 0.50 0.13 0.21 53
  65. Military 0.33 0.01 0.03 76
  66. Mine 1.00 0.03 0.06 34
  67. Philosophy 1.00 0.04 0.09 45
  68. Politics 0.73 0.91 0.81 1026
  69. Space 0.84 0.86 0.85 642
  70. Sports 0.93 0.91 0.92 1254
  71. Transport 0.33 0.03 0.06 59
  72.  
  73. accuracy 0.86 9833
  74. macro avg 0.72 0.45 0.46 9833
  75. weighted avg 0.85 0.86 0.84 9833

结果可视化图片如下:

  1. 进行预测。。。
  2. 开始预测文本的类别。。。
  3. 输入的文本是:自动化学报ACTA AUTOMATICA SINICA1997年 第23卷 第4期 Vol.23 No.4 1997一种在线建模方法的研究1)赵希男 粱三龙 潘德惠摘 要 针对一类系统提出了一种通用性...
  4. 预测的类别是: Computer
  5. 真实的类别是: Computer
  6. ================================================
  7. 输入的文本是:航空动力学报JOURNAL OF AEROSPACE POWER1999年 第14卷 第1期 VOL.14 No.1 1999变几何涡扇发动机几何调节对性能的影响朱之丽 李 东摘要:本文以高推重比涡扇...
  8. 预测的类别是: Space
  9. 真实的类别是: Space
  10. ================================================
  11. 输入的文本是:【 文献号 1-4242【原文出处】图书馆论坛【原刊地名】广州【原刊期号】199503【原刊页号】13-15【分 号】G9【分 名】图书馆学、信息科学、资料工作【 】周坚宇【复印期...
  12. 预测的类别是: Sports
  13. 真实的类别是: Sports
  14. ================================================
  15. 输入的文本是:产业与环境INDUSTRY AND ENVIRONMENT1998 20 4 Vol.20 No.4 1998科技期刊采矿——事实与数字引 言本期《产业与环境》中的向前看文章并没有十分详细地...
  16. 预测的类别是: Enviornment
  17. 真实的类别是: Enviornment
  18. ================================================
  19. 输入的文本是:环境技术ENVIRONMENTAL TECHNOLOGY1999 3 No.3 1999正弦振动试验中物理计算闫立摘要:本文通过阐述正弦振动试验技术涉及的物理概念、力学原理,编写了较适用的C语言...
  20. 预测的类别是: Space
  21. 真实的类别是: Enviornment
  22. ================================================

下面是一些实现的对比:
transformer

评价指标 precision recall f1-score support
accuracy     0.86 9833
macro avg 0.72 0.45 0.46 9833
weighted avg 0.85 0.86 0.84 9833

bistm

评价指标 precision recall f1-score support
accuracy     0.77 9833
macro avg 0.47 0.40 0.41 9833
weighted avg 0.76 0.77 0.76 9833

bilstmattn

评价指标 precision recall f1-score support
accuracy     0.92 9833
macro avg 0.70 0.64 0.65 9833
weighted avg 0.93 0.92 0.92 9833

textrcnn

评价指标 precision recall f1-score support
accuracy     0.89 9833
macro avg 0.71 0.46 0.48 9833
weighted avg 0.88 0.89 0.87 9833

rcnn
很奇怪,rcnn网络并没有得到有效的训练

评价指标 precision recall f1-score support
accuracy     0.16 9833
macro avg 0.01 0.05 0.02 9833
weighted avg 0.04 0.16 0.05 9833

十分感谢以下仓库,给了自己很多参考:
https://github.com/jiangxinyang227/NLP-Project/tree/master/text_classifier 
https://github.com/gaussic/text-classification-cnn-rnn

基于tensorflow的文本分类总结(数据集是复旦中文语料)的更多相关文章

  1. 利用RNN进行中文文本分类(数据集是复旦中文语料)

    利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 1.训练词向量 数据预处理参考利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) ,现在我们有了分词 ...

  2. 利用CNN进行中文文本分类(数据集是复旦中文语料)

    利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 利用RNN进行中文文本分类(数据集是复旦中文语料) 上一节我们利用了RNN(GRU)对中文文本进行了分类,本节我们将继续使用 ...

  3. 利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料)

    1.对语料进行分析 基本目录如下: 其中train存放的是训练集,answer存放的是测试集,具体看下train中的文件: 下面有20个文件夹,对应着20个类,我们继续看下其中的文件,以C3-Art为 ...

  4. tensorflow实现基于LSTM的文本分类方法

    tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...

  5. 一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)

    雷锋网按:本文作者陆池,原文载于作者个人博客,雷锋网已获授权. 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用 ...

  6. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  7. 基于weka的文本分类实现

    weka介绍 参见 1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wY ...

  8. 基于SVMLight的文本分类

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本 .非线性及高维模式识别 中表现出许多特有的优势,并能够推广应用到函数拟合等 ...

  9. Python 基于 NLP 的文本分类

    这是前一段时间在做的事情,有些python库需要python3.5以上,所以mac请先升级 brew安装以下就好,然后Preference(comm+',')->Project: Text-Cl ...

随机推荐

  1. RTThread DFS文件系统使用: 基于使用SFUD驱动的SPI FLASH之上的ELM FATFS文件系统

    参考博文: 博文很长,但是实际要操作的步骤没几下. http://m.elecfans.com/article/730878.html  为了防止几年后文章链接找不到,我把文章复制过来了 /***** ...

  2. 中部:执具 | R语言数据分析(北京邮电大学)自整理笔记

    第5章工欲善其事.必先利其器 代码,是延伸我们思想最好的工具. 第6章基础编程--用别人的包和函数讲述自己的故事 6.1编程环境 1.R语言的三段论 大前提:计算机语言程序=算法+数据结构 小前提:R ...

  3. #ifdef _DEBUG #define new DEBUG_NEW #endif的解释

    转载:https://blog.csdn.net/sinat_20265495/article/details/51762738 在用vc时,利用AppWizard会产生如下代码:#ifdef _DE ...

  4. uni-app引入iconfont字体图标

    1 首先进入你的iconfont项目 很好, 看见圈圈的吗 , 我说蓝色的,记住了,选到这个 ,然后点击下载本地项目, 解压完就是这个了 ,然后把 圈起来的放到你的项目文件里面 ,记得引入的时候路径别 ...

  5. nginx完美支持thinkphp3.2.2(需配置URL_MODE=>3 rewrite兼容模式)

    来源:http://www.thinkphp.cn/topic/26637.html 环境:nginx 1.6,thinkphp3.2.2 第一步,修改server块 server { listen ...

  6. 架构师根本不会被语言限制住,php照样可以用领域驱动设计DDD四层架构!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你在通往架构师的路上吗? 程序员这个行业就像是在不断的打怪升级,突破每一阶段的瓶颈期 ...

  7. node_modules 文件夹需要管理员权限才能删除问题

    方法一:以管理员权限运行IDE ,然后在IDE里面删除该文件夹 方法二:以管理员身份运行cmd,使用命令行来删除该文件夹 找到要删除文件夹的位置,使用命令行 rmdir /s/q 文件夹位置 /s 是 ...

  8. Rust之路(2)——数据类型 上篇

    [未经书面同意,严禁转载] -- 2020-10-13 -- Rust是系统编程语言.什么意思呢?其主要领域是编写贴近操作系统的软件,文件操作.办公工具.网络系统,日常用的各种客户端.浏览器.记事本. ...

  9. spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)

    一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...

  10. sql 删除所有存储过程

    1.执行以下sql语句即可删除所有存储过程 --/**********删除所有存储过程*************************/-- use 数据库名 go declare @tname v ...