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

文章摘要

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

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

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

相关文章

Java分布式锁理论(redis、zookeeper) 详解

目录 一、分布式锁有哪些应用场景? 二、分布式锁的实现方案 三、zookeeper实现分布式锁 一直不释放锁怎么办? 如何避免分布式锁羊群效应问题? 四、redis实现分布式锁 一、分布式锁有哪些应用场景? 1、定时任务 2、秒杀抢购…

Proteus 各版本安装指南

Proteus下载链接 https://pan.baidu.com/s/1vHgg8jK9KSHdxSU9SDy4vQ?pwd0531 1.鼠标右击【Proteus8.15(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到Proteus8.15(64bit) 】。 2.打开解压后的文件夹&#…

dnSpy调试Web应用程序

文章目录 前言一、dnSpy是什么?二、如何使用dnSpy三、如何调试Web应用程序四、下载总结 前言 dnSpy是一个.NET程序集调试器和编辑器,主要用于调试和编辑没有源码的.NET程序集。 一、dnSpy是什么? dnSpy是一个.NET程序集调试器和编辑器&#…

Python武器库开发-武器库篇之子域名扫描器开发(四十一)

Python武器库开发-武器库篇之子域名扫描器开发(四十一) 在我们做红队攻防或者渗透测试的过程中,信息收集往往都是第一步的,有人说:渗透的本质就是信息收集,前期好的信息收集很大程度上决定了渗透的质量和攻击面,本文将…

C语言基础知识(6):UDP网络编程

UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点: &#xf…

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

(06)金属布线——为半导体注入生命的连接

01、半导体的核心——“连接” 在上几篇文章中,我们详细讲解了氧化、光刻、刻蚀、沉积等工艺。经过上述工艺,晶圆表面会形成各种半导体元件。半导体制造商会让晶圆表面布满晶体管和电容(Capacitor);而代工厂或CPU制造商则会让晶圆底部排列鳍式场效电晶体(FinFET)等三维…

SSD固态硬盘数据修复方案介绍

这么多故障的可能,那么固态硬盘SSD的数据修复,到底是否有办法呢?我们这里介绍两种尝试修复的方式,不能保证一定会成功。在你误删除一些文件的时候,可以尝试下,市场也有也有很多的修复软件。 方式1:采用修复…

最新版付费进群系统源码 /同城定位付费进群源码 /自带定位完整版/后台分销站点

源码介绍: 最新版付费进群系统源码 ,它是同城定位付费进群源码,而且自带定位完整版和后台分销站点。 看到有些人分享一些虚假的内容或者缺少文件的内容。现在分享完整给大家,功能是完整的。它是同城定位付费进群源码。 功能&am…

在Raspberry Pi Zero W中配置TFT LCD Framebuffer驱动

TFT LCD Framebuffer驱动配置 文章目录 TFT LCD Framebuffer驱动配置1、硬件准备2、软件配置2.1 启用SPI驱动2.2 TFT LCD设备驱动树配置 本文将以ILI9341 LCD为例,将详细介绍如何配置TFT LCD的Framebuffer驱动。 1、硬件准备 Raspberry Pi Zero W开发板一个&#x…

修改Gitee用户名

首先进入首页,点击右上角下拉列表中的账号设置 只想改姓名的话,就只要改下下面这里 还想把个人空间地址改了的话还要改下面这里

java基于SSM的二手交易平台设计与开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本二手交易平台就是在这样的大环境下诞生,其可以帮助使用者在短时间内处理完毕庞大的数据信息&am…