环境
- python3.6
- tensorflow-gpu 1.13.1
数据集
使用的是THUCNews的一个子训练集,因为原本数据集太大,包含的文本数量太多,在libsvm分类的时候就遇到了构建的特征向量超过1.3T,同时带来的就是漫长的等待时间,本次训练使用了其中10个分布类,每个分类包含6500条数据。
类别如下:
体育、财经、房产、家具、教育、科技、时尚、时政、游戏、娱乐
数据集划分如下:
- 训练集:5000*10
- 验证集:500*10
- 测试集:1000*10
子数据集构建
从原始数据集生成子数据集的过程:
- copy_data.sh用于从每个分类拷贝6500个文件
- cenws_group.py用于将多个文件整合到一个文件
copy_data.sh执行方法: - 目录结构[tree -d]

- copy_data.sh位置

执行[sh copy_data.sh]后会在data/thucnews/下生成子类结果,注意thucnews和每个分类的文件夹都需要提前手动建好,不然会出现只有一篇的情况。
预处理
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可配置的参数如下所示,在cnn_model.py中
1 | class TCNNConfig(object): |
- CNN模型

- 训练与验证
1
python run_cnn.py train
可开始训练

在验证集上的最佳效果为95.38%,且只经过了5轮迭代就已经停止。
- 测试
1
python run_cnn.py test

在测试集上的准确率达到了96.37%,且各类的precision, recall和f1-score都超过了0.9。
从混淆矩阵也可以看出分类效果非常优秀。
RNN
rnn可配置的参数如下所示,在rnn_model.py中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class TRNNConfig(object):
"""RNN配置参数"""
# 模型参数
embedding_dim = 64 # 词向量维度
seq_length = 600 # 序列长度
num_classes = 10 # 类别数
vocab_size = 5000 # 词汇表达小
num_layers= 2 # 隐藏层层数
hidden_dim = 128 # 隐藏层神经元
rnn = 'gru' # lstm 或 gru
dropout_keep_prob = 0.8 # dropout保留比例
learning_rate = 1e-3 # 学习率
batch_size = 128 # 每批训练大小
num_epochs = 10 # 总迭代轮次
print_per_batch = 100 # 每多少轮输出一次结果
save_per_batch = 10 # 每多少轮存入tensorboardRNN 模型

- 训练与验证
1
python run_rnn.py train
可开始训练

在验证集上的最佳效果为92.20%,且只经过了8轮迭代就已经停止。
- 测试
1
python run_rnn.py test

在测试集上的准确率达到了94.74%,且各类的precision, recall和f1-score,除了家居这一类别,都超过了0.9。
从混淆矩阵可以看出分类效果非常优秀。
对比两个模型,可见RNN除了在家居分类的表现不是很理想,其他几个类别较CNN差别不大。