基于CNN+tensorflow训练50000条新闻文本并实现分类

本文介绍了一位作者基于《Implementing a CNN for Text Classification in TensorFlow》的实践,利用THUCNews子集训练CNN进行文本分类。数据集包含50000条训练数据,5000条验证数据,10000条测试数据,共10个类别。预处理涉及创建词汇表、数据读取、句子向量化和数据标准化。模型采用了一维卷积神经网络,经过训练,分类效果良好,F1值达到95.3%。
摘要由CSDN通过智能技术生成

1、本文作者学习了前辈的研究
《Implementing a CNN for Text Classification in TensorFlow》以及github作者的实验,使用THUCNews的一个子集进行训练与测试。THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。非常感激前辈及学习过程中的伙伴。
github地址:
https://github.com/gaussic/text-classification-cnn-rnn#text-classification-with-cnn-and-rnn

cnew文件夹数据说明:
cnews.train.txt: 训练集(50000条)
cnews.val.txt: 验证集(5000条)
cnews.test.txt: 测试集(10000条)
cnews.vocab.txt:词汇表(5000个)
共有10个类别。
下载链接:https://pan.baidu.com/s/1u4fjHg2B9zdaejvAK_iP1w
提取码:6ubq

其中声明一下:用CNN进行文本分类不用进行分词和词性标注,整个过程最核心的部分是embedding(词嵌入)层的构建,其目的在于把每个句子用向量来表示,又要避免计算量过大,不得不做一些特殊处理。

2、数据预处理过程如下:
(1)获得词汇表:
(在给定的数据集中已经给出词汇表,但其实制作词汇表并不难)
此处构建词汇表是统计了包括训练集、验证集和测试集在内的所有文本数据当中出现频率最高的5000个词,当然也包括了标点:)。关键的地方在于词汇表的表头第0个位置放着<PAD>,目的是用于表征句子当中的词汇万一在词汇表当中没有呢?那就用词汇表的第0个位置的词来统一表示,也可以理解为补零:)。

from collections import Counter

def getVocabularyText(content_list, size):
	size = size - 1
    allContent = ''.join(content_list)
    #将内容列表中的所有文章合并起来变成字符串str形式
    counter = Counter(allContent)
    #将Counter对象实例化并传入字符串形式的内容
    vocabulary = []
	vocabulary.append('<PAD>')
	for i in counter.most_common(size):
    	vocabulary.append(i[0])
	with open('vocabulary.txt', 'w', encoding='utf8') as file:
        for vocab in vocabulary:
            file.write(vocab + '\n')

其中补充一下collections包中Counter的用法与效果:

from collections import Counter

a = 'hello大家好,我的..嗯,我的名字是Juanly!我有点害羞。。'
counter = Counter(a)
counter.most_common(2)

most_common()里面接受一个int类型数据,表示输出频率最高的int个字符并且用元组的形式表示,元组左边是该字符,右边是词频。
输出:

[('l', 3), ('我', 3)]

(2)读取数据:

with open('./cnews/cnews.vocab.txt', encoding='utf8') as file:
    vocabulary_list = [k.strip() for k in file.readlines()]
#读取词表
with open('./cnews/cnews.train.txt', encoding='utf8') as file:
    line_list = [k.strip() for k in file.readlines()]
    #读取每行
    train_label_list = [k.split()[0] for k in line_list]
    #将标签依次取出
    train_content_list = [k.split(maxsplit=1)[1] for k in line_list]
    #将内容依次取出,此处注意split()选择最大分割次数为1,否则句子被打断.
#同理读取test数据
with open('./cnews/cnews.test.txt', encoding='utf8') as file:
    line_list = [k.strip() for k in file.readlines()]
    test_label_list = [k.split()[0] for k in line_list]
    test_content_list = [k.split(maxsplit=1)[1
使用TensorFlow实现CNN文本处理的主要步骤如下: 1. 定义输入和标签数据的占位符。 2. 定义词向量矩阵,并将输入的文本序列转换为词向量序列。 3. 定义卷积层,包括卷积核数量、卷积核大小、步长和填充方式等参数。 4. 对词向量序列进行卷积运算,并使用ReLU激活函数。 5. 对卷积结果进行最大池化,提取每个卷积核的最大值。 6. 将池化结果拼接成一个向量,并通过全连接层进行分类。 7. 定义损失函数和优化器,并进行模型训练。 以下是一个使用TensorFlow实现CNN文本处理的示例代码: ```python import tensorflow as tf import numpy as np # 定义输入和标签数据的占位符 input_x = tf.placeholder(tf.float32, [None, sequence_length, embedding_size, 1], name='input_x') input_y = tf.placeholder(tf.float32, [None, num_classes], name='input_y') # 定义词向量矩阵 embedding_matrix = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name='embedding_matrix') embedded_chars = tf.nn.embedding_lookup(embedding_matrix, input_x) # 定义卷积层 filter_sizes = [3, 4, 5] num_filters = 128 pooled_outputs = [] for i, filter_size in enumerate(filter_sizes): with tf.name_scope('conv-maxpool-%s' % filter_size): filter_shape = [filter_size, embedding_size, 1, num_filters] W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name='W') b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name='b') conv = tf.nn.conv2d(embedded_chars, W, strides=[1, 1, 1, 1], padding='VALID', name='conv') h = tf.nn.relu(tf.nn.bias_add(conv, b), name='relu') pooled = tf.nn.max_pool(h, ksize=[1, sequence_length - filter_size + 1, 1, 1], strides=[1, 1, 1, 1], padding='VALID', name='pool') pooled_outputs.append(pooled) # 拼接池化结果并通过全连接层进行分类 num_filters_total = num_filters * len(filter_sizes) h_pool = tf.concat(pooled_outputs, 3) h_pool_flat = tf.reshape(h_pool, [-1, num_filters_total]) W_fc = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name='W_fc') b_fc = tf.Variable(tf.constant(0.1, shape=[num_classes]), name='b_fc') scores = tf.nn.xw_plus_b(h_pool_flat, W_fc, b_fc, name='scores') # 定义损失函数和优化器 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=scores, labels=input_y), name='loss') optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss) # 进行模型训练 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_epochs): sess.run(optimizer, feed_dict={input_x: x_train, input_y: y_train}) if (i + 1) % display_step == 0: acc = sess.run(accuracy, feed_dict={input_x: x_test, input_y: y_test}) print('Epoch %d, Accuracy: %.4f' % (i + 1, acc)) ``` 在这个示例代码中,我们使用TensorFlow实现了一个三层的CNN文本分类模型,其中包括一个嵌入层、一个卷积层和一个全连接层。在模型训练时,我们使用Adam优化器来最小化交叉熵损失函数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值