机器学习:贝叶斯估计在新闻分类任务中的应用

文章摘要

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

在本篇文章中,使用搜狗实验室提供的新闻数据集,并且通过贝叶斯估计来对整理后的新闻数据集进行分类任务,大体流程如下: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: 机器学习用到的方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全渠道客服系统推荐:选型指南与最佳实践分享

售后服务是影响客户满意度的最直接的因素。有些企业不注重产品的售后服务,不仅是对客户的伤害,更是对企业品牌的损害。所以,做好售后服务对于企业来讲至关重要。 企业谈到做好售后服务,少不了一款好用的客服系统工具。其中&#…

ARM CCA机密计算软件架构之内存加密上下文(MEC)

内存加密上下文(MEC) 内存加密上下文是与内存区域相关联的加密配置,由MMU分配。 MEC是Arm Realm Management Extension(RME)的扩展。RME系统架构要求对Realm、Secure和Root PAS进行加密。用于每个PAS的加密密钥、调整或加密上下文在该PAS内是全局的。例如,对于Realm PA…

ACW741.斐波那契额数列

输入整数 N,求出斐波那契数列中的第 N项是多少。 斐波那契数列的第 0项是 0,第 1项是 1,从第 2 项开始的每一项都等于前两项之和。输入格式 第一行包含整数 T,表示共有T个测试数据。接下来 T行,每行包含一个整数 N。输…

Android长按图标展示快捷方式

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {new Thread(() -> {// 获取ShortcutManager实例ShortcutManager shortcutManager getSystemService(ShortcutManager.class);// 创建要添加的快捷方式ShortcutInfo.Builder shortcutBuilder new ShortcutInfo.Bui…

UGF框架中尝试加载AB资源来运行案例工程失败的解决办法

打开GameFramework场景,在编辑器模式下找到 表示当前资源加载模式是编辑器模式。(个人理解是和正常开发下的资源加载模式无异) CXK补充的内容:需要找到如下图的脚本,把资源加载的模式改为Package模式(单机…

com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The

配置文件示例: # SQL Server 数据源配置 spring.datasource.dynamic.datasource.sqlserver.urljdbc:sqlserver://100.100.0.0\\shili;databaseNamecs; spring.datasource.dynamic.datasource.sqlserver.usernamesa spring.datasource.dynamic.datasource.sqlserver.password sp…

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…

python 1200例——【13】计算阶乘

阶乘是一个数学概念,表示为 n!(读作 n 的阶乘),表示从 1 到 n 的所有正整数的乘积。例如,5! = 5 4 3 2 1 = 120。 在 Python 中,我们可以使用多种方法来计算阶乘。以下是其中的一些方法: 方法一:使用循环 这是最基本的方法,我们通过循环从 1 到 n 依次乘起来。…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…

拓扑排序

目录 拓扑排序 有向图的拓扑排序 拓扑排序 一个有向图,如果图中有入度为 0 的点,就把这个点删掉,同时也删掉这个点所连的边。 一直进行上面出处理,如果所有点都能被删掉,则这个图可以进行拓扑排序。 举例子&#…

【机器学习】人工智能概述

人工智能(Artificial Intelligence,简称AI)是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支,涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…

vue3框架笔记

Vue Vue 是一个渐进式的前端开发框架,很容易上手。Vue 目前的版本是 3.x,但是公司中也有很多使用的是 Vue2。Vue3 的 API 可以向下兼容 2,Vue3 中新增了很多新的写法。我们课程主要以 Vue3 为主 官网 我们学习 Vue 需要转变思想&#xff0…

[YoloV8目标检测与实例分割——目标检测onnx模型推理]

一、模型转换 1.onnxruntime ONNX Runtime(ONNX Runtime或ORT)是一个开源的高性能推理引擎,用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange(ONNX)格式定义的模型,ON…

设备健康管理系统助力制造企业实现数字化转型

在当今快速变革的制造业环境中,数字化转型已成为制造企业保持竞争力和实现可持续发展的关键。在这个数字化转型的浪潮中,设备健康管理系统正发挥着重要的作用。设备健康管理系统通过实时监测、预测分析和智能诊断等功能,为制造企业提供了全面…

亚马逊云科技Amazon Q,一款基于生成式人工智能的新型助手

近日,亚马逊云科技宣布推出Amazon Q,这是一款基于生成式人工智能(AI)的新型助手,专为辅助工作而设计,可以根据您的业务量身定制。通过连接到公司的信息存储库、代码、数据和企业系统,可以使用Am…

Redis(认识NoSQL,认识redis,安装redis,redis桌面客户端,redis常见命令,redis的Java客户端)

文章目录 Redis快速入门1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端…

Apollo自动驾驶:改变交通运输的游戏规则

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo缓存层2. 本地状态管理库3. 离线同步和冲突解决4. 离线数据同步和离线优先策略结论 📲🔌 构建离线应用:Apollo…

【微服务】springboot整合skywalking使用详解

目录 一、前言 二、SkyWalking介绍 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整体架构 2.4 SkyWalking主要工作流程 三、为什么选择SkyWalking 3.1 业务背景 3.2 常见监控工具对比 3.3 为什么选择SkyWalking 3.3.1 代码侵入性极低 3.3.2 功能丰…

Vue 自定义网站logo

效果如下&#xff1a; static目录下增加一个图标文件ico格式 修改index.html文件 代码如下&#xff1a; <link rel"shortcut icon" type"image/x-icon" href"static/lzwd.ico" > 按以上方法设置一下&#xff0c;就可以实现在浏览器显示自…

[Verilog] 加法器实现

1. 4位的加法器 先来一个最基本的的Verilog加法器 设计代码 module adder_4bit (input [3:0] a, b, output [3:0] sum, output carry);assign