本文的示例全部是在anaconda 的jupyter python3 中 运行
本文所处理的数据全部是用爬虫在大众点评中随机爬取的几家火锅店的评论信息
若需要数据请私信
1.数据分析
- 要想绘制词云,首先第一步得先分析数据,拿到自己所需要的内容。
1.1 取出数据
1.1.1 导入模块
import pandas as pd
from matplotlib import pyplot as plt # 作图模块
import pymysql
import seaborn as sns # 高级可视化工具 作图
%matplotlib inline
1.1.2 连接数据库
- 使用pymsql 来建立连接数据库读取数据
db = pymysql.connect("localhost","root",'123456',"xiaofan")
sql = "SELECT * FROM dzdp;"
sql = "SELECT * FROM dzdp_more;"
data = pd.read_sql(sql,db)
db.close()
data.shape # 查看数据大小以及基础信息
data.info # 查看详情信息
data.head() # 查看前五条
1.2 数据挖掘
1.2.1 分析数据
- 数据是六千多条大众点评中七个火锅店的评论,包含字段:顾客昵称,评论时间,评分,评论内容以及店铺ID
- 分析评分
data['comment_star'].value_counts() #统计数据中 comment_star 字段 各个内容的数量
1.2.2 数据清洗
- 画出评分的柱状图
# loc 定位只统计 星级那一列
data.loc[data["comment_star"] == "sml-str1","comment_star"] = "sml-str10"
# 对星级中 没用的数据清洗掉 ‘sml-str’ 找出文本中数字 ,因为实在列表中,所以取第一个
data['stars'] = data['comment_star'].str.findall(r'\d+').str.get(0)
# 将数据处理为浮点型
data['stars'] = data['stars'].astype(float)/10
# 绘图 sns.countplot(data=,x=,y=) 中 data为绘图数据 x 为横坐标 y 为纵坐标
sns.countplot(data=data,x='stars')
- 根据所绘制的柱状图可知,评论集中于好评,好评占比远远高于差评,其中5分的评价最多
- 此外还可以绘制箱型图
- 以商家为横坐标,评分为纵坐标为例
sns.boxplot(data=data,x="shopID",y="stars")
- 可以发现这七家店铺都是高分好评,其中三家店铺最厉害,基本全是五星好评
2.数据处理
2.1 提取时间特征
# 在data的comment_time 字段中找出所有符合日期格式的数据(防止有数据格式不正确报错)
data.comment_time = pd.to_datetime(data.comment_time.str.findall(r'\d{4}-\d{2}-\d{2} .+').str.get(0))
# 年月日 和 时
data['year'] = data.comment_time.dt.year
data['month'] = data.comment_time.dt.month
data['weekday'] = data.comment_time.dt.weekday
data['year'] = data.comment_time.dt.year
注: 要是报 .str 不能再np.object上使用的错误的时候,在Kernel中选择重新运行解决
# 为各个星期的每小时评论数量创建分布图
# 创建一个fig 和 ax1 对象 创建画布比例 16:6
fig,ax1 = plt.subplots(figsize=(16,6))
# 将时间和评论数量导入数据表 ,并且引用“unstack()”函数使其不堆叠
# 默认 hour 为索引
df = data.groupby(['hour','weekday']).count()['cus_id'].unstack()
# 释放到画布 kind = line 绘制折线图 也可以写为 style = "-"
df.plot(ax=ax1,kind="line")
plt.show()`
- 周一到周日的小时评论分布较为类似,顾客从上午十点开始活跃起来,上午十点到晚上八点活跃人数逐步上升,晚上八点之后急剧上升,晚上十点左右活跃人数开始下降。晚上十一点急剧下降,一直降到凌晨两点,此时几乎没有用户再活跃。一直到早上六点,慢慢的增加活跃人数。也可以对单个特征及逆行分析,比如评论人数最多的时间是周六晚上十一点半左右。最不活跃的一天是周三。根据图可以分析出许多顾客的消费规律。
2.2 分析评论长短
评论的长短可以看出评论者的认真长度
data['comment_len'] = data['cus_comment'].str.len()
fig2,ax2 = plt.subplots()
sns.boxplot(x="stars",y="comment_len",data=data,ax=ax2)
ax2.set_ylim(0,800)
- 1分最短,2分和三分最长,4分和五分基本一样并且处于居中水平,由此得出。评论长短和打分多少无关
2.3 处理文本数据
2.3.1 去除非文本数据:可以看出,爬虫获取的数据有类似 \n 的非文本数据,而且还有一些无意义的干扰数据,例如结尾的 收起评论。所以需要对数据进行清洗。
data['cus_comment'][10]
# 去除非文本数据和无意义文本
data['cus_comment'] = data['cus_comment'].str.replace(r'[^\u4e00-\u9fa5]','').str.replace('收起评论','')
再查看下
data['cus_comment'][10]
可以发现,数据已经干净多了,但是还是有很多无意义的语气词
2.3.2 中文分词
- 这里我们使用 结巴库 来给我们获取的纯中文语句进行分词,就是说把数据处理为只有中文的词组成的数据,且每个词之间有空格区隔
import jieba
data['cus_comment'] = data['cus_comment'].apply(lambda x:" ".join(jieba.cut(x)))
data['cus_comment'].head()
- 此时可以看到数据已经完成了分词
2.3.3 去除停用词:
文本中有很多无效的词,比如“的”,“着”,“了”。还有一些标点符号,这些词在分析时没有意义,因此需要去掉。因为wordcloud和TF-IDF都支持停用词,因此就不额外的处理了
3.词云展示
- 这里我们用了 wordcloud 来制作词云
from wordcloud import WordCloud,STOPWORDS
#导入PIL模块 图像处理库
from PIL import Image
import matplotlib
import numpy as np
# 设置绘图的字体为楷体
matplotlib.rcParams['font.sans-serif']=['KaiTi']
# 作图的中文
matplotlib.rcParams['font.serif']=['KaiTi']
- 设置停用词
这里的txt文件为一个写好的停用词文件,内容为 的,呢,了,等等···
infile = open("stopwords.txt",encoding="utf-8")
stopwords_list = infile.readlines()
STOPWORDS = [x.strip() for x in stopwords_list]
stopwords = set(STOPWORDS)
封装一个函数,传入不同的商家ID就可以绘制不同商家的词云
def ciyun(shop_ID = 'all'):
texts = data['cus_comment']
if shop_ID == 'all':
text = ' '.join(texts)
else:
text = ' '.join(texts[data['shopID']==shop_ID])
wc = WordCloud(font_path='msyh.ttc',
background_color = 'white',
max_words = 108,
stopwords = stopwords,
max_font_size = 80,
random_state = 66,
margin = 2
)
# 生成词云
wc.generate(text)
# 这里调用imshow()函数实现热图绘制,热图(heatmap)是数据分析的常用方法,通过色差,亮度来展示数据的差异,易于理解
# interpolation 设置边界或者图片的模糊程度,bilinear线性的,这里表示文资必须清晰,不能模糊!
plt.imshow(wc,interpolation='bilinear')
#作图
# 不显示坐标轴
plt.axis("off")
- 查看下我们数据中有哪些商家ID
# 查看下有哪些商家ID
data["shopID"].unique()
- 绘制词云
# 绘制第一家
ciyun(data['shopID'].unique()[0])
# 绘制第二家
ciyun(data['shopID'].unique()[1])
# 绘制第三家
ciyun(data['shopID'].unique()[2])
# 绘制第四家
ciyun(data['shopID'].unique()[3])
# 绘制第五家
ciyun(data['shopID'].unique()[4])
# 绘制第六家
ciyun(data['shopID'].unique()[5])
# 绘制所有
ciyun()
- 到这里词云的绘制就完成了,商家通过分析词云就能看出很多东西,比如别的商家词云中都有服务,为什么自己家没有,别人家都有味道,为什么自己家没有,这就需要自己去反思了
4.数据导出
#导出数据
data.to_csv('data1.csv',index=False)