前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分类:新闻信息自动分类

数据分类:新闻信息自动分类

作者头像
马拉松程序员
发布2023-09-21 19:02:57
3140
发布2023-09-21 19:02:57
举报

1.下载并统计新闻数量

数据下载完成后,解压后的文件名news_sohusite_xml.smarty.dat(迷你版),文件编码是用的GBK。

通过观察页面URL可以发现,搜狐新闻的分类是通过二级域名分类的,比如在当前文件的第一条新闻:

当前新闻的类别是“gongyi”,所以这就是当前新闻的类别,我们可以通过获取二级域名的关键词作为当前新闻的类别。在这里因为数据是采用的xml格式,所以使用minidom模块来解析xml数据。URL链接使用urllib模块来解析,使用urlparse()函数解析URL。Hostname的值即是URL连接的域名。

新建第一个Python文件命名为t1_check.py,内容如下:

代码运行结果:{'gongyi': 192, '2008': 786, 'baobao': 2306, 'women': 5073, 's': 4985, 'roll': 658640, 'auto': 92528, 'learning': 10193, 'book': 3571, 'travel': 1857, 'yule': 47627, 'sports': 40203, 'chihe': 489, 'gd': 1298, 'business': 21083, 'money': 9442, 'news': 76792, 'stock': 44083, 'sh': 1220, 'it': 152691, 'club': 238, 'tv': 808, 'games': 9, 'cul': 1496, 'tuan': 1, '2012': 28, 'health': 21703, 'astro': 323, '2010': 514, 'dm': 26, 'green': 420, 'goabroad': 910, 'men': 944, 'korea': 105, 'v': 6, 'fund': 4284, 'expo2010': 1, 'media': 532, 'bschool': 129}

统计news_sohusite_xml.dat文件中共有39个类别1207536条新闻,不过有的新闻数量太少,我们将其剔除。为了能提高差异化,在这些类别中选择条数多的而且特点明显的作为训练数据。

经过筛选,我们选择如下八个类别的新闻作为训练和测试集:分别是{'women': 5073, 'learning': 10193,'book': 3571, 'yule': 47627,'sports': 40203, 'business': 21083,'it': 152691,'health': 21703}。这些类别的数量足够多,其次特点都相对的明显一些,虽然'roll'的分类高达658640条,但是从字面意思上看这是滚动新闻,可能是当时采集数据的那一个月的头条新闻,头条新闻类别并不明显,并不利于做分类训练。'stock'分类下也有44083条数据,但是在一定程度上,证券(包括股票基金等等)也算是商业的一部分,跟'business'分类有点重叠,'business'可以涵盖'stock',这样的作为训练数据,效果并不理想。综合评估下来,我们选择上面8个分类作为数据集。

2.获取训练测试集

前面我们选定了8个类别的新闻,现在的需要把原始文件的内容拆分出来一部分,作为数据集,考虑到每个类别数据差距比较大,选择一个平衡的数量,每个类别取3000条数据。并将每条新闻的内容(content标签下的内容)单独保存到一个txt文件中。

在步骤2,新建第一个Python文件命名为t2_parse.py,内容如下:

代码运行结果如图所示,我们已经拆分出来8个类别的新闻,每个文件夹下有3000个txt文本,内容是每个类别下的新闻内容。文件夹的位置与t2_parse.py是同一级目录。

3.拆分训练测试集

上面得到的3000*8条新闻是接下来用于训练和测试的语料库。通常情况下,我们用一部分数据去训练,剩余的一部分去测试,现在我们选取每个类别的前80%作为训练数据集,后20%作为测试数据集。当然这个比例并不是固定的,可以选择70%训练,30%测试,但是训练数据一定是要多的,保证模型的效果。

不过共同只有训练数据不足2万条,相比于正常的模型训练来说,数据量偏小,不过做作为一个例子来做还算是可以,现在预料下,我们的模型准确率可能并不是特别高。

在步骤3,新建第一个Python文件命名为t3_manual.py,内容如下:

代码运行结束后,拆分结果如图所示。

数据集拆分完成后,在当前目录新创建了“news2”文件夹,PyCharm需要加载当前目录下的文件,会花费一点时间,如果电脑性能不足的情况下,可以手动把“news”文件夹删除,后面的训练和测试都从news2中读取数据。

4. 特征提取

完成数据集拆分后,下一步就是特征提取,在9.2节中提到了两个常用的方法,本次示例就使用TF-IDF模型来提取特征向量。

你可能会比较好奇或者疑问,难道不需要分词和去除停用词吗?确实是需要,不过这两个部分,将会在特征提取之前,制作语料库的时候处理。

