Python实现贝叶斯算法疫情微博评论情感分析

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: Python实现贝叶斯算法疫情微博评论情感分析

说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

image.png

image.png


1.需求分析

在新浪微博上有很多关于新冠疫情的微博消息以及评论信息,那么这些文本数据究竟是一个怎样的观点,人们对这次疫情持什么样的态度:积极、消极还是中性。接下来通过建立贝叶斯分类模型来进行微博评论数据的情感分析。

2.数据采集

本数据是从微博上抓取的数据:

数据集:data.xlsx

在实际应用中,根据自己的数据进行替换即可。

特征数据:微博正文

标签数据:分类(积极 消极 客观)

3.数据预处理

1)原始数据描述

image.png

2)数据去重与空值处理:

image.png

去重前:

image.png

去重后:

image.png

4.数据分析过程

4.1 分词处理

微博作为一个社交平台,不仅拥有能够迅速的传播特点,并且成为了商家用来推广产品的重点发布平台。在微博中,大量广告、营销类账号的出现,给微博的情感分析造成很大的困难。所以,针对微博的文本预处理变得极其重要。

4.1.1 分词

中文的分词是将一个汉字序列变成一个个单独的有意义的词汇。文本挖掘首先要以中文分词为前提。目前常用的中文分词软件主要有以下几种:

(1)BosonNLP:玻森的中文语义开放平台,主要提供了一个方便、性能强大的中文自然语言分析的平台。

(2)NLPIR:是中国科学院计算机研究所的一个产品,积累了多年研究工作,暂时是目前世界上最好的中文分词工具。

(3)结巴分词:一款开源在GitHub上面的中文分词工具,提供了python、java等多语言的接口,而且能够识别繁体字,立志成为最好的中文分词工具。

(4)IKAnalyzer:一款开源的java分词工具,最初是以lucene为应用主体的,之后结合了词典分词和语法分析算法的分词组件。

本文中将采用中科院的NLPIR和开源的JIEBA进行分词,其中NLPIR的分类例子如下:

不让我上去疫情高风险地区我还不会自己吗![doge][doge][doge](投稿:@还没怀上的葛一他麻麻)http://t.cn/RqKTebK

如果不降噪进行分词:

['(', '不', '@还没怀上的葛一他麻麻', '投稿', '抢', '!', '会', '自己', '还', 'RqKTebK', '疫情', '上', '高风险',’高风险’,’地区’, '[doge]', '让', ':', 'http://t.cn/', ')', '吗', '我']

4.1.2 删除URL

垃圾微博中的内容一般较短,而且一般文字后面都带有链接,由此才能将用户导向网页的入口,如下面几条:

【领 10 元 优惠 券】【券 后价 19.9元】【包邮】 粉丝福利购:http://t.cn/R6j6YyX "

"神奇 口罩  =26.8 领券拍:http://t.cn/R6lLnsV http://t.cn/R6n9kRO "

"买口罩?找优惠?上莫莉口罩!http://t.cn/RxmHa1i "

"医用口罩  =49 领券拍:http://t.cn/R6nIheq http://t.cn/R6nI2Fp "

"防病毒   口罩     =58 领券拍:http://t.cn/R6CjMuM http://t.cn/R6QsX8f "

由上述内容可以知道,一般情况下的普通URL链接都是较长的字符串,如果保持原链接会占用微博的资源。因此,微博希望能够将原本的“长链接”变成缩短的短链接。微博中使用散列(hash)索引,将原始链接对应成一个较短的、一一对应的字幕、数字串组合。如:

http://t.cn/R6QsX8f

其原链接为:

http://shop.sc.weibo.com/h5/goods/index?iid=110054105972300003317973

URL中带有有用的信息很少,一般都是广告的导向和用户的定位。我们使用SQL从数据库中查找含有URL的微博数量统计。

统计结果

统计项

结果

含有URL的微博数量

16(总量:5781)

 

