# text-cnn-classification **Repository Path**: Jasonsey/text-cnn-classification ## Basic Information - **Project Name**: text-cnn-classification - **Description**: cnn文本分类器 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-01-12 - **Last Updated**: 2022-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Text Classification with CNN 使用卷积神经网络进行中文文本分类 CNN做句子分类的论文可以参看: [Convolutional Neural Networks for Sentence Classification](https://arxiv.org/abs/1408.5882) 还可以去读dennybritz大牛的博客:[Implementing a CNN for Text Classification in TensorFlow](http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/) 以及字符级CNN的论文:[Character-level Convolutional Networks for Text Classification](https://arxiv.org/abs/1509.01626) 本文是基于TensorFlow在中文数据集上的简化实现,使用了字符级CNN对中文文本进行分类,达到了较好的效果。 ## 环境 - Python 3.5 - TensorFlow 1.3 - numpy - scikit-learn ## 数据集 训练数据集合放在`data`目录下`source`文件夹 本次训练使用了其中的2个分类放在两个文件中,每个分类近3000条数据。 类别如下: ``` 正常消息、垃圾消息 ``` 源文件保存如下: - CleanForbidChatUser.csv:垃圾文本数据集 - CleanNormalChatUser.csv:正常文本数据集 程序初始化后,每个源数据集自动划分到`data`目录下`messsage`文件中,文件即对应的数据占比如下: - message.train.txt:训练集(10) - message.val.txt: 验证集(1) - message.test.txt:测试集(2) - message.vocab.txt:初始化后字库保存位置 生产环境在线实时拉取的文本放在`data`目录下`testdata\test.csv`文件中,测试完成将在同文件夹下生成三个文件 - test.temp.txt: 临时文件集 - test.out.txt: 判断结果集 - test.bad.txt: 判断为垃圾消息文本集 ## 预处理 `data/message_loader.py`为数据的预处理文件。 - `read_file()`: 读取文件数据; - `build_vocab()`: 构建词汇表,使用字符级的表示,这一函数会将词汇表存储下来,避免每一次重复处理; - `read_vocab()`: 读取上一步存储的词汇表,转换为`{词:id}`表示; - `read_category()`: 将分类目录固定,转换为`{类别: id}`表示; - `to_words()`: 将一条由id表示的数据重新转换为文字; - `preocess_file()`: 将数据集从文字转换为固定长度的id序列表示; - `batch_iter()`: 为神经网络的训练准备经过shuffle的批次的数据。 经过数据预处理,数据的格式如下: | Data | Shape | Data | Shape | | :---------- | :---------- | :---------- | :---------- | | x_train | [50000, 100] | y_train | [50000, 2] | | x_val | [5000, 100] | y_val | [5000, 2] | | x_test | [10000, 100] | y_test | [10000, 2] | ## CNN卷积神经网络 ### 配置项 CNN可配置的参数如下所示,在`cnn_model.py`中。 ```python class TCNNConfig(object): """CNN配置参数""" embedding_dim = 64 # 词向量维度 seq_length = 100 # 序列长度 num_classes = 2 # 类别数 num_filters = 128 # 卷积核数目 kernel_size = 5 # 卷积核尺寸 vocab_size = 5000 # 词汇表达小 hidden_dim = 128 # 全连接层神经元 dropout_keep_prob = 0.5 # dropout保留比例 learning_rate = 1e-3 # 学习率 batch_size = 64 # 每批训练大小 num_epochs = 10 # 总迭代轮次 print_per_batch = 100 # 每多少轮输出一次结果 save_per_batch = 10 # 每多少轮存入tensorboard ``` ### CNN模型 具体参看`cnn_model.py`的实现。 大致结构如下: ![images/cnn_architecture](images/cnn_architecture.png) ### 训练与验证 运行 `python run_cnn.py train`,可以开始训练。 > 若之前进行过训练,请把tensorboard/textcnn删除,避免TensorBoard多次训练结果重叠。 ``` Configuring CNN model... Configuring TensorBoard and Saver... Loading training and validation data... Time usage: 0:00:00 Epoch: 1 Iter: 0, Train Loss: 0.69, Train Acc: 76.56%, Val Loss: 0.69, Val Acc: 71.59%, Time: 0:00:01 * Iter: 100, Train Loss: 0.024, Train Acc: 98.44%, Val Loss: 0.09, Val Acc: 96.34%, Time: 0:00:24 * Iter: 200, Train Loss: 0.049, Train Acc: 98.44%, Val Loss: 0.092, Val Acc: 96.14%, Time: 0:00:49 Epoch: 2 Iter: 300, Train Loss: 0.0041, Train Acc: 100.00%, Val Loss: 0.081, Val Acc: 97.27%, Time: 0:01:09 * Iter: 400, Train Loss: 0.029, Train Acc: 96.88%, Val Loss: 0.14, Val Acc: 96.01%, Time: 0:01:28 Epoch: 3 Iter: 500, Train Loss: 0.043, Train Acc: 96.88%, Val Loss: 0.091, Val Acc: 96.94%, Time: 0:01:45 Iter: 600, Train Loss: 0.023, Train Acc: 98.44%, Val Loss: 0.1, Val Acc: 95.87%, Time: 0:02:03 Iter: 700, Train Loss: 0.015, Train Acc: 98.44%, Val Loss: 0.15, Val Acc: 96.61%, Time: 0:02:19 Epoch: 4 Iter: 800, Train Loss: 0.0014, Train Acc: 100.00%, Val Loss: 0.17, Val Acc: 96.21%, Time: 0:02:35 Iter: 900, Train Loss: 0.00064, Train Acc: 100.00%, Val Loss: 0.089, Val Acc: 96.74%, Time: 0:02:51 Epoch: 5 Iter: 1000, Train Loss: 0.001, Train Acc: 100.00%, Val Loss: 0.14, Val Acc: 96.14%, Time: 0:03:07 Iter: 1100, Train Loss: 0.0025, Train Acc: 100.00%, Val Loss: 0.18, Val Acc: 95.81%, Time: 0:03:23 Epoch: 6 Iter: 1200, Train Loss: 0.00033, Train Acc: 100.00%, Val Loss: 0.18, Val Acc: 96.47%, Time: 0:03:39 Iter: 1300, Train Loss: 7.1e-05, Train Acc: 100.00%, Val Loss: 0.16, Val Acc: 96.27%, Time: 0:03:55 No optimization for a long time, auto-stopping... ``` 在验证集上的最佳效果为97.27%,经过了6轮迭代自动停止。 准确率和误差如图所示: ![images](images/acc_loss.png) ### 测试 运行 `python run_cnn.py test` 在测试集上进行测试。 ``` Configuring CNN model... Loading test data... Testing... Test Loss: 0.09, Test Acc: 97.17% Precision, Recall and F1-Score... precision recall f1-score support 垃圾消息 0.96 0.92 0.94 673 正常消息 0.98 0.99 0.98 2330 avg / total 0.97 0.97 0.97 3003 Confusion Matrix... [[ 616 57] [ 28 2302]] Time usage: 0:00:03 ``` 在测试集上的准确率达到了97.17%,且各类的precision, recall和f1-score都超过了0.9。 从混淆矩阵也可以看出分类效果非常优秀。 ### 生产环境单文本测试 运行 `python run_cnn.py api 'str'` 在测试集上进行测试。 ``` $ python3 run_cnn.py api '大佬问过客服了吗' Configuring CNN model... Loading api data... Testing... 测试结果: 正常消息 Time usage: 0:00:00 $ python3 run_cnn.py api '100员=35万园宝+VIP+700万兵符,需要的加扣扣:204938760 先给' Configuring CNN model... Loading api data... Testing... 测试结果: 垃圾消息 Time usage: 0:00:00 ``` ### 生产环境批量测试 运行 `python run_cnn.py testfile` 批量测试`data\testdata\test.csv`文件中的内容。 > 文件的第一列需以 `message` 作为列开头 ``` $ python3 run_cnn.py testfile Configuring CNN model... Loading test data... Output to file Time usage: 0:00:05 ``` 文件保存输出到`data\testdata`目录下