python抓取淘宝商品评论并分词分析文档格式.docx
《python抓取淘宝商品评论并分词分析文档格式.docx》由会员分享,可在线阅读,更多相关《python抓取淘宝商品评论并分词分析文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
第三个文件是差评词云图,主要看差到哪了。
首先定义差评:
评论中包含下列词汇的我们认为这条评价是差评
【'
太差'
'
材料差'
各种问题'
出现问题'
质量差'
坑人'
很差'
不满意'
冒牌'
假的'
服务差'
毛病'
非常差'
废物'
垃圾'
破烂'
不值'
差评'
坏的'
坏了'
烂了'
无良'
骗子'
欺骗'
不达标'
出问题'
特差'
上当'
不能用'
报废'
残次'
u'
差劲'
坑爹'
太黑'
不要买'
后悔'
有多差'
被坑'
】
根据差评的评论可以先分词,再按词统计生成词云。
如图所示我们有以下分析结果:
1、大家关注的要点是公里、续航、电池,大概就是电池不够、续航差,一班也就15、20、30公里
2、【作出评价】【15】【一个月】【好评】,这个词主要来源是
说明差评的买家在首次多数是没有评价的,主要是追评,追评为差评
3、【坏了】【螺丝】【质量】【客服】【售后】为特征词,大概可以想象差评的主要原因。
质量不好,某个东西容易坏、比如螺丝。
售后也不咋地,客服很垃圾。
等等
第四个是剔除刷单买家评论、绝对好评客户后的其他评论生成的词云图,主要用来看客户大致评价
首先定义疑似刷单评价,这个包含两方面一是当天评价又在10个小时内追评的(当然不包含差评),按照买家习惯。
正常买家一般不会追评,追评的一般都都是过了些天发现有问题才来差评(除非商户给买家优惠或者是买家太无聊才会追好评,这个大家经常网购的清楚),何况当天就追评的那是少之又少,我们是秉承宁可错杀1000也不放过一个原则,将能找到的刷单尽量找出来。
二是从买家ID评论的次数来看。
虽然淘宝隐藏了买家ID中间的一些文字。
但是我们还是可以从这买家ID来识别刷单。
这种买家ID出现相同的概率还不是很大,而且在同一商品下出现相同的买家ID概率会更小,但是不排除这种可能。
所以我们可以定义同一买家ID出现超过4次的认为该买家ID存在刷单行为。
至于为什么是4这个是我通过几家店铺的的评论数据百分比得出的(而且有句老话就是是不过三),当然你也可以设为5,甚至6、7、8。
按买家ID评论统计如下,同一个买家ID评论数多大36次,很显然认为是刷单专业户。
如下图
有意思t***0,t***1,t***2,t***3……t***8,t***9,这0到9都到齐了,不是刷单才怪了。
比较账号多了不好记,这样取名符合刷单特征。
极端情况我们甚至可以把以数字结尾,字母开头的非差评买家定义为刷单,这里没有,但是如果这样定义后的仍然有几百条买家评论存在也是可以的。
接着定义绝对好评,绝对好评就是首次评论中使用非常绝对的好评词汇。
例如:
很好'
非常好'
完美'
很棒'
很满意'
很实用'
u'
很喜欢'
很耐心'
很不错'
很拉风'
很负责'
非常棒'
十分满意'
非常满意'
满分'
很赞'
非常实惠'
很耐用'
】。
作为首次评论用这样绝对的词汇是很有可能是刷单买家评论。
接着来分析剔除刷单买家评论、绝对好评客户后的词云图:
1、评论关注的还是公里数、续航能力
2、找到好评词汇【很快】【方便】【好评】【速度】【折叠】【喜欢】,优点词汇很少
3、找到差评词汇【坏了】【螺丝】【刹车】【差评】
4、好评都是没有从质量出发的,差评都是质量问题
5、从这里无法确定买还是不买
第五个文档是生成的评价word文档,是分析的结果文档,包含各种分析结果。
将前面的各个图表都输入到word文档上。
里面有一个非常重要的指标项可以用来判断买还是不买
就是重复评论(刷单)用户占比、扣除刷单后差评率、绝对好评率三项指标。
在重复评论(刷单)用户占比24.55%、绝对好评为37.32%的情况下,差评率仍然高达14.86显然不值得买。
这里写的算法都是对单个商品就行分析的,没有对商品群分析,所以结果不是完美。
比如从商品群的评价库提取常用的评价词汇和语句,就行更细的评价分类,和重点的分词词汇,这样词云图的结果会更明显。
再比如刷单买家的识别,如果我们有很多商品的话就可以通过买家的购买频率识别是不是刷单买家了,下面是三家电动滑板车的刷单买家统计:
商品1、
商品2、
商品3、
看了这几副图后,是不是感觉刷单的还是那几个人啊。
哈哈,废话不说了,直接贴上分析代码
#coding=utf-8
importos
importurllib2
importjieba
fromrandomimportrandint
importpandasaspd
importtime
importjson
importmath
importtypes
importmatplotlib.pyplotasplt
fromwordcloudimportWordCloud
importnumpy
fromdocximportDocument
fromdocx.sharedimportInches
#importsys
#reload(sys)
#sys.setdefaultencoding('
utf-8'
)
#差评定义词汇
mywords=[u'
\
\
]
#绝对好评
goodwords=[u'
defgetItemId(url):
uid=url[url.find('
id='
)+3:
url.find('
)+18]
ifuid.find('
&
'
)>
0:
itemid=uid[0:
uid.find('
)]
else:
itemid=uid
returnitemid
defgetRedf(url):
#将list数据转换
relist=[]#printurl
try:
content=json.loads(urllib2.urlopen(url).read().replace('
"
rateDetail"
:
).replace('
<
b>
/b>
),'
gbk'
)#gb18030比gbk含更多字符
except:
printurl,'
json解析错误'
returnpd.DataFrame(),99
ifcontent.has_key(u'
rateList'
):
hasprice=content[u'
][0][u'
attributesMap'
].has_key('
t_payTime'
foriinxrange(len(content[u'
])):
iftype(content['
][i]['
appendComment'
])istypes.DictType:
ifhasprice==True:
relist.append((content[u'
displayUserNick'
],content[u'
rateContent'
rateDate'
]\
content[u'
][i][u'
]['
t_detailPrice'
t_buyAmount'
][u'
commentTime'
content'
]))
gmtCreateTime'
],0,1\
]))
]\
numpy.nan))
else:
],0,1,u'
returnpd.DataFrame(relist),content['
paginator'
lastPage'
]#最大页数
time.sleep(5)
print'
等待5毫秒:
#,url
returngetRedf(url)
defgetDeatail(itemid='
534388747823'
baseurl="
url=baseurl.format(itemid,randint(100000000,700000000),1)
mydf,pages=getRedf(url)#mydf=pd.concat(mydf,first)#pages=totals/20+1;
p=2
while(p<
=pages):
url=baseurl.format(itemid,randint(100000000,700000000),p)
正在读取第{0}页'
.format(p)
p=p+1
tpdf,n=getRedf(url)
mydf=pd.concat([mydf,tpdf])
mydf.columns=['
user'
contents'
datetime'
appendtime'
appendcontents'
returnmydf
defgetSeg(scarydata):
#获取分词的DataFrame注意修改一些文件路径
afterseg=[]
foruinmywords:
jieba.add_word(u)
stopwords={}.fromkeys([line.rstrip().decode('
)forlineinopen('
E:
/360yun/myprog/outwords.txt'
)])#如果确保唯一可以直接用list
stopwords[u'
不错'
]='
0'
车子'
fori,tinscarydata.iterrows():
tp=t[0].replace('
segs=jieba.cut(tp)
forseginsegs:
iflen(seg)>
1andsegnotinstopwords.keys():
afterseg.append((tp,seg))
userwords=pd.DataFrame(afterseg)
userwords.columns=['
words'
returnuserwords
defwcfigure(wordsdf,path=r'
test.jpg'
mytitle='
#画云图图,传入dataframe,保存文件路径和名字wdcounts.head(2000).itertuples(index=False)
wordcloud=WordCloud(font_path='
c:
\windows\fonts\STCAIYUN.TTF'
background_color="
white"
margin=5,width=1800,height=1000)
#必须要加载文字体不然中文乱码#printsegStat.head(100).itertuples(index=False)
wordcloud=wordcloud.fit_words(wordsdf.itertuples(index=False))
plt.figure(num=None,figsize=(25,16),dpi=8,facecolor='
w'
edgecolor='
k'
plt.imshow(wordcloud)
plt.axis("
off"
#plt.title(mytitle)
plt.savefig(path)
plt.show()
plt.close()
defrefind((x,y)):
ifx>
15000orx<
20:
returnFalse
returny
deffindBad(words):
flag=False
#printtype(words)
#ifisNan()
words=words.decode('
forxinmywords:
#x=x.encode('
ifxinwords:
flag=True
break
returnflag
deffindBest(words):
forxingoodwords:
#url='
url='
itemid=getItemId(url)
ifos.path.exists(itemid):
#当前路径shous=os.getcwd()查找是否曾经抓取数据
mydata=pd.read_csv(itemid)
mydata=getDeatail(itemid)
mydata.to_csv(itemid,encoding='
index=False)
mydata['
paytime'
]=mydata['
].apply(lambdax:
time.strftime('
%Y-%m-%d%H:
%M:
%S'
time.localtime(x/1000)))
hours'
].str[11:
13]
price'
]/mydata['
delmydata['
],mydata['
dates'
].str[0:
10]
groupby_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(lambdax:
pd.isnull(x)and200orx.total_seconds())#追评相差天数
wordsnum'
]=((mydata['
].str.len().fillna(0)+mydata