由此可见,URL在微博中的引用量是0.2%,量不是很大,在情感分析前,要对微博文本进行适当的清理,从而去除这些无用的URL,降低这些URL对情感分析的影响。

4.1.3 删除用户名

微博文本中的用户名一般用来提醒该用户,但是,大部分微博用户的用户名毫无规律性,如:@real__pcyyyyy、@CloverH静、@baekhyunee7永远像25岁一样年轻等,对分词器来说有较大的影响,比如JIEBA分词会把“@baekhyunee7永远像25岁一样年轻”拆分成['@', 'baekhyunee7', '永远', '像', '25', '岁', '一样', '年轻'],其中“年轻”会对用来构建的词性特征造成影响,所以,对于用户名的出去也是极其重要的。

4.1.4 去除停用词

停用词(STOP WORDS),在词典中的意思为:对文本中表达的意义并不起什么作用的词语。在SEO中,为了节省存储空间和提高检索速度,搜索引擎会在搜索时自动忽略某些字或词,这些字或词便是停用词。

停用词在一定程度上相当于过滤词,但是过滤词的范围比较大,通常包含色情、政治、暴力等敏感信息,停用词则没有这个限制。通常情况下,停用词可分为两类:

(1)使用广泛,过于频繁的一些单词。比如“我”、“你”之类的词几乎在很多文档中都会出现,对于搜索引擎来说,这类词无法保证准确的搜索结果,还会降低效率。

(2)文档中使用频率很高,但是实际意义不大的词。主要包括语气助词、副词、介词、连词等,在文本表达中没有变现出任何意义。为了增加情感分析的准确性,我们需要对微博文本中去除停用词。

 

分词结果展示(部分):

image.png

4.2 词频统计与词云图

主要是通过JIEBA工具分词后,通过循环进行词频统计,为了更方便的展示词频的效果,方便进行查看,制作成词云图。

词频统计结果展示(部分):

image.png

 

词云图:

image.png

 

5 利用贝叶斯定理情感分析

贝叶斯方法作为一个历史悠久,有着坚实的理论基础的机器学习方法,不仅能够在同时处理很多问题时直接而又高效,而且很多高级自然语言处理模型也能够从它演化而来。贝叶斯方法,是研究自然语言处理问题的一个极其优秀的切入口。其流程主要如下图4.1。

                          image.png

朴素贝叶斯情感分析基本流程

准备工作阶段:此阶段主要是对文本进行预处理,先对样本进行标注,之后根据词频筛选部分的特征词。该阶段输入的事所有待分类的样本,然后得出特征属性和训练样本。朴素贝叶斯的分类器的准确性主要由筛选出来的特征属性来决定。

分类器训练阶段:根据样本中的频率,然后由每个特征计算出每个类别的先验概率。此阶段主要是根据公式的机械计算。此阶段是朴素贝叶斯分类最重要的一个环节。

应用阶段:该阶段主要将测试样本进行输入,然后由分类器来计算出分类的记过。

5.1 贝叶斯定理

贝叶斯公式就一行:

image.png

而它其实是由以下的联合概率公式推导出来:

P(Y,X)=P(Y|X)P(X)=P(X|Y)P(Y)

其中P(Y)为先验概率,P(Y/X)叫做后验概率,P(Y,X)一般称作联合概率。

算法描述:

标准的朴素贝叶斯分类算法的执行过程。

image.png

         朴素贝叶斯文本分类流程

本文中:将不同的经过数据预处理(去掉无关类的微博)后,将剩下的微博分为三类:POS(积极)、NEG(消极)、Neural(客观)。

(1)一般情况下,积极即带有取向上、努力等思想和表现,如:全民防控 众志成城tyy生日快乐[噢耶][噢耶][噢耶]

(2)而消极则代表了负面的,不思进取的,失落等情感,如:对面疫情,有时候觉得人活着挺难的,不想说话[闭嘴]

(3)而客观的就表示仅仅陈述,不含有情感色彩的,如:疫情期间,一百本可以充实自己的外国图书,书荒的Mark

