python 情感分析实例_基于Python的情感分析案例

article/2025/10/15 4:24:36

**情感分析 **又称为倾向性分析和意见挖掘 它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程 其中情感分析还可以细分为情感极性 倾向 分析 情感程度分析 主客观分析等。 情感极性分析的目的是对文本进行褒义、贬义、中性的判

**情感分析:**又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等。

情感极性分析的目的是对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。例如对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。

**背景交代:**爬虫京东商城某一品牌红酒下所有评论,区分好评和差评,提取特征词,用以区分新的评论【出现品牌名称可以忽视,本文章不涉及打广告哦 o(╯□╰)o】。

示例1(好评)

9457d4795c0ec011be51809740a14fc6.png

示例2(差评)

7e47fea25af1191d1c2012f91f2bdc77.png

读取文本文件

def text():

f1 = open('E:/工作文件/情感分析案例1/good.txt','r',encoding='utf-8')

f2 = open('E:/工作文件/情感分析案例1/bad.txt','r',encoding='utf-8')

line1 = f1.readline()

line2 = f2.readline()

str = ''

while line1:

str += line1

line1 = f1.readline()

while line2:

str += line2

line2 = f2.readline()

f1.close()

f2.close()

return str

把单个词作为特征

def bag_of_words(words):

return dict([(word,True) for word in words])

print(bag_of_words(text()))

604606bb65c10c98d93d8c602bc2fd96.png

import nltk

from nltk.collocations import BigramCollocationFinder

from nltk.metrics import BigramAssocMeasures

把双个词作为特征,并使用卡方统计的方法,选择排名前1000的双词

def bigram(words,score_fn=BigramAssocMeasures.chi_sq,n=1000):

bigram_finder=BigramCollocationFinder.from_words(words) #把文本变成双词搭配的形式

bigrams = bigram_finder.nbest(score_fn,n) #使用卡方统计的方法,选择排名前1000的双词

newBigrams = [u+v for (u,v) in bigrams]

return bag_of_words(newBigrams)

print(bigram(text(),score_fn=BigramAssocMeasures.chi_sq,n=1000))

36fbf0bda376eb498b2e414606e8f805.png

把单个词和双个词一起作为特征

def bigram_words(words,score_fn=BigramAssocMeasures.chi_sq,n=1000):

bigram_finder=BigramCollocationFinder.from_words(words)

bigrams = bigram_finder.nbest(score_fn,n)

newBigrams = [u+v for (u,v) in bigrams]

a = bag_of_words(words)

b = bag_of_words(newBigrams)

a.update(b) #把字典b合并到字典a中

return a

print(bigram_words(text(),score_fn=BigramAssocMeasures.chi_sq,n=1000))

78a47742e28b600a600abf1ec3622f2a.png

结巴分词工具进行分词及词性标注

三种分词模式 :

A、精确模式:试图将句子最精确地切开,适合文本分析。默认是精确模式。

B、全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义

C、搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

注:当指定jieba.cut的参数HMM=True时,就有了新词发现的能力。

import jieba

def read_file(filename):

stop = [line.strip() for line in open('E:/工作文件/情感分析案例1/stop.txt','r',encoding='utf-8').readlines()] #停用词

f = open(filename,'r',encoding='utf-8')

line = f.readline()

str = []

while line:

s = line.split('\t')

fenci = jieba.cut(s[0],cut_all=False) #False默认值:精准模式

str.append(list(set(fenci)-set(stop)))

line = f.readline()

return str

安装nltk,pip3 install nltk

from nltk.probability import FreqDist,ConditionalFreqDist

from nltk.metrics import BigramAssocMeasures

获取信息量最高(前number个)的特征(卡方统计)

def jieba_feature(number):

posWords = []

negWords = []

for items in read_file('E:/工作文件/情感分析案例1/good.txt'):#把集合的集合变成集合

for item in items:

posWords.append(item)

for items in read_file('E:/工作文件/情感分析案例1/bad.txt'):

for item in items:

negWords.append(item)

word_fd = FreqDist() #可统计所有词的词频

cond_word_fd = ConditionalFreqDist() #可统计积极文本中的词频和消极文本中的词频

for word in posWords:

word_fd[word] += 1

cond_word_fd['pos'][word] += 1

for word in negWords:

word_fd[word] += 1

cond_word_fd['neg'][word] += 1

pos_word_count = cond_word_fd['pos'].N() #积极词的数量

neg_word_count = cond_word_fd['neg'].N() #消极词的数量

total_word_count = pos_word_count + neg_word_count

word_scores = {}#包括了每个词和这个词的信息量

for word, freq in word_fd.items():

pos_score = BigramAssocMeasures.chi_sq(cond_word_fd['pos'][word], (freq, pos_word_count), total_word_count) #计算积极词的卡方统计量,这里也可以计算互信息等其它统计量

neg_score = BigramAssocMeasures.chi_sq(cond_word_fd['neg'][word], (freq, neg_word_count), total_word_count)

word_scores[word] = pos_score + neg_score #一个词的信息量等于积极卡方统计量加上消极卡方统计量

