(实战)用Python实现taobao某品牌杀虫剂评论的情感分析
背景交代:爬虫为适应电子商务飞速发展,通过数据挖掘技术对客户评论进行分析,进而改善服务、提高核心竞争力。爬虫taobao某一品牌杀虫剂下所有评论,区分好评和差评,提取特征词,用以区分新的评论
挖掘目标:分析科林虫控用户的感情倾向;从评论文本中挖掘出产品的优势和不足;提炼出卖点
方法流程:通过对文本进行基础的数据预处理、中文分词、停用词过滤后,使用Python工具对数据进行建模和分析,实现对数据的倾向性判断以及所隐藏的信息的挖掘并分析,以期得到有价值的内在内容
项目管理:带领4为组员,为每位项目组组员分配任务,并规定完成时间,保证项目按时完成。
数据分析:项目【用户评论情感分析】,利用情感分析模型,优化20%费效。项目链接
原理
比如这么一句话:“宝贝真好用,推荐,赞。”
判断情感词
要判断一句话是积极的还是消极的,最简单最基础的方法就是找出句子里面的情感词,积极的情感词比如:赞,好用,推荐等,消极情感词比如:差,烂,坏,没用等。出现一个积极或者消极词就+1。
判断程度词
一般在情感词的前面会出现程度词比如:“真”,“好用”和‘烂“前面都有一个程度修饰词。”超级好“就比”好“或者”还好“的情感更强。所以需要在找到情感词后往前找一下有没有程度修饰,并给不同的程度一个权值。比如”真“,”无比“,”太“就要把情感分值*4,”较“,”还算“就情感分值*2,”只算“,”仅仅“这些就*0.5了。
判断否定词
如果仅仅是出现了“好”就把其规定为正分数相加的话,出现“不”“好”就会被错误判定。所以在找到情感词的时候,需要往前找否定词。比如”不“,”不能“这些词。而且还要数这些否定词出现的次数,如果是单数,情感分值就*-1,但如果是偶数,还是*1。
积极和消极分开来
经过观察大量评论,我们会发现话里面有褒有贬,不能用一个分值来表示它的情感倾向。而且这个权值的设置也会影响最终的情感分值,敏感度太高了。因此对这句话的最终的正确的处理,是得出这句话的一个积极分值,一个消极分值。它们同时代表了这句话的情感倾向。
算法设计
第一步:读取评论数据,对评论进行预处理。
第二步:导入自定义的情感词文档,为程度词赋权重,判断记录积极还是消极,再确定位置。
第三步:更具程度词判断情感词前面的词,若找到就乘对应权重。
第四步:判断程度词的同时也判断是否是否定词,若数量为奇数,乘以-1,若为偶数,乘以1。
第五步:通过比较积极分数和消极分数,判断评论是否为好评。
第六步:得到结果
实战
- 数据读取
import jieba import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['axes.unicode_minus']=False data = pd.read_excel(r"C:UsersZhongHDesktop数据分析zm电商案例数据竞争数据评论舆情数据科林虫控.xlsx")
-
数据预处理
#数据处理 #提取评论并删除无用评论 data.describe data1 = data[data['评论'] !='此用户没有填写评论!'] # data1.head() comment = data1.评论 comment
- 打开词典
#打开词典文件 def read_file(filepath): with open(filepath,'r',encoding='utf-8') as fp: # print(fp) i=[i.strip() for i in fp.readlines()] # i = [fp.readlines()] '/n'需要去除 # print(i) return i posdict=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词positive.txt") degree_word=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词程度级别词语.txt") deny_word=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词否定词.txt") negdict=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词negative.txt") stop_word=read_file(r"C:UsersZhongHDesktop数据分析zm停用词.txt") mostdict=degree_word[degree_word.index('extreme')+1:degree_word.index('very')]#权重4 verydict=degree_word[degree_word.index('very')+1:degree_word.index('more')]#权重3 moredict=degree_word[degree_word.index('more')+1:degree_word.index('ish')]#权重2 ishdict=degree_word[degree_word.index('ish')+1:degree_word.index('last')]#权重0.5
-
算法模型
#算法 def get_score_list(dataset): global good_str good_str='' bad_str='' for co_data in comment:#获取每一段 posScore=0#积极分 posScore2=0 posScore3=0 negScore=0#消极分 negScore2=0 negScore3=0 a=0#头 i=0#尾 #通过jieba库lcut 分词 for word in jieba.lcut(co_data): if word in posdict:#判断情感词 posScore +=1 c=0#否定词计数 #判断情感词前面的程度词 for w in jieba.lcut(co_data)[a:i]: if w in mostdict: posScore *=4 elif w in verydict: posScore *=3 elif w in moredict: posScore *=2 elif w in ishdict: posScore *=0.5 elif w in deny_word: c +=1 if c%2 != 0: posScore*=-1 posScore2 +=posScore posScore = 0 posScore3 = posScore + posScore2 + posScore3 posScore2 = 0 else : posScore3 = posScore + posScore2 + posScore3 posScore = 0 a=i #积极词记分完成 if word in negdict:#判断消极情感词 negScore +=1 c=0#否定词计数 #判断情感词前面的程度词 for w in jieba.lcut(co_data)[a:i]: if w in mostdict: negScore *=4 elif w in verydict: negScore *=3 elif w in moredict: negScore *=2 elif w in ishdict: negScore *=0.5 elif w in deny_word: c +=1 if c%2 != 0: negScore*=-1 negScore2 +=negScore negScore = 0 negScore3 = negScore + negScore2 + negScore3 negScore2 = 0 else : negScore3 = negScore + negScore2 + negScore3 negScore = 0 #所有词记分完成 a =i i +=1 print(co_data,posScore3,negScore3) if posScore3 > negScore3: good_str +=co_data elif negScore3 > posScore3 : bad_str +=co_data # print(good_str) return good_str get_score_list(comment) print(good_str) ''' 几年前用过这个牌子的,当时特别好用,这次发现小强立刻搜索,抱着试试看的心买的,还是有效果的,看到几个死的,大小都有,但是数量不多,不知道都杀没了吗,反正最近没有发现活动的不法分子,已经推荐给朋友 21 0 效果很好,出差前选了几个角落滴了一滴,回来地上确实看到了小强的尸体,还剩好多呢,以后也可以用好几次,有小强就选这个了,又便宜,关键有效。 14 0 终于收到我需要的宝贝了,东西很好,价美物廉,谢谢掌柜的!说实在,这是我淘宝购物来让我最满意的一次购物。无论是掌柜的态度还是对物品,我都非常满意的。掌柜态度很专业热情,有问必答,回复也很快,我问了不少问题,他都不觉得烦,都会认真回答我,这点我向掌柜表示由衷的敬意,这样的好掌柜可不多。再说宝贝,正是我需要的,收到的时候包装完整,打开后让我惊喜的是,宝贝比我想象中的还要好!不得不得竖起大拇指。下次需要的时候我还会再来的,到时候麻烦掌柜给个优惠哦! 50 -2 宝贝收到了,运送速度真是快,下单没多久就送来了,包装挺好的,小小的使用好方便,厨房有很多蟑螂,桌上总看到一两只冒出来,一买回来就迫不及待地打开来用了,用了几天还是有小蟑螂在桌上爬,等再过几天看看效果. 11.5 1 ... '''
-
好评转化词云图
#词云图 import jieba import wordcloud from wordcloud import WordCloud plt.rcParams['font.sans-serif']='SimHei' w=wordcloud.WordCloud(font_path='C:WindowsFonts方正兰亭黑简体.TTF',collocations=False ,max_words=50, background_color='white') jieba.lcut(good_str) exclude=('蟑螂','小强') list=[w for w in jieba.lcut(good_str) if w not in stop_word and w not in exclude] w.generate(' '.join(list)) plt.imshow(w) plt.axis('off')