对于文本分类,常用的朴素贝叶斯主要存在三种不同的贝叶斯模型:高斯模型、多变量的伯努利模型和多项式模型

(1)高斯模型——它假设特征是正态分布的。它的一般使用场景是,给出人物的宽度和高度,判断这个人的性别。而情感分析,从给定推文文本中提取出词语的个数,不适合正态分布。

(2)伯努利模型——和高斯模型相似,更适于判断词语是否出现二值特征,而不是词频统计。

(3)多项式模型——它假设特征就是出现次数。这和我们是相关的,因为我们会把推文中的词频当做特征。

 

5.1.1 高斯朴素贝叶斯

某些特征很可能是连续型变量,比如说物体的长度和人的身高,这些特征可以转换成离散型的值。比如我们将人的身高进行划分,如表1。同时,我们也可以将身高用三个特征表示f1,f2,f3,结果如表2所示。

 

表1身高特征划分方法一

     

                   

0~160cm

1

160~170cm

2

170+cm

3

 

 

表2身高特征划分方法二 

身高

f1 f2 f3

0~160cm

1  0  0

160~170cm

0  1  0

170+cm

0  0  1

 

 

不过这些方式都不够细腻,高斯模型可以解决此类问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布。

 

5.1.2 伯努利贝叶斯

 

伯努利贝叶斯(Bernoulli Naïve Bayes,BNB)是最早基于朴素贝叶斯模型对文本进行分类的算法。模型中,一篇文本会被表示成欧式空间中的一个二进制变量,即,如果文本中在指示变量中出现的话,则将改值标为1,否则为0.给定测试文本d=1,w2···wm>,如果属性条件独立,则BNB根据下面的公式选出最大的后验概率来对文本进行分类:

image.png

从之前别人的研究可以表明伯努利贝叶斯在数据量比较少的时候性能较好,但是,当数据量大的时候,性能远远比不上多项式模型。

 

5.1.3 多项式朴素贝叶斯定理

多项式朴素贝叶斯(Multinomial Naïve Bayes,MNB)是为了改进多变量伯努利朴素贝叶斯而提出的。该模型中,文本的表示是欧式空间中的一个带有单词频率信息的向量,当一个词语在一篇文章中出现时,该文本的对应的词语频率为1,否则为0。

在条件独立的情况下,给定测试文档d=,w2,…,wm>,多项式朴素贝叶斯根据下面的极大后验概率来对文本进行分类:

image.png

 

5.2 本项目中的多项式朴素贝叶斯

5.2.1 算法过程

image.png

 

5.2.2 拉普拉斯平滑

在计算先验概率和后验概率的时候,从样本中算出的概率值很有为0,会导致相乘的结果为0,这显然是不合理的,因为不能因为一个事件没有检测到就判断改事件的概率为0。我们可以通过分子和分母都分别加入一个平滑因子aa,就可以避免这个问题。更新过后的先验概率公式变为:

image.png

K表示类别,公式变为如下:

image.png

Lj是第j维特征的最大取值

可以证明,改进以后的仍然是概率。平滑因子kk=0即为实现的最大似然估计,这时会出现在本节开始时提到的0概率问题;而kk=1则避免了0概率问题,这种方法被称为拉普拉斯平滑。

image.png

                                              拉普拉斯平滑曲线

5.3 实现过程

5.3.1 分词

结巴分词,是Github中开源的中文分词组件,该分词器能够支持三种分词模式:

(1) 精确模式:能够将句子用最精确的方法切开,普遍适用于文本分析;

(2) 全模式:能够把文本中所有成词的词语都扫描出来,虽然速度非常快,但是不能解决歧义。

(3) 搜索引擎模式:在精确模式的基础上,会对长词再次切分,提高召回率,一般适用于搜索引擎分词。

本实验是基于标注的情感分析,故使用结巴分词的精确模式来进行分词。

分词的结果:

image.png

 

5.3.2 特征提取

跟第所述的一样,使用Python统计筛选出频率最高的词。得出的结果使用词云如图所示:

image.png

