新闻分类器的模型训练与单篇分类(cnn+word2vec)
在cnn之上引入word2vec的好处:(1)间接引入外部训练数据,防止过拟合;(2)减少需要训练的参数个数,提高训练效率
数据预处理
将下载的原始数据进行转码,然后给文本标类别的标签,然后制作训练与测试数据,然后控制文本长度,分词,去标点符号
哎,坑多,费事,比较麻烦
首先,搜狗实验室提供的数据下载下来是 xml 格式,并且是 GBK (万恶之源)编码,需要转成 UTF8,并整理成 json 方便处理。原始数据长这个样:
利用 python 先读入数据然后转码再保存
挑选出的11个类分别为:
- 政治
- 社会
- 军事
- 财经
- 教育
- 体育
- 娱乐
- 反腐
- 科技
- 健康
用序号1~11表示
对这些新闻的长度进行统计结果如下:![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c1c40486727b3e702e595c20370d59b.jpeg)
由于发现短文本居多所以选择截取每段文字的前100字进行短文本的训练。去掉停用词并用jieba进行分词后的新闻如下图:![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/0272356ed670bb847f8d0f636d0c4161.jpeg)
1 CNN
深度学习用的 keras 工具,操作简单易懂,模型上手飞快,居家旅行必备。keras 后端用的 Tensorflow,虽然用什么都一样
不使用预训练 word2vec 模型的 CNN:
首先一些先设定一些会用到的参数
MAX_SEQUENCE_LENGTH = 100 # 每条新闻最大长度
EMBEDDING_DIM = 200 # 词向量空间维度
VALIDATION_SPLIT = 0.16 # 验证集比例
TEST_SPLIT = 0.2 # 测试集比例
第一步先把训练与测试数据放在一起提取特征,使用 keras 的 Tokenizer 来实现,将新闻文档处理成单词索引序列,单词与序号之间的对应关系靠单词的索引表 word_index 来记录,这里从所有新闻中提取到 65604 个单词,比如 [苟,国家,生死] 就变成了 [1024, 666, 233] ;然后将长度不足 100 的新闻用 0 填充(在前端填充),用 keras 的 pad_sequences 实现;最后将标签处理成 one-hot 向量,比如 6 变成了 [0,0,0,0,0,0,1,0,0,0,0,0,0],用 keras 的 to_categorical 实现
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils