电商在我国的发展可谓是如火如荼,而且现在很多电商都取消了好评差评的分类,所有评论全部放到一起,查看起来比较繁琐。具体都有哪些因素影响了顾客的购物体验,又是哪些因素主导了顾客的评论呢?
本文收集了评论数据,基于LDA、贝叶斯模型算法对热销的空调评论进行了情感分析,分析了影响用户体验的因素。
以下部分为正文:
−−−by:朱世新 − − − b y : 朱 世 新
电商在我国的发展可谓是如火如荼,而且现在很多电商都取消了好评差评的分类,所有评论全部放到一起,查看起来比较繁琐。具体都有哪些因素影响了顾客的购物体验,又是哪些因素主导了顾客的评论呢?
感觉今年的夏天是珊珊来迟又突然爆发,前几天还阴雨绵绵,现在一下子就进入夏天的节奏。因而博主突发奇想:大家对于现在电商网站上销量最高的空调的评价是怎样的?其高销量背后有哪些主导因素呢?
于是博主收集了评论数据,基于LDA、贝叶斯模型算法对热销的空调评论进行了情感分析,分析了影响用户体验的因素。
>>引用介绍:LDA(Latent Dirichlet Allocation)主题模型 - 原文地址:<<
from selenium import webdriver
from time import sleep
import csv
driver = webdriver.Chrome()
# 热销排名第一的商品链接
url='https://item.jd.com/1993092.html'
driver.get(url)
driver.maximize_window()
sleep(2)
driver.execute_script("window.scrollBy(0, 768)","") # 页面向下滚动768px
sleep(1)
comments_li = driver.find_element_by_id('detail').find_elements_by_tag_name('li')[4].click() # 找到评论所在的li标签
sleep(1)
with open('Gree_ac_comments_1.csv','w',encoding='utf-8',newline='') as opf:
writer = csv.writer(opf)
title=['usrer_id','comments']
writer.writerow(title)
count = 1
for j in range(100):
sleep(1)
for i in range(3): # 网页下拉四次,确保数据加载完成
driver.execute_script("window.scrollBy(0, 800)", "") # 页面向下滚动768px
sleep(1)
sleep(5)
parent_div = driver.find_element_by_id('comment-0').find_elements_by_class_name('comment-column')
for div in parent_div:
data=[]
data.append("user_%d" % count)
all_comment=div.find_elements_by_class_name('comment-con')
comments=''
for comm in all_comment:
comments = comments + comm.text.strip() +'#'
print(comments)
data.append(comments)
writer.writerow(data)
count+=1
driver.find_element_by_id('comment-0').find_element_by_class_name('ui-page').find_element_by_class_name('ui-pager-next').click()
sleep(5)
driver.delete_all_cookies() # 尝试每次删除所有的cookies
再对京东网站上热销排行第一的空调进行评论数据爬取时发现,每次爬完四页之后商品就会自动加入到购物车而使得爬取数据过程中断,一开始以为是cookies的问题,后来加入了每页数据爬取完毕后删除cookies的操作,但是依然还是会在第四页评论爬取完后将商品加入购物车。
不得不说,京东还是太调皮了!
from selenium import webdriver
from time import sleep
import csv
import random
driver = webdriver.Chrome()
# 热销排名第一的商品链接
url='https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.2.47651490Hc0iIr&id=540795429928&skuId=3411600439704&standard=1&user_id=1035757927&cat_id=2&is_b=1&rn=6a186772afd098af18a041f8f115b446'
driver.get(url)
driver.maximize_window()
sleep(2)
driver.execute_script("window.scrollBy(0, 768)","") # 页面向下滚动768px
sleep(2)
comments_li = driver.find_element_by_id('J_TabBar').find_elements_by_tag_name('li')[2].click() # 找到评论所在的li标签
sleep(2)
with open('AUX_ac_comments_2.csv','w',encoding='utf-8',newline='') as opf:
writer = csv.writer(opf)
title=['usrer_id','comments']
writer.writerow(title)
# flag = True # 定义flag属性,用于while循环
count = 1
# page=1
# while flag:
for j in range(100):
sleep(2)
for i in range(3): # 网页下拉三次,确保数据加载完成
driver.execute_script("window.scrollBy(0, 800)", "") # 页面向下滚动768px
sleep(1)
sleep(random.choice([4,5,6]))
parent_div = driver.find_element_by_id('J_Reviews').find_element_by_class_name('rate-grid')
all_trs=parent_div.find_elements_by_tag_name('tr')
for tr in all_trs:
data=[]
data.append("user_%d" % count)
comments=''
all_comments=tr.find_elements_by_class_name('tm-rate-fulltxt')
for i,comment in enumerate(all_comments):
if i ==0:
comments = comments + comment.text.strip() + '追加评论:'
else:
comments = comments+comment.text.strip()
data.append(comments)
writer.writerow(data)
count+=1
driver.find_element_by_class_name('rate-paginator').find_elements_by_tag_name('a')[-1].click()
sleep(random.choice([4,5,6]))
driver.delete_all_cookies()
借鉴于京东的滑铁卢,所以在本段代码中也加入了删除cookies代码,但是在运行的时候依然会有另外的一些问题:
好在经过几次尝试后发现,及时关闭弹出的对话框,并将页面滚动到评论区域,爬虫还是会继续工作,最后总共爬取了1200+条的数据才被中断。
import pandas as pd
import numpy as np
df=pd.read_csv('./../data/AUX_ac_comments_2.csv',names=['user_id', 'comments'],header=0)
df.head()
df.info()
df.duplicated().value_counts() # 对返回结果进行计数
>> False 1360 # 无重复数据
comments_split = df['comments'].str.split('解释').apply(pd.Series) #所有"解释"部分均为买家的对应用户评论的解释,在这里予以剔除
comments_split.head()
df['comments'] = comments_split[0] # 只取第一列作为有效评论
# 定位无评论内容
df.loc[df["comments"]=="此用户没有填写评论!追加评论:"] # 查找仅有‘此用户没有填写评论!追加评论:’的评论,
# 在爬取数据时设置了使用“追加评论”来标记追加评论部分
# 删除无评论内容
df.drop([497,1103,1133],axis=0,inplace = True)
df.iloc[1100:1105] # 查看是否删除成功
# 查漏,通过将'此用户没有填写评论!追加评论:'进一步确保替换成功
df['comments'] =df['comments'].str.replace('此用户没有填写评论!追加评论:','') # 将默认评论部分替换为空值
# 在第一次运行时,发现结果离出现很多‘追’这个关键字,发现评论中还有‘追加评论’没有删除干净,于是这里添加一条替换代码
df['comments'] =df['comments'].str.replace('追加评论','') # 将‘追加评论’替换为空值
df.info()
comments_data = df.iloc[:,1] # 仅取评论部分数据
comments = comments_data[comments_data.apply(len)>=4] # 长度大于等于4,即至少4个字的评论才会被保留
comments_data[:5] #切片取前五条展示
# 此处使用snownlp模块对评论进行情感分析
from snownlp import SnowNLP
coms=[]
coms=comments.apply(lambda x: SnowNLP(x).sentiments)
# 情感分析,coms在0~1之间,以0.5分界,大于0.5,则为正面情感
pos_data=comments[coms>=0.6] # 此处取0.6是为了使的词的情感更强烈点
neg_data=comments[coms<0.4] # 负面情感数据集
pos_data[:5]
# 分词
import jieba
mycut = lambda x: ' '.join(jieba.cut(x)) # 自定义简单分词函数
pos_data=pos_data.apply(mycut)
neg_data=neg_data.apply(mycut)
pos_data[:5]
print(len(pos_data)) >> 667
print(len(neg_data)) >> 541
# 导入停用词词典
stop = pd.read_csv('./../data/stoplist.txt',encoding ='utf-8',header=None,sep='tipdm')
# sep设置分割词,由于csv默认以半角逗号为分割词,而该词恰好在停用词表中,
# 因此会导致读取出错,所以解决办法是手动设置一个不存在的分割词,如tipdm
stop=['','']+list(stop[0]) # pandas自动过滤了空格符,这里手动添加
pos = pd.DataFrame(pos_data)
neg = pd.DataFrame(neg_data)
pos[1] = pos['comments'].apply(lambda s: s.split(' ')) #定义一个分隔函数,然后apply广播
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop] ) # 逐词判断是否为停用词
neg[1] = neg['comments'].apply(lambda s: s.split(' ')) #定义一个分隔函数,然后apply广播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop] )
from gensim import corpora,models # 类似于scikit-learn
# 负面主题分析
neg_dict = corpora.Dictionary(neg[2]) # 建立词典,以计算机可以处理的方式(数字)
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] # 建立语料库,bag of word
# doc2bow()方法解析
# new_doc = 'Human computer interaction computer'
# new_vec = dictionary.doc2bow(new_doc.lower().split()) # 其中的dictionary是已经构建好的Dictionary变量
# print(new_vec)
# 输出为:[(0,1),(1,2)]
# (0,1) --> 0 代表索引,表示第一个词,1表示出现的次数,即:Human出现了1词
# (1,2) --> 代表:computer出现了2词
# 第三个词:interaction没有统计,是因为词典里没有收录该词
neg_lda = models.LdaModel(neg_corpus,num_topics = 3,id2word =neg_dict ) # LDA模型训练
for i in range(3):
print('neg_topic' + str(i))
print(neg_lda.print_topic(i)) # 输出每个主题
# 正面主题分析
pos_dict = corpora.Dictionary(pos[2]) # 建立词典,以计算机可以处理的方式(数字)
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]] # 建立语料库,bag of word
pos_lda = models.LdaModel(pos_corpus,num_topics = 3,id2word =pos_dict ) # LDA模型训练
for i in range(3):
print('pos_topic' + str(i))
print(pos_lda.print_topic(i)) # 输出每个主题
通过上述分析可以看出在被判定为负面评论的关键词中,‘安装’的系数是最大的,,其次主要就是‘师傅’,可见在空调销售的过程中,对用户评论有关键影响的主要是空调的安装服务已经安装师傅的服务态度,另外可以看出,‘售后’、‘客服’、‘物流’也是比较重要的;
‘师傅’、‘安装’的系数还是比较大的,另外‘不错’、‘满意’等类似的关键词反应了顾客对应商品还是比较满意的,另外‘及时’、‘很快’也一定程度上反应了物流的快慢对于用户好的购物体验的影响。
根据结果总体分析来看,本例中收集的数据量并不是特别大,且情感分析、分词的准确率并不能百分百的正确预测,但也在一定程度上反应了具体由哪些因素主导了用户的购物体验及评论的好坏。