基于TensorFlow的CNN/RNN用于文本分类

代码链接:
https://github.com/wonderfultina/NLP
环境
Python 3
TensorFlow 1.3以上
numpy
scikit-learn
scipy

数据集
本文采用了清华NLP组提供的THUCNews新闻文本分类数据集的一个子集。
本次训练使用了其中的10个分类,每个分类6500条,总共65000条新闻数据。

类别如下:

体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐
数据集划分如下:

训练集: 500010
验证集: 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可配置的参数如下所示,在cnn_model.py中。
class TCNNConfig(object):
“”“CNN配置参数”""

embedding_dim = 64      # 词向量维度
seq_length = 600        # 序列长度
num_classes = 10        # 类别数
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的实现。
大致结构如下:
cnn结构
训练与验证
运行 python run_cnn.py train,可以开始训练。
若之前进行过训练,请把tensorboard/textcnn删除,避免TensorBoard多次训练结果重叠。
在验证集上的最佳效果为94.12%,且只经过了3轮迭代就已经停止。
准确率和误差如图所示:
准确率和误差
测试
运行 python run_cnn.py test 在测试集上进行测试。
在测试集上的准确率达到了96.04%,且各类的precision, recall和f1-score都超过了0.9。
从混淆矩阵也可以看出分类效果非常优秀。

RNN循环神经网络
配置项
RNN可配置的参数如下所示,在rnn_model.py中。
class 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      # 每多少轮存入tensorboard

RNN模型
具体参看rnn_model.py的实现。
大致结构如下:
大致结构
训练与验证
这部分的代码与 run_cnn.py极为相似,只需要将模型和部分目录稍微修改。
运行 python run_rnn.py train,可以开始训练。
在验证集上的最佳效果为91.42%,经过了8轮迭代停止,速度相比CNN慢很多。
准确率和误差如图所示:
准确率和误差
测试
运行 python run_rnn.py test 在测试集上进行测试。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
文本分类可以使用多种模型,其中包括文本分类CNNRNN文本分类CNN模型使用了一维卷积层和时序最大池化层。首先,定义多个一维卷积核,并使用这些卷积核对输入进行卷积计算,不同宽度的卷积核可以捕捉到不同个数的相邻词的相关性。然后,对输出的所有通道分别进行时序最大池化,得到池化输出值,并将这些通道的池化输出值连结为向量。最后,通过全连接层将连结后的向量变换为关于各类别的输出,可以使用丢弃层来应对过拟合。 而文本分类RNN模型则使用循环神经网络,通过将序列中的每个词依次输入RNN进行处理。RNN会记住之前的信息,并根据当前输入的词和之前的记忆进行预测和分类。这使得RNN在处理序列数据时具有较好的表现。 总而言之,文本分类CNNRNN模型都是用于处理文本分类任务的模型,其中文本分类CNN使用了卷积层和池化层,而文本分类RNN使用了循环神经网络。它们都可以根据输入的文本序列进行分类预测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [人工智能-项目实践-文本分类-CNN-RNN中文文本分类,基于TensorFlow](https://download.csdn.net/download/admin_maxin/85357377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [文本分类(使用RNNCNN)](https://blog.csdn.net/weixin_44696221/article/details/104466421)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [NLP实践 数据探索 CNNRNN训练文本分类器 (转载)](https://blog.csdn.net/weixin_43599067/article/details/90183059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值