1.背景与挖掘目标
随着网上购物越来越流行,人们对于网上购物的需求变得越来越高,这让很多店商平台得以崛起,引发的激烈的竞争,除了商品质量的提高,压低商品价格外,了解更多的消费者心声对于其他将要购买产品的人或店商平台来说,变得越来越有必要了,其中重要的方式是对消费者的评论文本进行挖掘分析.
对京东平台上的手机评论进行文本挖掘分析
1)分析一品牌手机的用户情感分析
2)从评论文本中挖掘出该品牌手机的优点与不足
2分析方法
本次针对京东一品牌手机的消费者的文本评论数据进行分析.对文本进行基本的机器预处理,中文分词,停用词过滤(这里我采用词性过滤),通过建立栈式自编码深度学习,情感倾向模型(这里我直接爬取的是好评,差评,中评,没有通过基于情感倾向模型和转化为机器学习问题)k-means聚类,LDA主题模型分析,实现对文本评论数据的倾向性判断以及所隐藏的信息的挖掘并分析.
1)数据获取
用浏览器浏览到商品评论页,右键点击检查元素,获取该页面请求的url即可,京东,淘宝等店商平台对爬取评论信息基本没有反爬措施.好像只能爬取前100页的评论(有什么能获取更多评论的方法请告诉博主,博主将不胜感激!!!)
代码清单如下:
import requests
import json
import re
import time
import pandas as pda
def main():
bed_outfile = '输出地址\\bed_pl.csv'
good_outfile = '输出地址\\good_pl.csv'
con_outfile = '输出地址\\con_pl.csv'
for i in range(1,4):
if i==1:
indx_page(i,bed_outfile,85)
elif i==2:
indx_page(i, con_outfile, 70)
else:
indx_page(i, good_outfile, 95)
def indx_page(i,file,m):
sp_data = {'评论': '', '日期': '', '会员': '', '追评': '无', '追评日期': '无'}
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
for j in range(m):
url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv25770&productId=6946625&score='+str(i)+'&sortType=5&page=' + str(j) + '&pageSize=10&isShadowSku=0&fold=1'
try:
r = requests.get(url, headers=head)
r.encoding = r.apparent_encoding
print(r.status_code)
mod = re.compile(r'[(](.*)[)]', re.S)
json_text = re.findall(mod, r.text) # 获取的内容不是json格式,通过re得到json格式,返回的是list
data = json.loads(json_text[0])
comments = data['comments']
for comment in comments:
sp_data['评论'] = comment['content']
sp_data['日期'] = comment['creationTime']
sp_data['会员'] = comment['userLevelName']
try:
if comment['afterUserComment']:
afterUserComment_v = comment['afterUserComment']
sp_data['追评日期'] = afterUserComment_v['created']
hAfterUserComment_v = afterUserComment_v['hAfterUserComment']
sp_data['追评'] = hAfterUserComment_v['content']
except:
print('')
print(sp_data)
data_df = pda.DataFrame(sp_data,index=[0])
data_df.to_csv(file, mode='a')
except:
print('')
time.sleep(1)
if __name__=='__main__':
main()
去重原因:
1.一些电商为了避免一些客户长时间不评论,往往设置一道程序,就是系统自动替客户作出评论(想都不用想,肯定是好评啦),但这些数据毫无价值,所以必须去除.
2.同一个人可能出现重复评论,不同的人也可能出现,为了图方便或者是拿好评反现红包,直接就复制粘贴了,即使有价值,也只有第一条.其他的也要去除.
3.常见算法:编辑距离去重,Simhash算法去重等,但这些算法也有一些缺点,就是可能会错删除,有些人是真实评论的,意思比较相近就可能删除,博主这里采用一个比较简单的方法,只去除相同的评论 ,就是python的numpy库中的unique方法.
代码清单:
import pandas as pda
import numpy as npy
def removal(inputfile,outputfile):
items = []
datas = pda.read_csv(inputfile,encoding='utf-8',header=None)
data = datas.iloc[:,3:4].as_matrix()
data1 = npy.unique(data)
print(len(data) - len(data1))
for item in data1:
if len(item)>5:
items.append(item)
data2 = pda.DataFrame(items)
data2.to_csv(outputfile)
def main():
bed_inputfile = '数据读入的地址\\bed_pl.csv'
good_inputfile = '数据读入的地址\\good_pl.csv'
con_inputfile = '数据读入的地址\\con_pl.csv'
bed_outfile = '数据输出的地址\\bed_pl_Dup.csv'
good_outfile = '数据输出的地址\\good_pl_Dup.csv'
con_outfile = '数据输出的地址\\con_pl_Dup.csv'
removal(bed_inputfile,bed_outfile)
removal(good_inputfile,good_outfile)
removal(con_inputfile,con_outfile)
if __name__=='__main__':
main()
代码清单
import jieba.analyse
import pandas as pda
def main():
bed_inputfile = '数据读入的地址\\bed_pl_Dup.csv'
good_inputfile = '数据读入的地址\\good_pl_Dup.csv'
con_inputfile = '数据读入的地址\\con_pl_Dup.csv'
bed_outfile = '数据输出的地址\\bed_pl_Dup_jieb2.csv'
good_outfile = '数据输出的地址\\good_pl_Dup_jieb2.csv'
con_outfile = '数据输出的地址\\con_pl_Dup_jieb2.csv'
jb_fc(bed_inputfile,bed_outfile)
jb_fc(good_inputfile,good_outfile)
jb_fc(con_inputfile,con_outfile)
def jb_fc(inputfile,outputfile):
data = pda.read_csv(inputfile,encoding='utf-8',header=None)
mycut = lambda s:' '.join(jieba.cut(s))#自定义函数,采用结巴分词
data = data[1].apply(mycut)#通过'广播'形式分词,加快速度
data.to_csv(outputfile)
if __name__=='__main__':
main()
有于没采用博主目前还不会语义分析模型,只好先用k-means方法对好评,差评,中评,分别进行聚类分析,然后把聚类好的结果再进行LDA主题模型分析.
下面是对差评进行分析
代码清单:
import pandas as pda
import matplotlib.pylab as plb
import jieba.analyse
from sklearn.cluster import KMeans
from gensim import corpora,models
from sklearn.feature_extraction.text import TfidfVectorizer
def main(date1,n_features=1000):
vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2, use_idf=True)
X = vectorizer.fit_transform(date1[1])
return X
def temf(x):
kms = KMeans(n_clusters=5,n_jobs=2,max_iter=500)#聚5类,2个线程,最大循环500次
y = kms.fit_predict(x)
return y
#print(y)
def train(y,data):
data1 = data.copy()
data1['y'] = y
serice = data1.groupby('y')
for i in serice:
print(type(i[1]))
# m = list(i)
mycut = lambda s:jieba.analyse.extract_tags(s, allowPOS=('v', 'n', 'a', 'c', 'd', 'vn','nz'))
data2 = i[1][1].apply(mycut)
LDA_Anin(data2)
#print(data2)
def LDA_Anin(data):
neg_dict = corpora.Dictionary(data) # 建立词典
neg_corpus = [neg_dict.doc2bow(i) for i in data] # 建立语料库
neg_lda = models.LdaModel(corpus=neg_corpus, num_topics=1, id2word=neg_dict)
for i in neg_lda.print_topics():
print(i)
if __name__=='__main__':
bed_inputfile = '数据读入的地址\\bed_pl_Dup_jieb.csv'
date1 = pda.read_csv(bed_inputfile, encoding='utf-8',header=None)
X = main(date1,n_features=500)
y = temf(X)
train(y,date1)
从以上5个主题大致可以看出如下几点:
(这只是差评得出的结果)
通过以上分析可以给我们一点参考,大致可看出,拍照,声音可能会和官方结果或实际情况有一点差别,售后,降价等问题可以重点关注,赠品可以让客服说清楚,看自己能否接受等.
但是有好处的是,没有显示手机流畅度,手机电量方面的事情,这表明这款手机这两方面还行,可以考虑.
通过上面主要给我们提供了要关注的几个方向,可以让我们更好的看出手机问题,不一定说上面说这款手机的这5个方面不行,就代表自己也觉得不行,上面结果是通过大众评论结果得出的,可以根据自己实际情况去了解这几个方面
例如:
送给长辈(拍照,声音不是那么重要,保不保价也可以接受),如果性价比合适(可以通过好评分析得出)就可以考虑入手
自己用(看中性能,拍照要求不高),如果性价比合适(可以通过好评分析得出)就可以考虑入手
等等