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

news2025/1/21 18:46:19

文章摘要

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

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

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

相关文章

2024年原创深度学习算法项目分享

原创深度学习算法项目分享,包括以下领域: 图像视频、文本分析、知识图谱、推荐系统、问答系统、强化学习、机器学习、多模态、系统界面、爬虫、增量学习等领域… 有需要的话,评论区私聊

2023-12-14 LeetCode每日一题(用邮票贴满网格图)

2023-12-14每日一题 一、题目编号 2132. 用邮票贴满网格图二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。 给你邮票的尺寸为 stam…

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

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

常见推断方法一览:极大似然估计、最大后验估计、期望最大化、贝叶斯推断、马尔科夫链蒙特卡洛方法、变分推断

常见推断方法一览 推断方法区别频率派极大似然估计 MLE最大后验估计 MAP期望最大化 EM 贝叶斯推断 Bayesian马尔科夫链蒙特卡洛方法 MCMC变分推断 VI 推断方法区别 极大似然估计 (Maximum Likelihood Estimation, MLE): 解释: 假设你有一堆骰子,你投掷它们很多次&am…

Vue中目录以及文件内容简单分析

src文件下目录分析&#xff1a; App.vue文件中内容&#xff1a; vue文件中基本的三个结构&#xff0c;template&#xff08;结构&#xff09;、script&#xff08;行为&#xff09; 、style&#xff08;样式&#xff09;。 <template><!-- html结构 --><div cl…

Linux xxd命令分析视频文件Box教程(box分析box、视频box、分析atom分析)(xdd指令)

文章目录 Linux xxd命令分析视频文件Box教程一、理解MP4格式二、xxd命令简介三、使用xxd命令分析MP4文件四、解析MP4文件的疑难点1. Box的嵌套结构2. 长度和类型字段的字节序3. 非文本类型的数据 五、python代码解析box嵌套结构的示例 Linux xxd命令分析视频文件Box教程 本文主…

静物摄影在UE5里运用几点记要

被摄体&#xff0c;相机与光源的关系&#xff0c;要增强立体感&#xff0c;摄像机与光源的位置关系要错开&#xff1b;b的立体感要更强 漫反射与点光源&#xff0c;UE5太阳光属于漫反射&#xff0c;整体比较柔和&#xff0c;但是阴影处比较黑&#xff1b;摄影棚会用反光板来增亮…

计算机网络技术概述 习题答案及解析

1-1 因特网的前身是 1969 年创建的第一个分组交换网&#xff08; D &#xff09;。 A. internet B. Internet C. NSFNET D. ARPANET 【答案】D 1-2 因特网上的数据交换方式是&#xff08; C &#xff09;。 A. 电路交换 B. 报文交换 C. 分组交换 D…

ES应用_ES实战

依靠知识库使用es总结一些使用技巧。 1 快速入门 ES是将查询语句写成类似json的形式&#xff0c;通过关键字进行查询和调用。 1.1 创建 下面创建了一个主分片为5&#xff0c;副本分片为1的ES结构。ES本身是一种noschema的结构&#xff0c;但是可以通过指定mapping编程schema的…

Unity关于动画混合树(Blend Tree)的使用

在动画与动画的切换过程中&#xff0c;常因为两个动画之间的差距过大&#xff0c;而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起&#xff0c;例如在处理角色的移动中&#xff0c;走动画与跑动画切换的时候&#x…

Vue2 - Vue.observable 介绍

目录 1&#xff0c;介绍2&#xff0c;使用场景和 Vue 实例的区别 1&#xff0c;介绍 官网参考 可以让一个对象变成响应式数据。在 Vue 内部就是用它来处理传递给 Vue 的 data 对象&#xff0c;或是在单文件组件中 data() 返回的对象。 var vm new Vue({data: {count: 0} })…

qs.stringify 使用arrayFormat属性 + allowDots的数据处理 - 附示例

qs&#xff1a;将url中的参数转为对象&#xff1b;将对象转为url参数形式 一、介绍 1、官方文档&#xff1a; https://github.com/ljharb/qs https://github.com/ljharb/qshttps://github.com/ljharb/qs 二、准备工作 1、安装依赖包 npm install qs --save 2、示例版本 &…

Java循环高级(无限循环,break,continue,Random,逢七过,平方根,判断是否是质数,猜数字小游戏)

文章目录 1.无限循环概念&#xff1a;for格式&#xff1a;while格式&#xff1a;do...while格式&#xff1a;无限循环的注意事项&#xff1a; 2.条件控制语句break:continue: 3. Random使用步骤&#xff1a; 4. 逢七过5. 平方根6.判断是否为质数7. 猜数字小游戏 1.无限循环 概…

【开源项目】智慧交通~超经典开源项目实景三维数字孪生高速

数字孪生高速运营管理平台&#xff0c;以提升高速公路管理水平和方便出行为主要目标&#xff0c;充分利用云计算、AI、大数据等&#xff0c;实现对高速公路控制、指挥、运营的智能化。飞渡科技以实景三维数据为基础&#xff0c;基于大数据、高分遥感、数据分析以及数据融合等前…

QGIS003:【08选择工具栏】-按范围选择、按属性选择、按位置选择

摘要:QGIS工程工具栏包括按范围选择、按属性选择、按位置选择、取消选择等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/15GfuR15CxA2OQzURjmjwaQ?pwd=u8sf 提取码:u8sf 一、按范围选择 有矩形框选、多边形选择、手绘选择以及按半径扩展…

T 检验和 Z 检验之间的区别

在统计学领域&#xff0c;假设检验在从数据中得出有意义的结论方面发挥着至关重要的作用。两种常用的统计检验是 T 检验和 Z 检验。虽然这两种检验都用于评估假设&#xff0c;但它们的应用和假设有所不同。 t 检验和 z 检验都假设数据呈正态分布&#xff08;或近似正态分布&…

R_handbook_作图专题

ggplot基本作图 1 条形图 library(ggplot2) ggplot(biopics) geom_histogram(aes(x year_release),binwidth1,fill"gray") 2 堆砌柱状图 ggplot(biopics, aes(xyear_release)) geom_bar(aes(fillsubject_sex)) 3 堆砌比例柱状图 ggplot(biopics, aes(xyear_rele…

echarts常见的一些大屏示意图及配置项【好看】

双立体柱状图 示意图&#xff1a; 配置&#xff1a; initData() {let sideData [220, 182, 191, 234, 290, 330]let sideData1 [100, 110, 120, 134, 190, 230]let nameList [结算能力数, 结算金额]let yAxisData [(金额/亿元), (能力数/个)]let xData [1, 2, 3, 4, 5…

三角函数两角和差公式推导

一.几何推理 1.两角和公式 做一斜边为1的直角△ABC,任意旋转非 k Π , k N kΠ,kN kΠ,kN,补充如图,令 ∠ A B C ∠ α &#xff0c; ∠ C B F ∠ β ∠ABC∠α&#xff0c;∠CBF∠β ∠ABC∠α&#xff0c;∠CBF∠β ∴ ∠ D B F ∠ D B A ∠ α ∠ β 90 , ∠ D A …

vue3-13

token可以是后端api的访问依据&#xff0c;一般绝大多数时候&#xff0c;前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验&#xff0c;通过了校验&#xff0c;后端才会向前端返回数据&#xff0c;进行相应的操作&#xff0c;如果没…