Python利用情感词典做情感分析

article/2025/3/14 20:30:19

情感分析是大数据时代常见的一种分析方法,多用于对产品评论的情感挖掘,以探究顾客的满意度程度。在做情感分析时,有两种途径:一种是基于情感词典的分析方法,一种是基于机器学习的方法,两者各有利弊。
在此,笔者主要想跟大家分享基于python平台利用情感词典做情感分析的方法。本文主要参考https://blog.csdn.net/lom9357bye/article/details/79058946这篇文章,在此文章中,博主用一句简单的语句“我今天很高兴也非常开心”向我们清楚的展示的利用情感词典做情感分析的方法,这篇文章对笔者很受用。
然而这篇文章博主也向我们抛出了几个问题,笔者就是基于此改写的算法。主要分以下几个步骤:
(1)过滤掉停用词表中的否定词和程度副词
有时候,停用词表中的词包括了否定词和程度副词,因此在做情感分析时首要先过滤掉停用词表中的否定词和程度副词,防止这些有意义的词被过滤掉。词表的下载见上述博主。

"""在停用词表中过滤否定词和程度副词"""
#生成stopword表,需要去除一些否定词和程度词汇
stopwords = set()
fr = open('stopwords.txt','r',encoding='utf-8')
for word in fr:stopwords.add(word.strip())#Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。# #读取否定词文件not_word_file = open('否定词.txt','r+',encoding='utf-8')not_word_list = not_word_file.readlines()not_word_list = [w.strip() for w in not_word_list]#读取程度副词文件degree_file = open('程度副词.txt','r+')degree_list = degree_file.readlines()degree_list = [item.split(',')[0] for item in degree_list]#生成新的停用词表with open('stopwords_new.txt','w',encoding='utf-8') as f:for word in stopwords:if(word not in not_word_list) and (word not in degree_list):f.write(word+'\n')

(2)分词,过滤停用词

def seg_word(sentence):jieba.load_userdict("./dict.txt")seg_list = jieba.cut(sentence)seg_result = []# 读取停用词文件stopwords = [line.strip() for line in open('stopwords_new.txt', encoding='UTF-8').readlines()]# 去停用词for word in seg_list:  # 读取每一行分词if word not in stopwords:  # 如果分词不在停用词列表中if word != '\t':seg_result.append(word)print(seg_result)return seg_result

(3)找出分词结果中的情感词、否定词和程度副词
在博主的文章中,这里出现了一个错误就是如果句子中出现两个相同的情感词、程度副词和否定词的话,前面的就会被后面的覆盖掉了,这是因为博主将分词结果转换成了以词作为key,索引作为value的字典形式,但如果我们只对分词结果以列表的形式进行遍历,则可避免这种情况的发生。

def classify_words( word_list):"""词语分类,找出情感词、否定词、程度副词"""# 读取情感字典文件sen_file = open('BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')# 获取字典文件内容sen_list = sen_file.readlines()  # sen_list是一个二维列表# 创建情感字典sen_dict = defaultdict()# 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值for s in sen_list:# 每一行内容根据空格分割,索引0是情感词,索引1是情感分值(情感词典文件中有一行是空行,因此执行的时候会报错,注意处理一下空行,这里没有处理)# print(s)sen_dict[s.split(' ')[0]] = s.split(' ')[1]  # 字典的键值对形式# 读取否定词文件not_word_file = open('否定词.txt', 'r+', encoding='utf-8')# 由于否定词只有词,没有分值,使用list即可not_word_list = not_word_file.readlines()not_dict = defaultdict()for n in not_word_list:not_dict[n.split(',')[0]] = n.split(',')[1]# 读取程度副词文件degree_file = open('程度副词.txt', 'r+', encoding='ANSI')degree_list = degree_file.readlines()degree_dict = defaultdict()# 程度副词与情感词处理方式一样,转为程度副词字典对象,key为程度副词,value为对应的程度值for d in degree_list:degree_dict[d.split(',')[0]] = d.split(',')[1]# 分类结果,词语的index作为key,词语的分值作为value,否定词分值设为-1sen_word = dict()not_word = dict()degree_word = dict()# 分类for i in range(len(word_list)):word = word_list[i]if word in sen_dict.keys() and word not in not_dict.keys() and word not in degree_dict.keys():# 找出分词结果中在情感字典中的词sen_word[i] = sen_dict[word]elif word in not_dict.keys() and word not in degree_dict.keys():# 分词结果中在否定词列表中的词not_word[i] = -1elif word in degree_dict.keys():# 分词结果中在程度副词中的词degree_word[i] = degree_dict[word]# 将分类结果返回print(sen_word,not_word,degree_word)return sen_word, not_word, degree_word