best_vals = sorted(word_scores.items(), key=lambda item:item[1], reverse=True)[:number] #把词按信息量倒序排序。number是特征的维度,是可以不断调整直至最优的

best_words = set([w for w,s in best_vals])

return dict([(word, True) for word in best_words])

调整设置,分别从四种特征选取方式开展并比较效果

def build_features():

#feature = bag_of_words(text())#第一种:单个词

#feature = bigram(text(),score_fn=BigramAssocMeasures.chi_sq,n=500)#第二种:双词

#feature = bigram_words(text(),score_fn=BigramAssocMeasures.chi_sq,n=500)#第三种:单个词和双个词

feature = jieba_feature(300)#第四种:结巴分词

posFeatures = []

for items in read_file('E:/工作文件/情感分析案例1/good.txt'):

a = {}

for item in items:

if item in feature.keys():

a[item]='True'

posWords = [a,'pos'] #为积极文本赋予"pos"

posFeatures.append(posWords)

negFeatures = []

for items in read_file('E:/工作文件/情感分析案例1/bad.txt'):

a = {}

for item in items:

if item in feature.keys():

a[item]='True'

negWords = [a,'neg'] #为消极文本赋予"neg"

negFeatures.append(negWords)

return posFeatures,negFeatures

获得训练数据

posFeatures,negFeatures = build_features()

from random import shuffle

shuffle(posFeatures)

shuffle(negFeatures) #把文本的排列随机化

train = posFeatures[300:]+negFeatures[300:]#训练集(70%)

test = posFeatures[:300]+negFeatures[:300]#验证集(30%)

data,tag = zip(*test)#分离测试集合的数据和标签,便于验证和测试

def score(classifier):

classifier = SklearnClassifier(classifier)

classifier.train(train) #训练分类器

pred = classifier.classify_many(data) #给出预测的标签

n = 0

s = len(pred)

for i in range(0,s):

if pred[i]==tag[i]:

n = n+1

return n/s #分类器准确度

这里需要安装几个模块:scipy、numpy、sklearn

scipy及numpy模块需要访问http://www.lfd.uci.edu/~gohlke/pythonlibs,找到scipy、numpy,下载对应版本的whl

import sklearn

from nltk.classify.scikitlearn import SklearnClassifier

from sklearn.svm import SVC, LinearSVC, NuSVC

from sklearn.naive_bayes import MultinomialNB, BernoulliNB

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

print('BernoulliNB`s accuracy is %f' %score(BernoulliNB()))

print('MultinomiaNB`s accuracy is %f' %score(MultinomialNB()))

print('LogisticRegression`s accuracy is %f' %score(LogisticRegression()))

print('SVC`s accuracy is %f' %score(SVC()))

print('LinearSVC`s accuracy is %f' %score(LinearSVC()))

print('NuSVC`s accuracy is %f' %score(NuSVC()))

检测结果输出1(单个词:每个字为特征)

b42389203cbc038199e10f521c2052bf.png

检测结果输出2(词[俩字]:2个字为特征,使用卡方统计选取前n个信息量大的作为特征)

6fbc733a8d4159e6500c050d53932a2d.png

检测结果输出3(单个词和双词:把前面2种特征合并之后的特征)

06489beee4765accacdec8d22b886514.png

检测结果输出4(结巴分词:用结巴分词外加卡方统计选取前n个信息量大的作为特征)

2199a9e8508446fdc6386fbb7afb5e7d.png

对比四种特征选取方式可以看出,单字 - 词 - 单字+词 - 结巴分词,效果是越来越好的。

以上信息来源于网络,如有侵权,请联系站长删除。


http://chatgpt.dhexx.cn/article/FOl26pAb.shtml

相关文章

情感分析 综述

情感分析或观点挖掘是对人们对产品、服务、组织、个人、问题、事件、话题及其属性的观点、情感、情绪、评价和态度的计算研究。该领域的开始和快速发展与社交媒体的发展相一致,如评论、论坛、博客、微博、推特和社交网络,因为这是人类历史上第一次拥有如…

windows无法启动print spooler服务 资源不足,无法完成该操作

WIN10系统下print spooler打印服务无法启动,提示错误“错误0x800706b9资源不足,无法完成该操作”,可以快速的解决方法。 最近有Win10用户反馈无法打印机,而在启动print spooler服务(打印服务)时遇到错误提示…

【vSphere故障案例】案例十二:资源不足,vSphere HA故障切换级别

【vSphere故障案例】案例十二:资源不足,vSphere HA故障切换级别 2013-04-17 12:16:51标签:vSphere ESXi HA故障原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任…

解决32位程序报“内存资源不足,无法处理此命令”问题

1、先点击此链接下载插件包:​​​​​​​​​​​​​​​​​​​​​让32位程序能申请到4GB内存方法-C#文档类资源-CSDN文库 2、将EditBin放到程序的根目录 3、 程序的启动项的生成事件里面添加命令行 cd ..\EditBin\x64 editbin /largeaddressaware …

