以驱虫市场数据为例,挖掘某店铺新的业务方向和市场增长点。
联系微信sinoleadgolf
接上一节(4) 接下来看市场的舆情情况分析。
11 舆情分析
读数据:
定义文件路径
os.chdir('..')
os.chdir('./评论舆情数据')
用glob把里面文件名都拿到 并赋值给filenames5
filenames5 = glob.glob('*.xlsx')
filenames5
读取其中的bai的数据
df6bai = pd.read_excel(filenames5[1])
df6bai.head(3)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2gTOxUTOwgTM5AzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
抽评论 洗数据:
df6bai['评论'].head()
转换为列表为后边处理文本使用
bai6 = list(df6bai['评论'])
接下来要把这些数据洗干净,然后再做 词云啊 dtm啊 看需要是否建模啊,等等这样的思路展开。
① re正则表达式 替换非中英文为空格
去掉列表 中评论数据 的 除了 英文 中文 以外的 其他东西:
bai61 = [re.sub(r'[^a-z\u4E00-\u9Fa5]+',' ',i,flags=re.I) for i in bai6]
r表示声明是原始字符串,避免与转义字符冲突,平时经常放上
[]表示里面的关系是取 或 的关系
^ 表示 非 的意思 就是除了中文和英文的意思
a-z\u4E00-\u9Fa5 固定表示 中文和英文的 代码
' ',是替换成空格
i 是准备替换的数据
flages=re.i 表示大小写都算
正则表达式
执行完后 数据中的除了中文英文外的其他东西都没有了:
②jieba分词 ④去掉停用词
构建停用词表,首先手上有一份下载好的百度停用词表,读进来
stopwords = list(pd.read_csv('D:/data/python/百度停用词表.txt',
names=['stopwords'])['stopwords'])
stopwords.extend([' ','蟑螂'])
自己按业务增加 停用词
bai62 = [] # 定义一个列表
for i in bai61:#bbai61是保留中英文后的列表
seg0 = pd.Series(jieba.lcut(i))
# 用Series 后边好做布尔索引 这一步是 用i在bai61这个列表里面 去循环每一句话 然后用jieba分词
ind1 = pd.Series([len(j) for j in seg0])>1
# [len(j) for j in seg0]是对分好词的seg0 里面的 做判断 是否长度大于 1 去掉等于1的词
seg1 = seg0[ind1]
# 布尔索引 得到seg1 去掉了长度小于1的
ind2 = ~seg1.isin(pd.Series(stopwords))
# ~ 符号表示取反的意思 isin判断 seg1里面的词是否在停用词中 返回布尔值 取反就是要不在 停用词中的
seg2 = list(seg1[ind2].unique())
# 分好词 去掉长度小于1的 seg1 进行布尔索引(去停用词) 和 去重 得到 列表 seg2
if len(seg2)>0:
bai62.append(seg2)
上面两段代码 就做好了分词 和 去掉停用词
大概看下最后得到的 评论的后几行
⑤取高频词
列表生成式子,把一个列表中的列表,都变成字符串,生成在一张大列表中:
bai63 = [y for x in bai62 for y in x]
bai63
# 或如下方式:
# from itertools import chain
# bai63 = list(chain(*bai62))
计算词频:
baifreq=pd.Series(bai63).value_counts()
baifreq[:50]
绘制词云
按照词云包的格式
组合多个字符为一个长字符,空格分隔
bai64 = ' '.join(bai63)
设置字体的路径,不然最后显示不出来
font=r'C:\Windows\Fonts\msyh.ttc'
放入词云包
wc = WordCloud(font_path=font).generate(bai64)
将图形画出来
plt.figure(figsize=(16,8))
plt.imshow(wc)
plt.axis('off')
plt.show()
将词云图导出图片
wc.to_file('D:/data/python/情词云.png')