基于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
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值