(4)计算情感值
在计算情感值的过程中,博主提出了两个问题,第一是对第一个情感词之前的程度副词和否定词的判断情况,第二个就是权重W没有初始化,被累乘的情况。笔者将它改成下面的代码形式,完美解决了这两个问题。

#1.用来判断第一个情感词之前的程度副词和否定词
def get_init_weight(sen_word, not_word, degree_word):# 权重初始化为1W = 1# 将情感字典的key转为listsen_word_index_list = list(sen_word.keys())if len(sen_word_index_list) == 0:return W# 获取第一个情感词的下标,遍历从0到此位置之间的所有词,找出程度词和否定词for i in range(0, sen_word_index_list[0]):if i in not_word.keys():W *= -1elif i in degree_word.keys():#更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[i])return W#2.计算得分
def socre_sentiment(sen_word, not_word, degree_word, seg_result):W = get_init_weight(sen_word, not_word, degree_word)print(W)score = 0# 情感词下标初始化sentiment_index = -1# 情感词的位置下标集合sentiment_index_list = list(sen_word.keys())#print(sentiment_index_list)# 遍历分词结果(遍历分词结果是为了定位两个情感词之间的程度副词和否定词)for i in range(0, len(seg_result)):# 如果是情感词(根据下标是否在情感词分类结果中判断)if i in sen_word.keys():# 权重*情感词得分score += W * float(sen_word[i])print(score)# 情感词下标加1,获取下一个情感词的位置sentiment_index += 1print("sentiment_index:",sentiment_index)if sentiment_index < len(sentiment_index_list) - 1:  #总的情感词的个数# 判断当前的情感词与下一个情感词之间是否有程度副词或否定词"""这个是解决W累乘情况的"""W=1  #防止第二轮的权重出现累乘的情况for j in range(sentiment_index_list[sentiment_index], sentiment_index_list[sentiment_index + 1]):# 更新权重,如果有否定词,取反if j in not_word.keys():W *= -1elif j in degree_word.keys():# 更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[j])print(W)"""这里又出现了一个问题,就是后一个没有否定词和程度副词的权重会将前一个覆盖掉,所以初始化权重W=1不能放在for循环中"""# 定位到下一个情感词if sentiment_index < len(sentiment_index_list) - 1:i = sentiment_index_list[sentiment_index + 1]return score

(5)测试
测试过程中,笔者用了一句和博主测试语句情感相反的语句,“我很不高兴也非常不开心”

seg_list = seg_word("我很不高兴也非常不开心")  
sen_word, not_word, degree_word = classify_words(seg_list)
score = socre_sentiment(sen_word, not_word, degree_word, seg_list)
print(score)

测试结果如下图所示:在这里插入图片描述
其中,第一行表示的是分词结果,第二行表示的是分词结果中情感词、否定词和程度副词词典
第三行表示的就是第一个情感词之前的否定词和程度副词所代表的权重,其中“很”的权重是1.6,“不”的权重是-1,那么第一次循环中的得分score=(-1)1.6score(“高兴”),第二次循环求得的是第一个情感词“高兴”和第二个情感词“开心”之间的权重,也就是“非常”=1.8,"不“=-1,第二次求得的分数score=上一次循环中求得的分值+(-1)1.8score(”开心“)。由于没有下一个情感词了,所以这也是最终句子的情感值得分。

参考来源:https://blog.csdn.net/lom9357bye/article/details/79058946


