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

文章摘要

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

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

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

相关文章

【完整思路】2023 年中国高校大数据挑战赛 赛题 B DNA 存储中的序列聚类与比对

2023 年中国高校大数据挑战赛 赛题 B DNA 存储中的序列聚类与比对 任务 1.错误率和拷贝数分析:分析“train_reads.txt”和“train_reference.txt”数据集中的错误率(插入、删除、替换、链断裂)和序列拷贝数。 2.聚类模型开发:开发…

Unity坦克大战开发全流程——结束场景——失败界面

结束场景——失败界面 在玩家类中重写死亡函数 在beginPanel中锁定鼠标

Redis 分布式锁总结

在一个分布式系统中,由于涉及到多个实例同时对同一个资源加锁的问题,像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用,需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis等。而由于redis分布式锁相对于比…

搭建普罗米修斯Prometheus,并监控MySQL

1.简介 prometheus是一种时间序列的数据库,适合应用于监控以及告警,但是不适合100%的准确计费,因为采集的数据不一定很准确,主要是作为监控以及收集内存、CPU、硬盘的数据。 Prometheus生态系统由多个组件组成,其中许…

积水监测识别摄像机

积水监测识别摄像机是一种利用摄像技术来监测和识别道路、桥梁、隧道等区域积水情况的设备,它可以有效地提供实时的积水监测信息,帮助交通部门和相关单位及时采取应对措施,确保道路交通的畅通和人员安全。 积水监测识别摄像机通过安装在适当位…

STM32F407ZGT6定时器(学习笔记二)

STM32F407ZGT6定时器(学习笔记一)-CSDN博客这篇文章中已经对前三种定时器的使用进行了介绍,本篇文章将介绍(1)输入捕获之计算方波时长,(2)输入捕获之编码器模式。 高级定时器和通用定…

【深入之Java进阶篇】fastjson的反序列化漏洞(详解总结)

✔️ fastjson的反序列化漏 1️⃣典型解析2️⃣拓展知识仓1️⃣AutoType2️⃣AutoType 有何错?3️⃣ 绕过checkAutotype,黑客与fastjson的博弈4️⃣autoType不开启也能被攻击?5️⃣利用异常进行攻击6️⃣AutoType 安全模式? 1️⃣典型解析 当我们使用fastjson进行…

mllib可扩展学习库java api使用

mllib可扩展学习库java api是使用Apache Spark构建的机器学习库,包括分类,聚类,特征提取和预处理等功能。本文将从以下几个方面详细介绍如何使用mllib可扩展学习库java api。 一、数据预处理 数据预处理是机器学习的重要步骤之一&#xff0…

2023.12.28 Python高级-正则表达式

目录 re正则表达式,一种专门用来匹配目标字符串的规则 re.match(),从头匹配一个,无则none re.search(), 不从头匹配返回一个,无则none re.findall(), 不从头匹配,用list返回所有 re分组 re匹配修饰符 re贪婪非贪婪 re切割和替换 re正则表达式,一种专门用来匹配目标字符串…

linux的页缓存page cache

目录 如何查看系统的 Page Cache? 为什么 Linux 不把 Page Cache 称为 block cache? Page Cache 的优劣势 Page Cache 的优势 加快数据访问 减少 IO 次数,提高系统磁盘 I/O 吞吐量 Page Cache 的劣势 由于我们开发的程序要运行的话一般…

redis—List列表

目录 前言 1.常见命令 2.使用场景 前言 列表类型是用来存储多个有序的字符串,如图2-19所示,a、b、C、d、e五个元素从左到右组成 了一个有序的列表,列表中的每个字符串称为元素(element) ,一个列表最多可以存储2^32 - 1 个元素…

功能开发 -- 向埃隆·马斯克学习任务分解

文章目录 马斯克的任务分解软件开发的任务分解可执行的最小单位任务小结 马斯克的任务分解 我们都知道埃隆马斯克(Elon Musk),他既是电动汽车公司特斯拉(Tesla)的创始人,同时还创建了太空探索公司 SpaceX。…

李宏毅 自然语言处理(Voice Conversion) 笔记

前一章笔记:李宏毅 自然语言处理(Speech Recognition) 笔记 引入 什么是voice conversion? 输入一段声音,输出另一段声音,我们希望这两端声音:内容一样,其他方面不一样&#xff08…

[设计模式 Go实现] 创建型~建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 代码实…

每日一题——LeetCode977

方法一 个人方法&#xff1a; 以示例1为例&#xff1a;把[-4,-1,0,3,10] 中n<0的元素拆分出来&#xff0c;把他们的平方从小到大放入arr数组&#xff0c;则arr[0,1,16] ,那数组就还剩[3,10] 对于剩下的元素&#xff0c;看arr里面有没有比他们平方更小的元素先放入res数组&…

vue3-12

需求是用户如果登录了&#xff0c;可以访问主页&#xff0c;如果没有登录&#xff0c;则不能访问主页&#xff0c;随后跳转到登录界面&#xff0c;让用户登录 实现思路&#xff0c;在用户登录之前做一个检查&#xff0c;如果登录了&#xff0c;则token是存在的&#xff0c;则放…

回顾2023,我的编程学习之旅

文章目录 前言我与C语言初识C语言简易扫雷游戏二进制的美妙神奇的指针强大的结构体灵活的动态内存管理总结 我与竞赛我与CSDN结语 前言 6月8号高考结束了&#xff0c;虽然还没有出分&#xff0c;但是也大致规划好自己想学什么专业了&#xff0c;没错就是计算机&#xff0c;出分…

RedisTemplate自增时保证原子性的lua脚本限制接口请求频率

场景&#xff1a;限制请求后端接口的频率&#xff0c;例如1秒钟只能请求次数不能超过10次&#xff0c;通常的写法是&#xff1a; 1.先去从redis里面拿到当前请求次数 2.判断当前次数是否大于或等于限制次数 3.当前请求次数小于限制次数时进行自增 这三步在请求不是很密集的时…

yarn run dev运行ant design pro项目报错-‘max‘ 不是内部或外部命令

运行ant design pro项目报错&#xff1a; >>yarn run dev yarn run v1.22.19 $ npm run start:dev > ant-design-pro6.0.0-beta.1 start:dev > cross-env REACT_APP_ENVdev MOCKnone UMI_ENVdev max dev max 不是内部或外部命令&#xff0c;也不是可运行的程序 …

PyTorch中常用的工具(4)Visdom

文章目录 前言3.2 Visdom 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&#xff0c;本文分成了五篇文…