使用卷积神经网络以及循环神经网络进行中文文本分类
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:一个高效的中文文本分类工具包
下载,请遵循数据提供方的开源协议。
本次训练使用了其中的10个分类,每个分类6500条数据。
类别如下:
体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐
数据集划分如下:
● 训练集: 5000*10● 验证集: 500*10
● 测试集: 1000*10
从原数据集生成子集的过程请参看helper
下的两个脚本。其中,copy_data.sh
用于从每个分类拷贝6500个文件,cnews_group.py
用于将多个文件整合到一个文件中。执行该文件后,得到三个数据文件:
● 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 模型的预测方法。
原文发布时间为:2018-10-18
本文来自云栖社区合作伙伴“大数据挖掘DT机器学习”,了解相关信息可以关注“大数据挖掘DT机器学习”。