http://chatgpt.dhexx.cn/article/9sqAOfVX.shtml

相关文章

共现分析

一、共现分析概念 “共现”指文献的特征项描述的信息共同出现的现象&#xff0c;这里的特征项包括文献的外部和内部特征&#xff0c;如题名、作者、关键词、机构等。 而“共现分析”是对共现现象的定量研究&#xff0c; 以揭示信息的内容关联和特征项所隐含的知识。 二、共…

python基于情感词典的情感分析

今天给大家分享的是通过情感词典来对文本进行情感分析最后计算出情感得分 通过情感得分来判断正负调性 主要步骤&#xff1a; 数据准备 本次情感词典采用的是BosonNLP的情感词典&#xff0c;来源于社交媒体文本&#xff0c;所以词典适用于处理社交媒体的情感分析 本次分析准备的…

python 热词分析_Python笔记:热词分析2020-01-01

热词分析在公众趋势分析、舆情分析有很宽广的应用&#xff0c;我们来看看怎么从一个TXT文件中分析出文章的热词出来&#xff0c;我们采用流行的第三方“结巴”包来实现。 首先安装第三方包(matplotlib&#xff0c;jieba&#xff0c;wordcloud&#xff0c;numpy)mmatplotlib主要…

【共词聚类分析】基于CNKI和WOS的小样本稳健性检验

很久之前的一篇文章&#xff0c;最近终于收到了Reviewers的回复&#xff08;一把心酸…其中有一个Comments如下&#xff0c;意思是我们原先的文章没法证明共词聚类方法的结论是合理的…于是打算新增加一个稳健型检验&#xff08;robust analysis&#xff09;&#xff0c;由于上…

python共词矩阵分析结果一步到位

import os import re import pandas as pd from PyPDF2 import PdfFileReader import string import yakeif __name__ __main__:# 运行第一部分代码pdf_files_path C:/Users/win10/Documents/美国智库/pdf_files# 定义一个函数&#xff0c;用于读取PDF文件并将其转化成文本de…

共词分析

一、共现分析概念及主要类型 “共现”指文献的特征项描述的信息共同出现的现象&#xff0c;这里的特征项包括文献的外部和内部特征&#xff0c;如题名、作者、关键词、机构等。而“共现分析”是对共现现象的定量研究&#xff0c;以揭示信息的内容关联和特征项所隐含的知识。常…

AD09由英文改中文菜单步骤

1&#xff1a;打开AD09&#xff0c;点击DXP&#xff0c;选择Preferences 2&#xff1a;在对话框的左边一竖列选择General 3&#xff1a;选择左边竖列后&#xff0c;在右边找到Localization选项 4&#xff1a;点击应用&#xff0c;再点击OK。 5&#xff1a;然后关闭AD09&#xf…

AD软件的常用基本设置

AD软件的基本设置 前言 工欲善其事&#xff0c;必先利其器&#xff1b;最近学弟一直在忙着画板子&#xff0c;但是效率非常低&#xff0c;在看过他的软件基本设置&#xff0c;以及对软件快捷键掌握程度后&#xff08;新手小白&#xff09;&#xff0c;我决定将常AD的常用基本…

STM32定时器做时钟源输出基于CubeMx

目录 前言 CubeMX配置 开始函数 改变频率 改占空比 结论 前言 调试使用的评估板&#xff1a;https://item.taobao.com/item.htm?spma230r.1.14.17.432b1562F8z658&id612002664117&ns1&abbucket14#detail 作者再调试AD5933过程中&#xff0c;需要输出100Hz…

Evaluation Board User Guide UG-364 文档 BUG

最近作者使用这个芯片&#xff1b;在进行硬件性能对比测试中发现ADI文档中的一个小问题&#xff1b; 相位角计算的过程中&#xff0c;就是下图 结合下面的代码&#xff0c;验证了上面文档应该是手误导致的。

2019年全国大学生电子设计竞赛D题简易电路特性测试仪试题

