机器学习:贝叶斯估计在新闻分类任务中的应用(实验报告)

news2025/7/18 0:15:32

文章摘要

随着互联网的普及和发展,大量的新闻信息涌入我们的生活。然而,这些新闻信息的质量参差不齐,有些甚至包含虚假或误导性的内容。因此,对新闻进行有效的分类和筛选,以便用户能够快速获取真实、有价值的信息,成为了一个重要的课题。在这个背景下,机器学习技术应运而生,其中贝叶斯估计作为一种强大的概率推断方法,在新闻分类任务中发挥着重要作用。

在本篇文章中,使用搜狗实验室提供的新闻数据集,并且通过贝叶斯估计来对整理后的新闻数据集进行分类任务,大体流程如下:1、新闻数据集处理。2、文本分词。3、去停用词。4、构建文本特征。5、基于贝叶斯算法来完成最终的分类任务。

另外,本文除了列出了核心代码外,还给出了可执行代码以及所用到的数据源,具体看附录。

知识准备

1.朴素贝叶斯算法

输入:训练数据T=\{(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{n},y_{n})\},其中x_{i}=(x^{1}_{i},x^{2}_{i},x^{3}_{i},x^{4}_{i},...,x^{n}_{i})^{T}

x^{j}_{i}是第i个样本的第j个特征,x_{i}^{(j)}\in{a_{j1},a_{j2},...a_{jS_{j}}}a_{jl}是第j个特征可能取的第l

个值,j=1,2,...,n,l=1,2,..,S_{j},y_{j}\in{c_{1},c_{2},...,c_{k}};;实例x

输出:实例x的分类,其中K代表分类的种类有多少。

为了避免极大似然估计中概率值为0的那种情况,这里引入了常数\lambda。具体地,条件概率的贝叶斯估计是

                                 

式中\lambda>=0。等价于在随机变量各个取值的频数上赋予一个正数\lambda>0。上式为一种概率分布。取常数\lambda=1时,这是称为拉普拉斯平滑。显然对任何l=1,2,..,S_{j} , k=1,2,...,K,有

 同样,先验概率的贝叶斯估计是

                                                    

2.停用词(库)

这里我们得先考虑一个问题,一篇文章是什么主题应该是由其内容中的一些关键词来决定的,比如这里的车展跑车发动机等,这些词我们一看就知道跟汽车相关的。但是另一类词,今天‘3月份等,这些词给我们的感觉好像既可以在汽车相关的文章中使用,也可以在其他类型的文章使用,就把它们称作停用词,也就是我们需要过滤的目标。在data文件夹中,给出了多个停用词库,在源码中,我使用了stopwords.txt中停用词。可以通过以下代码来读取停用词。

# 读取停用词库  
#如果没有词表,也可以基于词频统计,词频越高的成为停用词的概率就越大  
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'], encoding='utf-8')  
stopwords.head(20)  

实验步骤

1.读取数据源

# 给出属性,这里使用的是基于内容来进行分类(加上主题分类会更简单些,这里为了增加难点使用内容分类)  
df_news = pd.read_table('./data/data.txt',names=['category','theme','URL','content'],encoding='utf-8')  
df_news = df_news.dropna()  
#查看前5条新闻  
df_news.head()  
# df_news.tail()  

输出结果如上图所示

标签解释:

Category:当前新闻所属的类别,一会我们要进行分别任务,这就是标签了。

Theme:新闻的主题,这个咱们先暂时不用,大家在练习的时候也可以把它当作特征。

URL:爬取的界面的链接,方便检验爬取数据是不是完整的,这个咱们暂时也不需要。

Content:新闻的内容,这些就是一篇文章了,里面的内容还是很丰富的。

2.中文分词

#用于保存结果  
content_S = []  
for line in content:  
#     line为每一篇文章  
    current_segment = jieba.lcut(line) #对每一篇文章进行分词  
    if len(current_segment) > 1 and current_segment != '\r\n': #换行符  
#         该篇文章词的个数>1,而且不是简单的换行才保留下来  
        content_S.append(current_segment) #保存分词的结果  

用pandas展示分词结果

df_content=pd.DataFrame({'content_S':content_S}) #专门展示分词后的结果  
df_content.head()  

前五条新闻分词结果

查看第1000条新闻分词结果

df_content.iloc[1000]  

3.去停用词

def drop_stopwords(contents,stopwords):  
    contents_clean = []  
    all_words = []  
    for line in contents:  
        line_clean = []  
        for word in line:  
            if word in stopwords:  
