1、第三个文件是差评词云图,主要看差到哪了。首先定义差评:评论中包含下列词汇的我们认为这条评价是差评 【太差,材料差各种问题出现问题质量差坑人很差不满意冒牌假的服务差毛病非常差废物垃圾破烂不值差评坏的坏了烂了无良骗子欺骗不达标出问题特差上当不能用报废残次,u差劲坑爹太黑不要买后悔有多差被坑】根据差评的评论可以先分词,再按词统计生成词云。如图所示我们有以下分析结果:1、 大家关注的要点是公里、续航、电池,大概就是电池不够、续航差,一班也就15、20、30公里2、 【作出评价】【15】【一个月】【好评】,这个词主要来源是说明差评的买家在首次多数是没有评价的,主要是追评,追评为差评3、 【坏了】【螺丝】
2、【质量】【客服】【售后】 为特征词,大概可以想象差评的主要原因。质量不好,某个东西容易坏、比如螺丝。售后也不咋地,客服很垃圾。等等第四个是剔除刷单买家评论、绝对好评客户后的其他评论生成的词云图,主要用来看客户大致评价首先定义疑似刷单评价,这个包含两方面一是当天评价又在10个小时内追评的(当然不包含差评),按照买家习惯。正常买家一般不会追评,追评的一般都都是过了些天发现有问题才来差评(除非商户给买家优惠或者是买家太无聊才会追好评,这个大家经常网购的清楚),何况当天就追评的那是少之又少,我们是秉承宁可错杀1000也不放过一个原则,将能找到的刷单尽量找出来。二是从买家ID评论的次数来看。虽然淘宝隐藏
3、了买家ID中间的一些文字。但是我们还是可以从这买家ID来识别刷单。这种买家ID出现相同的概率还不是很大,而且在同一商品下出现相同的买家ID概率会更小,但是不排除这种可能。所以我们可以定义同一买家ID出现超过4次的认为该买家ID存在刷单行为。至于为什么是4这个是我通过几家店铺的的评论数据百分比得出的(而且有句老话就是是不过三),当然你也可以设为5,甚至6、7、8。按买家ID评论统计如下,同一个买家ID评论数多大36次,很显然认为是刷单专业户。如下图有意思t*0,t*1,t*2,t*3t*8,t*9,这0到9都到齐了,不是刷单才怪了。比较账号多了不好记,这样取名符合刷单特征。极端情况我们甚至可以把
4、以数字结尾,字母开头的非差评买家定义为刷单,这里没有,但是如果这样定义后的仍然有几百条买家评论存在也是可以的。接着定义绝对好评,绝对好评就是首次评论中使用非常绝对的好评词汇。例如:很好非常好完美很棒很满意很实用u很喜欢很耐心很不错很拉风很负责非常棒十分满意非常满意满分很赞非常实惠很耐用】。作为首次评论用这样绝对的词汇是很有可能是刷单买家评论。接着来分析剔除刷单买家评论、绝对好评客户后的词云图:1、 评论关注的还是公里数、续航能力2、 找到好评词汇【很快】【方便】【好评】【速度】【折叠】【喜欢】,优点词汇很少3、 找到差评词汇【坏了】【螺丝】【刹车】【差评】4、 好评都是没有从质量出发的,差评都
5、是质量问题5、 从这里无法确定买还是不买第五个文档是生成的评价word文档,是分析的结果文档,包含各种分析结果。将前面的各个图表都输入到word文档上。里面有一个非常重要的指标项可以用来判断买还是不买就是 重复评论(刷单)用户占比 、扣除刷单后差评率 、绝对好评率三项指标。在重复评论(刷单)用户占比24.55%、绝对好评为37.32%的情况下,差评率仍然高达14.86显然不值得买。 这里写的算法都是对单个商品就行分析的,没有对商品群分析,所以结果不是完美。比如从商品群的评价库提取常用的评价词汇和语句,就行更细的评价分类,和重点的分词词汇,这样词云图的结果会更明显。再比如刷单买家的识别,如果我们
6、有很多商品的话就可以通过买家的购买频率识别是不是刷单买家了,下面是三家电动滑板车的刷单买家统计:商品1、商品2、商品3、看了这几副图后,是不是感觉刷单的还是那几个人啊。哈哈,废话不说了,直接贴上分析代码# coding=utf-8import osimport urllib2import jiebafrom random import randintimport pandas as pdimport timeimport jsonimport mathimport typesimport matplotlib.pyplot as pltfrom wordcloud import WordClo
7、udimport numpyfrom docx import Documentfrom docx.shared import Inches#import sys#reload(sys)#sys.setdefaultencoding(utf-8)#差评定义词汇mywords=u,#绝对好评goodwords=udefgetItemId(url):uid=urlurl.find(id=)+3:url.find()+18if uid.find(&)0:itemid=uid0:uid.find()else :itemid=uidreturn itemiddefgetRedf(url): #将list数
8、据转换relist= # print urltry :content=json.loads(urllib2.urlopen(url).read().replace(rateDetail:).replace(/b),gbk) #gb18030比gbk含更多字符except :print url,json解析错误return pd.DataFrame(),99if content.has_key(urateList):hasprice=contentu0uattributesMap.has_key(t_payTimefor i in xrange(len(contentu):if type(con
9、tentiappendComment) is types.DictType:if hasprice=True:relist.append(contentudisplayUserNick,contenturateContentrateDate ,contentuiut_detailPricet_buyAmountucommentTimecontent)gmtCreateTime,0,1 ) ,numpy.nan)else:,0,1 ,ureturn pd.DataFrame(relist),contentpaginatorlastPage #最大页数time.sleep(5)print 等待5毫
10、秒:# ,urlreturn getRedf(url)defgetDeatail(itemid=534388747823baseurl=url=baseurl.format(itemid,randint(100000000,700000000),1)mydf,pages=getRedf(url) #mydf=pd.concat(mydf,first) #pages=totals/20+1;p=2while (p1 and seg not in stopwords.keys():afterseg.append(tp,seg)userwords=pd.DataFrame(afterseg)user
11、words.columns=wordsreturn userwordsdefwcfigure(wordsdf,path=rtest.jpg,mytitle=#画云图图,传入dataframe,保存文件路径和名字 wdcounts.head(2000).itertuples(index=False)wordcloud = WordCloud(font_path=c:windowsfontsSTCAIYUN.TTF,background_color=white,margin=5, width=1800, height=1000)#必须要加载文字体不然中文乱码 #print segStat.head
12、(100).itertuples(index=False)wordcloud = wordcloud.fit_words(wordsdf.itertuples(index=False)plt.figure(num=None,figsize=(25, 16), dpi=8,facecolor=w, edgecolor=kplt.imshow(wordcloud)plt.axis(off#plt.title(mytitle)plt.savefig(path)plt.show()plt.close()defrefind(x,y):if x15000 or x20:return Falsereturn
13、 ydeffindBad(words):flag=False#print type(words)#if isNan()words=words.decode(for x in mywords:#x=x.encode(if x in words:flag=Truebreakreturn flag deffindBest(words):for x in goodwords:#url=url=itemid=getItemId(url)if os.path.exists(itemid): #当前路径shous=os.getcwd() 查找是否曾经抓取数据mydata=pd.read_csv(itemid
14、)mydata=getDeatail(itemid)mydata.to_csv(itemid,encoding=,index=False)mydatapaytime=mydata.apply(lambda x:time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(x/1000)hours.str11:13price/mydatadel mydata,mydatadates.str0:10groupby_date=mydata.groupby(by=u)u.agg(u总评论数numpy.size,u追评数count)mydata=mydata.fillna(badcontents.apply(findBad) | mydata.apply(findBad)best.apply(findBest) | mydata.apply(findBest)=pd.to_datetime(mydata)difftime=(mydata-mydata).apply(lambda x:pd.isnull(x) and 200 or x.total_seconds() #追评相差天数wordsnum=(mydata.str.len().fillna(0)+mydata
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1