题目要求部分 我负责的部分就是测量阻抗的部分&#xff0c;这一次我使用的是AD5933 AD5933介绍 我这一篇主要是讲使用5933计算那个待测电路的阻抗值&#xff0c;首先就是在概括处已经说明是我们读取的数据其实是一个实部和一个虚部。 然后我们要记住的是向寄存器0x94&#xf…

电赛专题 |国一作品_线路负载及故障检测装置

有幸邀请到了在2019大学生电子设计大赛的获奖优秀队员为本公众号投稿&#xff0c;将分几次推文为大家介绍几只优秀队伍的作品。 本次推文为大家分享西安电子科技大学微电子学院的团队的作品&#xff0c;团队成员为&#xff1a;蒋昊宇 冯郑 张岳琦&#xff08;排名不分先后&…

智能电导率系统电路设计详解

电导率是一个衡量水溶液导电能力的电学物理量&#xff0c; 电阻率的倒数为电导率&#xff0c;用希腊字母κ表示&#xff0c;κ1/ρ。一般意义上&#xff0c;电导率的测量温度是标准温度&#xff08;25℃&#xff09;。在液体中&#xff0c;水的电导率是衡量水质的一个重要指标。…

AD5934阻抗变换模块实验电路板

■ 前言 本文讨论了基于AD5934构建阻抗变换模块。并对于它测试相应的阻抗进行实验。 01电路设计 1.原理图设计1 ▲ 实验电路板 原理图 2.PCB版图 ▲ 实验电路板PCB 电路板输出接口从右到左&#xff0c;前四个的功能定义如下表。后面四个是用于调试使用。 管脚(从右到左)符号功…

使用AD5933测量元器件的谐振特性

■ 前言 元器件的谐振特性 使用 使用AD5933测量电子器件复阻抗 测量元器件的谐振特性。这里记录了一些相应的的电子实验的数据。以备之后进行复习和参考。 01测量电路 在 使用AD5933测量电子器件复阻抗 中给出了直接测量一些元器件&#xff08;电阻、电容&#xff09;的结果。…

AD5933测量容性负载时的神秘振荡信号

■ 问题简介 在博文 使用AD5933测量电子器件复阻抗 中&#xff0c;对于电容负载进行测量的时候&#xff0c;发现测量的结果与理论值严重不符。 除了出现了增大的测量输出值&#xff08;与前面电阻相对比&#xff09;&#xff0c;还有一些非常不规则的输出结果。 计时在小信号…

使用AD5933分析复阻抗的时钟频率设置

作者:卓晴博士&#xff0c;清华大学自动化系 更新时间&#xff1a;2020-07-29 Wednesday ■ 前言 使用 AD5933分析复数阻抗 时&#xff0c;由于受到内部离散傅里叶变换&#xff08;DFT&#xff09;所带来的以下限制&#xff1a; 由于采集信号可能带来的频率 频率混叠 现象由…

使用AD5933测量电子器件复阻抗

■ 前言 下面使用 AD5933阻抗转换器、网络分析仪初步实验 对一些典型的器件测量相关的阻抗。分析测量所对应的工作频率&#xff0c;工作量程等问题。 相关的文献参阅&#xff1a; AD5933阻抗转换器、网络分析仪初步实验AD5933不同频率下的转换结果AD5933使用外部时钟获得更低…

AD5933不同频率下的转换结果

01简介 AD5933阻抗转换模块 是一款基于AD公司的 AD5933 芯片的测量 复阻抗 的电路模块。在 AD5933阻抗转换器、网络分析仪初步实验 中对该模块进行了初步的实验。 由于该芯片的基本原理是采集有芯片内部产生的正弦波电压信号激励下复阻抗相应的正弦电流信号&#xff0c;经由芯…

AD5933使用外部时钟获得更低的分析频率

■ 前言 在博文 AD5933不同频率下转换结果 中分析了 AD5933阻抗变换模块 使用内部时钟&#xff08;fosc16.776MHz&#xff09;时&#xff0c;测量结果受到采集时间窗口的影响&#xff0c;所能够达到的最低阻抗激励正弦信号频率。 那么&#xff0c;在有些应用中&#xff0c;对象…