简介

新闻分类课题是在算法类毕业设计中比较热门的, 本质上是属于自然语言分类, 可以使用机器学习算法去处理, 也可以使用深度学习算法去处理.

基本步骤如下 :

文本数据采集 --> 选择训练算法(机器学习/深度学习) --> 进行训练 --> 检效果.

本文章博主将介绍:
  • 从头开始实践中文短文本分类
  • 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差别

参与及比较算法

使用下面的算法来进行文本分类, 并对最后分类准确率进行比较

  • CNN 、 CNN + word2vec
  • LSTM 、 LSTM + word2vec
  • MLP(多层感知机)
  • 朴素贝叶斯
  • KNN
  • SVM
  • SVM + word2vec 、SVM + doc2vec

先说结论

  • 引入预训练的 word2vec 模型会给训练带来好处,具体来说:(1)间接引入外部训练数据,防止过拟合;(2)减少需要训练的参数个数,提高训练效率
  • LSTM 需要训练的参数个数远小于 CNN,但训练时间大于 CNN。CNN 在分类问题的表现上一直很好,无论是图像还是文本;而想让 LSTM 优势得到发挥,首先让训练数据量得到保证
  • 将单词在 word2vec 中的词向量加和求平均获得整个句子的语义向量的方法看似 naive 有时真挺奏效,当然仅限于短句子,长度 100 以内应该问题不大
  • 机器学习方法万千,具体选择用什么样的方法还是要取决于数据集的规模以及问题本身的复杂度,对于复杂程度一般的问题,看似简单的方法有可能是坠吼地

实现过程

数据爬取

爬虫这里不公开提供, 爬取的是各大新闻网站数据, 需要的联系博主获取, 联系方式在文章最下方~

数据预处理

将下载的原始数据进行转码,然后给文本标类别的标签,然后制作训练与测试数据,然后控制文本长度,分词,去标点符号

哎,坑多,费事,比较麻烦

首先,下载下来是 xml 格式,并且是 GBK (万恶之源)编码,需要转成 UTF8,并整理成 json 方便处理。原始数据长这个样:

对成功标出来的15个类的新闻,统计一下类别的分布,结果如下:

分布比较不均,第 14 类和第 15 类的新闻很少,另外第 8 类和第 11 类一个新闻也没有

所以最后选了剩下的11个类,每个类抽2000个新闻,按4:1分成训练与测试,如图


上一步选出来的训练新闻长这样,因为考虑到新闻标题的意义重大,这里就将新闻标题和新闻内容接到一起,用空格隔开,然后截取每条新闻的前 100 个字


最后得到以下结果文件:(1)新闻文本数据,每行 1 条新闻,每条新闻由若干个词组成,词之间以空格隔开,训练文本 17600 行,测试文本 4324 行;(2)新闻标签数据,每行 1 个数字,对应这条新闻所属的类别编号,训练标签 17600行,测试标签 4324 行

CNN文本分类

深度学习用的 keras 工具,操作简单易懂,模型上手飞快,居家旅行必备。keras 后端用的 Tensorflow,虽然用什么都一样

首先一些先设定一些会用到的参数

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 import to_categorical
import numpy as nptokenizer = Tokenizer()
tokenizer.fit_on_texts(all_texts)
sequences = tokenizer.texts_to_sequences(all_texts)
word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))
data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
labels = to_categorical(np.asarray(all_labels))
print('Shape of data tensor:', data.shape)
print('Shape of label tensor:', labels.shape)

再将处理后的新闻数据按 6.4:1.6:2 分为训练集,验证集,测试集

p1 = int(len(data)*(1-VALIDATION_SPLIT-TEST_SPLIT))
p2 = int(len(data)*(1-TEST_SPLIT))
x_train = data[:p1]
y_train = labels[:p1]
x_val = data[p1:p2]
y_val = labels[p1:p2]
x_test = data[p2:]
y_test = labels[p2:]
print 'train docs: '+str(len(x_train))
print 'val docs: '+str(len(x_val))
print 'test docs: '+str(len(x_test))

然后就是搭建模型,首先是一个将文本处理成向量的 embedding 层,这样每个新闻文档被处理成一个 100 x 200 的二维向量,100 是每条新闻的固定长度,每一行的长度为 200 的行向量代表这个单词在空间中的词向量。下面通过 1 层卷积层与池化层来缩小向量长度,再加一层 Flatten 层将 2 维向量压缩到 1 维,最后通过两层 Dense(全连接层)将向量长度收缩到 12 上,对应新闻分类的 12 个类(其实只有 11 个类,标签 0 没有用到)。

from keras.layers import Dense, Input, Flatten, Dropout
from keras.layers import Conv1D, MaxPooling1D, Embedding
from keras.models import Sequentialmodel = Sequential()
model.add(Embedding(len(word_index) + 1, EMBEDDING_DIM, input_length=MAX_SEQUENCE_LENGTH))
model.add(Dropout(0.2))
model.add(Conv1D(250, 3, padding='valid', activation='relu', strides=1))
model.add(MaxPooling1D(3))
model.add(Flatten())
model.add(Dense(EMBEDDING_DIM, activation='relu'))
model.add(Dense(labels.shape[1], activation='softmax'))
model.summary()