#                 如果这个词不在停用词当中,就保留这个词  
                continue  
            line_clean.append(word)  
            all_words.append(str(word))  
        contents_clean.append(line_clean)  
    return contents_clean,all_words  
      
contents = df_content.content_S.values.tolist()      
stopwords = stopwords.stopword.values.tolist()  
contents_clean,all_words = drop_stopwords(contents,stopwords)  
  
#df_content.content_S.isin(stopwords.stopword)  
#df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]  
#df_content.head()  

用pandas过滤掉停用词的结果

df_content=pd.DataFrame({'contents_clean':contents_clean})  
df_content.head()  

前五天新闻过滤掉停用词的结果

4.构建文本特征

一些要考虑的问题

这里我们需要到一些问题:

问题1:特征提取要考虑到词与词之间的顺序,而不是只考虑了这个词在这句话当中出现的次数。

问题2:一般语料库的词是非常多的,比如说语料库向量长度4000;那对于每句话,也要有对应的4000维向量,但是里面很多词是没有出现的,所以4000维的向量里面很多值为0,也就是每句话对应的词向量是一个“稀疏向量”。

问题3:同义词也被认为了不同的词,但很多时候同义词在句子的意思是相同的。

用一个例子理解

from sklearn.feature_extraction.text import CountVectorizer  
# 拿这四个词作为例子去理解这个计算思路  
texts=["dog cat fish","dog cat cat","fish bird", 'bird'] #为了简单期间,这里4句话就当做4篇文章  
cv = CountVectorizer() #词频统计  
cv_fit=cv.fit_transform(texts) #转换数据  
  
# 获得语料库  
print(cv. get_feature_names_out())  
# 得到每句话在每个词中出现的次数  
print(cv_fit.toarray())  
print(cv_fit.toarray().sum(axis=0))  

取词频大的词

from sklearn.feature_extraction.text import CountVectorizer  
  
vec = CountVectorizer(analyzer='word',lowercase = False)  
feature = vec.fit_transform(words)  
feature.shape  
# 结果:(3750, 85093)解释:3750为文章数;85093为语料库;每篇文章对应85093维的向量 

只取词频前4000的

from sklearn.feature_extraction.text import CountVectorizer  
  
#只统计频率前4000的词,要不每篇文章对应的向量太大了  
#这个操作之前需要先过滤掉停用词,要不然这里得到的都是没有意义的停用词了  
vec = CountVectorizer(analyzer='word', max_features=4000,  lowercase = False)  
feature = vec.fit_transform(words)  
feature.shape  
# 结果:(3750, 4000)解释:3750为文章数,4000为给文章词频最多的数  

5.通过贝叶斯预测结果

在贝叶斯模型中,选择了MultinomialNB,这里它额外做了一些平滑处理主要目的就在我们求解先验概率和条件概率的时候避免其值为0。

from sklearn.naive_bayes import MultinomialNB #贝叶斯模型  
classifier = MultinomialNB()   
# y_train为标签  
classifier.fit(feature, y_train)  
获得准确率
# 查看测试集的准确率  
classifier.score(vec.transform(test_words), y_test)  
结果准确率为:0.804

参考文献

  1. 李航。 (2019). 统计学习方法[M]. 北京: 清华大学出版社。
  2. 凌能祥,&李声闻。 (2014). 数理统计[M]. 北京: 中国科学技术大学出版社。

附录(代码)

本文用到的所有可执行代码和数据源在下面链接给出

Machine_learning: 机器学习用到的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1355543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几个有趣的go服务框架

开篇先吐槽几句~ 我个人有一些习惯, 比如在服务设计时会考虑的比较长远,会考虑到到未来的扩展等等…然后程序设计的抽象成度就会比较高,各个模块之间解耦,但这样往往就会带来程序的复杂度提升。 这其实在一些公司里面…

LeetCode 2:两数相加

一、题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…

Linux进程以及计划服务(二)

一.控制进程 前台运行:通过终端启动,且启动后一直占据终端(影响当前终端的操作) 后台运行:可通过终端启动,但启动后即转入后台运行(不影响当前终端的操作) 1.手动启动 前台启动&…

最优化理论期末复习笔记 Part 2

数学基础线性代数 从行的角度从列的角度行列式的几何解释向量范数和矩阵范数 向量范数矩阵范数的更强的性质的意义 几种向量范数诱导的矩阵范数 1 范数诱导的矩阵范数无穷范数诱导的矩阵范数2 范数诱导的矩阵范数 各种范数之间的等价性向量与矩阵序列的收敛性 函数的可微性与展…

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