词云

 

5.3.3 向量化

假如上述中的特征提取中构建出来的单词特征为[‘喜欢’,’失望’,’快乐’,’越来越好’,’晚安’],长度为m,矢量化的时候如果一条微博为:生日快乐,晚安。那么,构建出来的矩阵为:[0,0,1,0,1]。

说明:

1.如果为n条微博,则构建出来则是n*m的矩阵。

2.如果一条微博的某个特征出现次数多于一次,则进行累加,如,快乐快乐,矢量化之后变成:[0,0,2,0,0,0]。

 

5.3.4 朴素贝叶斯分类

本文中将微博的情感分为三类,分别用数字代表某一类结果,其中1表示积极,-1表示消极,0表示客观。经过之前的去标签、分词和向量化之后,样本均变成了numpy中的数组,下面将使用多项式朴素贝叶斯进行训练。其伪代码如下图所示。

image.png

朴素贝叶斯

 

5.3.5 测试及计算

之后使用从数据源中选取几个句子用来测试,结果如下(后面的标号表示分类结果,其中1表示积极,-1表示消极,0示客观):

疫情当前,不惊扰别人的宁静,就是慈悲; 不伤害别人的自尊,就是善良。 ---- 0

疫情在家里面,与大哥太有缘分!竟是同天生日!!希望大哥的模特演绎之路能够越走越远越走越顺越走越好!!! ---- 1

全民抗疫,萌萌哒 ---- 1

在疫情中,现在的年轻人,连点小事都做不好 ---- -1

新冠病毒来袭,丁丁美人飞机临时取消,只能明天再见了[失望] ---- -1

疫情中,默默看书 ---- 0

今年又遇到了疫情,一天又一天,今夕是何年[失望]    ---- -1

疫情来了,还好这只傻狗没有被学校的捕狗大队抓走[悲伤]    ---- -1

全民抗击病毒,相比游戏可以凭运气  ---- 0

面对疫情病毒,生活中却全是坑,绕不开[哈哈]   ---- 1

哎,疫情又要在家,现实比不过一个网?[拜拜]    -----1

众志成城,抗击疫情,最最亲爱的自己,最最亲爱的世界,晚安[兔子][月亮]   ---- 0

面对病毒,有点想哭   ---- -1

疫情在家,发现只要过了星期三就变得好快[晕][晕]     ---- -1

疫情在家,虽然下雨,健身不能停,瑜伽课加游泳八百米,代餐奶昔不裹腹啊,快睡吧,睡着了就不饿了! http://t.cn/R2Wx9Wb  ---- 0

 

6 情感倾向饼状图

针对,贝叶斯分析的结果,制作饼状图,如下图所示:

 

image.png

通过饼状图分析,情感倾向大部分人是客观状态的,表名人们看到这次全民抗疫还是比较客观的;再者就是积极状态的人,说明在这次抗击疫情时,人民还是比较积极的;消极的人很少。


# 本次机器学习项目实战所需的资料,项目资源如下:
 
# 项目说明:
 
# 获取方式一:
 
# 项目实战合集导航:
 
https://docs.qq.com/sheet/DTVd0Y2NNQUlWcmd6?tab=BB08J2
 
# 获取方式二:
 
链接:https://pan.baidu.com/s/13cPR38r_-VebsuFVttePHw 
提取码:mqtd
相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
72 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
1月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
287 55
|
24天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
119 66
|
5天前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
35 20
|
1天前
|
数据采集 JSON 数据格式
Python爬虫:京东商品评论内容
京东商品评论接口为商家和消费者提供了重要工具。商家可分析评论优化产品,消费者则依赖评论做出购买决策。该接口通过HTTP请求获取评论内容、时间、点赞数等数据,支持分页和筛选好评、中评、差评。Python示例代码展示了如何调用接口并处理返回的JSON数据。应用场景包括产品优化、消费者决策辅助、市场竞争分析及舆情监测。
|
14天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
13天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
28天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
57 20
|
21天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
26天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
50 5