网络模型如下

实验结果如下


准确度 0.81459521

拥有11个分类的问题达到这个准确度,应该也不错(易满足)。并且搜狗给的数据本来也不是很好(甩锅)。可以看到在训练集上的准确度达到了 0.88,但是测试集上的准确度只有 0.81,说明还是有些过拟合。另外,整个模型需要训练的参数接近 1500 万,其中 1300 万都是 embedding 层的参数,说明如果利用 word2vec 模型替换 embedding 层,解放这 1300 万参数,肯定会让训练效率得到提高

其他分类方法更新中…

最后 - 毕设帮助

毕业设计之 --- 新闻分类系统相关推荐

  1. 【计算机毕业设计】新闻发布系统

    一.系统截图(需要演示视频可以私聊) 摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们 ...

  2. 计算机毕业设计php新闻发布系统的毕业设计

    项目介绍 本系统综合各方面的需求决定采用B/S架构,并利用PHP+MySQL+Apache组合来搭建PHP开发平台和 Dreamweaver CS3作为开发环境.同时结合CSS+DIV设计前台和后台各 ...

  3. 从0到1构建新闻长文本分类系统

    新闻分类系统概述 新闻分类系统,顾名思义,就是对于一片新闻或者是一片文章,进行自动的分类,例如政治,财经,娱乐等等 从技术角度讲,其实属于自然语言处理中比较经典的文本分类问题.当然在一个工业级别的分类 ...

  4. asp毕业设计——基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码)——新闻发布系统

    基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的新闻发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  5. C#毕业设计——基于C#+asp.net+sqlserver的校园新闻发布系统设计与实现(毕业论文+程序源码)——新闻发布系统

    基于C#+asp.net+sqlserver的校园新闻发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver的校园新闻发布系统设计与实现,文章末尾 ...

  6. 【毕业设计】【期末作业】新闻发布系统(php+mysql)

    分享一个新闻发布系统网站,后台主要是采用php的thinkphp框架制做的,数据库采用mysql进行处理 这个系统主要分为用户模块和后台管理模块,具体功能有 用户模块:注册,登陆,查看个人信息,修改个 ...

  7. springboot新闻阅读系统 毕业设计-附源码63315

                                                                                摘  要  在社会快速发展的影响下,新闻业继续发 ...

  8. php修改新闻分类代码,新闻分类录入、显示系统_php

    本系统可以录入标题.内容.图片.相关软件,显示时会根据是否有有图片和相关软件来判断是否显示该项内容,打开页面显示的是最新的一片文章,点击目录会显示之前的文章. 建立channelimages和chan ...

  9. 基于头条新闻数据的文本分类系统实战

    新闻数据本质上来说也属于文本数据,新闻分类本质也就归成了文本分类系统,本文主要是自己业余时间里面的一个小实践,主要是完成从数据采集.存储解析.文本向量化处理.分类模型构建几个步骤,方法和套路都是比较常 ...

  10. 计算机毕业设计(附源码)python校园新闻发布系统

    项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs. 项目技术: dj ...

最新文章

  1. 为什么重启路由器 经常重启让WiFi更快
  2. 计算机无法开机按了f2,Win7系统开机需要按F2怎么解决?
  3. java websphere mq_如何在java中使用WebSphere MQ?
  4. 怎么在百度云上部署php文件,在百度云主机上部署thinkphp5.1的注意事项
  5. 关于Jeecg互联网化dubbo改造方案(下)
  6. javascript字符串相关的面试题总结
  7. Bootstrap进度条的颜色
  8. 【DSP开发】HyperLink 编程和性能考量
  9. 【Docker】安装并测试安装成功
  10. 【重点 递归版】剑指offer——面试题16:反转链表
  11. Win7如何修复开机画面
  12. 超详细的OpenCV入门教程,12小时带你吃透OpenCV。
  13. 在eclipse中运行 carrot2 workbench
  14. 通过bat来实现 以Notepad++打开某个指定文件
  15. 投稿流程以及审稿状态
  16. FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议
  17. 用python实现一个自动保存复制图片的功能
  18. uc浏览器设置里面的的浏览器ua是什么意思
  19. 如何用好示波器?资深工程师也会忽略这些细节……
  20. 问题解决:VScode在使用中文输入法时出现vim insert模式变成vim normal的奇怪现象( jj 映射成esc)

热门文章

  1. 史上最全最实用网站来袭
  2. 面向对象 (Oriented-Object)
  3. 算法效率的度量--时间复杂度与空间复杂度
  4. Mybatis 自学笔记【全结尾狂神说练习29道】
  5. 输入两个正整数m和n,求其最大公约数和最小公倍数。
  6. iPhone长截图快捷指令(科技兽修改版)
  7. linux内核的reciprocal_value结构体
  8. 专业主义——大前研一
  9. 大数据之Python数据分析 实训 航空公司客户价值分析之二、使用 K-Means 算法进行客户分群
  10. android布局下划线设置,我可以在Android布局中为文本加下划线吗?