在开始之前需要认识两个新模块,一个是pickle,一个是bunch。两个模块的功能很简单也很容易理解。先用pip将两个模块安装到本机中,安装命令分别是

pickle提供了一个简单的持久化功能,可以将对象以文件的形式存放在磁盘上,目的就是将提取完成的特征保存为磁盘中,以方便后面的分类器来训练使用,这样就不需要每训练一次就提取一次特征,省时省力。Python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。pickle主要方法有如下两个:pickle.dump(obj, file)的作用是序列化对象,并将结果数据流写入到文件对象中。pickle.load(file)的作用是反序列化对象,将文件中的数据解析为一个Python对象。

Bunch()是一个提供属性样式访问的字典。它继承dict,拥有字典所有的功能。

熟悉这两个模块之后,现在开始做特征提取,与之前小节的方法一样,不过为了方便,需要先将所有的语料库,按照每个类别放到一起,得到一个类别的文本库。

在步骤4,新建第一个Python文件命名为t4_tfidf_space.py,内容如下:

本步操作并不是很复杂,但是为了更加使代码结构化,对各个方法进行相应的封装,代码比较长,不过最终得到结果比较简单,因为持久化的对象无法直接查看,在PyCharm 中使用断点的方式查看下train_tfidf的对象的内容

代码运行大概2-3分钟,根据机器的性能的速度而定,运行完成后,train_tfidf和test_tfidf对象以及训练集的词语集将在当前目录的feature_space文件夹中持久化。这三个文件将为后面的模型训练提供基础,在制作分类器的时候,只需要将它们加载到内存中即可。

5.制作通用分类器

到现在为止,文本分类的前期已经准备完成了,下面就是训练模型并且制作分类器。为了方便比较各个分类算法之前的性能差异,所以现在我们制作一个通用的分类器,接收分类算法、训练集数据、测试集数据,如果当前分类算法从未训练过模型,那么先进行模型训练,并将训练完成的模型持久化保存,方便下次使用。如果当前分类算法已经进行过了模型训练,则直接加载持久化的对象进行测试或者预测。

因为在代码的多处都使用了对象持久化和加载,所以将这些方法封装成一个tools工具类,新建一个tools.py,内容如下:

在步骤5,新建第一个Python文件命名为t5_classifier.py,内容如下:

编写完成分类器后,就可以实现自动文本分类了吗?并没有,还需要我们进行相应的模型训练。

6.评估和验证模型

“万事俱备,只欠东风”,分类器已经完成,现在需要将模型训练出来,就可以进行自动化的分类了。为了对比多个不同分类算法的性能差异,这里我们选择了4个分类算法进行训练,分别是朴素贝叶斯、逻辑回归、随机森林和支持向量机算法。

步骤6,新建第一个Python文件命名为t6_assess.py,内容如下:

上面四个分类算法,有的运行比较快,有的会很长,经过几分钟的运行后,得到如下结果:

日志看起来并不方便比对,将各个分类器性能对比整理成本表格。

分类器

训练时间(s)

准确率

召回率

F1-score

朴素贝叶斯

0.147

0.940

0.935

0.934

逻辑回归

17.944

0.950

0.949

0.949

随机森林

29.343

0.938

0.933

0.932

支持向量机

164.987

0.953

0.952

0.952

由上表所示,朴素贝叶斯分类器的速度非常快,可以达到毫秒级的训练时间,可以轻松应对于大数量的语料库。而支持向量机分类器虽然在性能上比较好,但是训练时间太长。这还是仅仅在不到2万条的数据量而且并没有设置各项参数下进行的。

那么现在的模型对于预测其他时间段的新闻是否可以呢,这里从网上找了21年时间的几条新闻验证一下。直接使用t6_assess.py中的多项式朴素贝叶斯来验证。

从网上找了四段新闻内容,分别为体育、健康、财经、学习类的新闻,当前的多项式朴素贝叶斯分类器预测准确了3个。

我们使用的训练集是2012年的新闻,虽然距今大约10年,但是一些新闻类的词汇还是可以通用的。因为我们训练模型使用的每个类别的训练集只有8000条,数据量不足以覆盖的全面,除此之外,我们并不没有进行参数调试,仅仅做了实际演示和基础入门的了解,在实际生产中,肯定不会训练一次就可以完成最终的模型。

在上面举例子的四个算法中,每个算法都有其选择调节的参数,感兴趣的同学可以进行下参数调优以及加大训练集的数据量,我就不再赘述了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-21 12:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马拉松程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.下载并统计新闻数量
    • 2.获取训练测试集
      • 3.拆分训练测试集
        • 4. 特征提取
          • 5.制作通用分类器
            • 6.评估和验证模型
            相关产品与服务
            腾讯云服务器利旧
            云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档