2023 年最先进认证方式上线,Authing 推出 Passkey 无密码认证

密码并非是当前数字世界才有的安全手段。古今中外诸如故事中的《阿里巴巴与四十大盗》的“芝麻开门”口诀&#xff0c;或是江湖中“天王盖地虎&#xff0c;宝塔镇河妖”等传统的口令形式&#xff0c;都是以密码作为基本形态进行身份认证。然而&#xff0c;随着密码在越来越多敏…

ubuntu22.04配置双网卡绑定提升带宽

这里写自定义目录标题 Bonding简介配置验证参考链接 Bonding简介 bonding(绑定)是一种linux系统下的网卡绑定技术&#xff0c;可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡&#xff0c;能够提升网络吞吐量、实现网络冗余、负载均衡等功能&#xff0c;有很…

RTSP/Onvif安防平台EasyNVR接入EasyNVS显示服务不存在的原因及解决办法

EasyNVS云管理平台具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;可以将接入的视频资源实现统一的视频能力输出&#xff0c;支持远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户在现场部署EasyNVR&#xff0c;…

如何实现APP安全加固?加固技术、方法和方案

​ 本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修复&#xff1f;如何避免安全问题&#xff1f;首先我们先来讲一下APP安全加固技术。 Ipa Guar…

【pdf密码】pdf文件如何限制编辑?

想要给PDF文件设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&#xff0c;我们勾选【…

SpringCloud Alibaba之Nacos配置中心配置详解

目录 Nacos配置中心数据模型Nacos配置文件加载Nacos配置 Nacos配置中心数据模型 Nacos 数据模型 Key 由三元组唯一确定&#xff0c;三元组分别是Namespace、Group、DataId&#xff0c;Namespace默认是公共命名空间&#xff08;public&#xff09;&#xff0c;分组默认是 DEFAUL…

22款奔驰GLE450升级香氛负离子 车载香薰

相信大家都知道&#xff0c;奔驰自从研发出香氛负离子系统后&#xff0c;一直都受广大奔驰车主的追捧&#xff0c;香氛负离子不仅可以散发出清香淡雅的香气外&#xff0c;还可以对车内的空气进行过滤&#xff0c;使车内的有害气味通过负离子进行过滤&#xff0c;达到车内保持清…

CentOS7部署Kafka

CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…

MATLAB基本绘图操作(二维和三维绘图)

MATLAB基本绘图操作 文章目录 MATLAB基本绘图操作1、二维平面绘图1.1、线条&#xff08;折线图&#xff09;1.2、条形图1.3、极坐标图1.4、散点图 2、三维立体绘图2.1、三维曲面图2.2、三维曲线图&#xff08;点图&#xff09; 3、图片分区&#xff08;子图&#xff09; 1、二维…

【springboot项目】之秒杀项目常见问题(Seckill)

秒杀问题分为两部分&#xff1a;用户查看商品详情页、用户下单 项目简介&#xff1a; 模拟了高并发场景的商城系统&#xff0c;它具备秒杀功能&#xff0c;为了解决秒杀场景下的高并发问题。引入了 redis 作为缓存中间件&#xff0c;1.主要作用是缓存预热、预减库存等等。2.针…

简易五子棋的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

获取CNN/DM适用于评估Bart的格式的数据集(类似于test.source、test.source.tokenized)

项目场景&#xff1a; 复现文本摘要任务评估CNN/DM数据集 问题描述 abisee老哥的代码获取的是bin格式的数据集 时间久远&#xff0c;一些依赖的配置版本难以复现 笔者需要能评估Bart 格式的数据集 形式类似于test.source、test.source.tokenized 解决方案&#xff1a; 经过坚…

确定转角起始扭矩值的方法有哪些

在预紧螺栓时&#xff0c;扭矩加角度法是一种常用的方法。这种方法需要确定转角起始扭矩值&#xff0c;以确保螺栓能够被正确地预紧。确定转角起始扭矩值的方法如下&#xff0c;SunTorque智能扭矩系统带大家一起了解。1. 确定螺栓规格和性能参数 在预紧螺栓之前&#xff0c;需要…

odoo17 | 模型之间的关系

前言 上一章介绍了自定义的创建 包含基本字段的模型的视图。但是&#xff0c;在任何实际业务场景中&#xff0c;我们需要的不仅仅是 一个模型。此外&#xff0c;模型之间的链接是必要的。人们可以很容易地想象一个模型包含 客户和另一个包含用户列表的客户。您可能需要推荐客户…