idea启动项目报错内存资源不足的问题

尝试一下几种方式: 1,改变idea的heap参数大小至1500 2,IDEA启动参数配置 -Xms128m -Xmx3072m -XX:ReservedCodeCacheSize240m -XX:UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB50 -ea -XX:CICompilerCount2 -Dsun.io.useCanonPrefixCac…

Vcenter 资源不足,无法满足XXX中集群 上的vSphere HA故障切换级别

故障现象: 做Vmotion时发现报错:Vcenter 资源不足,无法满足XXX中集群 上的vSphere HA故障切换级别 点开集群摘要发现,预留cpu和内存都是100%. 解决过程如下:

海康威视4200服务器显示资源不足,硬盘录像机提示“资源不足”是什么原因 -

很多人来问重庆监控,画面上会提示资源不足是怎么回事?重庆监控来给大家科普一下:资源不足不是设备的故障,他只是一种现象提示,画面上无图像,并且叠加了“资源不足”文字提示。有些伙伴可能重启了录像机几次…

资源优化问题常见形式

1 常见优化问题形式 1.1 以最大化多用户 的 和 速率的形式 此情况下,无论是该和速率是作为目标函数,还是作为约束,都不是凸函数的形式,原因是涉及到 log(.)log(.) 的形式,是非凸的。常见解决方法,是采用 …

不要再抱怨项目资源不足了,这么办都能解决

无论是企业还是银行,项目管理在组织中的地位越来越重要。但笔者走访了超过200家银行和超过100家大型企业,项目管理存在的问题依然严峻,在这些组织中项目管理的成熟度水平依然有较大的提升空间。 在项目管理的十大知识领域里面,资…

node资源不足导致的pod pending状态

背景 linux centos7.6系统 k8s集群刚刚经历节点资源缩容:从8C 32缩小至4c16G 现象 恢复k8s节点后发现很多pod都处于Pending : 原因 由于资源缩容,每个服务占用的cpu和内存值没有改变,导致机器分配资源时内存或cpu不足导致 这一点可以通过…

配置的资源不足,达不到 XXX 内集群 ABC 中期望的 vSphere HA 故障切换级别

做了HA后报此错误,可以在群集的HA设置中修改准入控制,预留的故障切换为机器数量的百分比,当前两台设置50或再高一些即可。另外虚拟机允许的性能降低比例也不可为100。

项目管理,资源不足怎么办?

企业的项目管理活动经常会遇到很多挑战,资源不足可能是最常见的一个,也是会引起重大后果的因素之一;项目管理过程中的资源一般指的是人力资源,项目的推进执行需要大量的人力投入,一旦投入的资源不足,项目的…

复数特征值求特征向量_如何理解特征值的意义?

毕业多年,曾经有同事问我该如何理解特征值的意义? 当时,实在羞愧,我一学数学的,真不知该如何回答。 极力回想,也只能以“特征值的求法、步骤...bla...bla...”应付了事, 答非所问,简直了得! 这样的答案教科书里写得清清楚楚,网上Google/百度一大堆, 人家问的是意义,…

特征值和特征向量的实际意义

特征值和特征向量的实际意义 从定义出发,Axcx:A为矩阵,c为特征值,x为特征向量。 矩阵A乘以x表示,对向量x进行一次转换(旋转或拉伸)(是一种线性转换),而该转换…

什么是特征向量和特征值

有振动 就有特征值 1 特征值和特征向量的由来 谈到线性代数课本里面的一些概念,比如行列式、矩阵乘积、线性变换、二次型等,或许很少人知道它们是谁发现的,这不像高数/数分课本上那么明显:柯西收敛准则、拉格朗日中值定理、魏尔…

雅可比算法求矩阵特征值C语言源代码,雅可比(Jacobi)计算特征值和特征向量

雅可比迭代法法 在图形图像中不少地方用到求矩阵的特征值和特征向量,好比主成分分析、OBB包围盒等。编程时通常都是用数值分析的方法来计算,这里介绍一下雅可比迭代法求解特征值和特征向量。雅可比迭代法的原理,网上资料不少,详细可见参考资料1。这里咱们简单介绍求解矩阵S…

PCA | 特征值和特征向量

SVD/PCA的分析只需要一行代码即可实现,但是要理解背后的原理,可能需要从特征值和特征向量开始。第一次接触特征值是在SPM里,那时候连怎么发音都不知道。就像这个slide讲的一样,spm有一个按钮,按了就可以提取&#xff0…

特征值和特征向量的理解

在线性代数的最后,我们都会学矩阵的特征值分解,我们知道一个方阵A经过特征值分解后就得到特征向量和特征值了。那么,这个所谓的特征值和特征向量到底是什么东西呢? 我们一上来就会学到这样的一个公式: Ax λx&#…

MATLAB之特征值和特征向量

1.定义: 设A是n阶矩阵,如果数λ和n维非零向量x使关系式 (1) 成立,那么,这样的数λ称为矩阵A的特征值,非零向量x称为A的对应于特征值λ的特征向量(1)式还可以写为: (2&…