背景交代:爬虫为适应电子商务飞速发展,通过数据挖掘技术对客户评论进行分析,进而改善服务、提高核心竞争力。爬虫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:\Users\ZhongH\Desktop\数据分析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:\Users\ZhongH\Desktop\数据分析zm\情感分析用到的词\positive.txt")
degree_word=read_file(r"C:\Users\ZhongH\Desktop\数据分析zm\情感分析用到的词\程度级别词语.txt")
deny_word=read_file(r"C:\Users\ZhongH\Desktop\数据分析zm\情感分析用到的词\否定词.txt")
negdict=read_file(r"C:\Users\ZhongH\Desktop\数据分析zm\情感分析用到的词\negative.txt")
stop_word=read_file(r"C:\Users\ZhongH\Desktop\数据分析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:\Windows\Fonts\方正兰亭黑简体.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')