舆情分析
文本挖掘基本流程
使用的数据是评论数据,即文本数据 · 文本数据的分析过程主要有:清洗,可视化,建模.这里针对中文文本
清洗基本流程:1.替换非中英文字符为空格;2.分词(结巴jieba);3.去掉停用词(对描 述和建模无意义的词);4.筛选高频词.此流程需要反复尝试对比效果
可视化:一般都是词云,可能配合关键词排序等
建模:建模前需要将数据转成文档词矩阵(dtm);有监督的话常用的是贝叶斯,其他 偏精度的算法也可以,要注意特征个数;无监督常用的是主题模型LDA,其他诸如 分群,情感分析也可以 · 清洗流程中,尤其是口语化较强的数据,例如评论数据,需要去除重复语句,以及字数少 于某个阈值的评论.
下面开始正式复现上述流程。
os.chdir('..')
os.chdir('./评论舆情数据')
filename = glob.glob('*.xlsx')
filename
['安速.xlsx', '德国拜耳.xlsx', '科林虫控.xlsx']
df6bai = pd.read_excel(filename[1])
bai6 = list(df6bai['评论'])
bai6[:5] # 提取5条看一看
['刚收到,家里厨房突然出现小强了,看了这个评价挺多挺好,销量也大,赶紧定了三盒,一定要管用啊一定要管用,一定要管用,准备看下后续效果会继续追加评价。不知道多久才能消灭干净,还在厨房,没法做饭了,都不愿意进去了。有点担心会挥发。看很多人在用也就试试吧。哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎',
'朋友推荐的说之前用的挺管用的。在放药的前几天就没怎么见蟑螂了,然后出去玩之前把家里角角落落全都点涂上了,四天之后回来开门的时候内心相当忐忑啊?? 不过居然一只都没见...也不知道是真的没有了,还是跟我错峰出行了....但愿是管用了,不然我真疯了!第二次购买了,超级好用,之前家里蟑螂都翻烂了,朋友推荐这个,买了两支送了一支,点上胶饵以后,',
'真心坑人啊!😂还没到24小时就凝固了!小强依然活跃🤑🤑🤑🤑',
'盆友推荐的,说特别好用,效果杠杠的,看双十一做活动,就买啦,效果应该不错吧,不过尸体都是家里不怕蟑螂的人处理的,所以我也不是很清楚…可以认真考虑家里常备啦,但是不太敢一次买很多,怕放不好变质了。还送了沉甸甸的一大包湿巾,很棒,可以用来给蟑螂尸体的地方消毒。',
'我是买到假货吗?那么贵的蟑螂药居然还有,还是蟑螂已经百毒不侵了?']
可见,我们需要一定的数据清洗:非中英文字符的不要、在分词前逗号、句号不要。
bai61 = [re.sub(r'[^a-z\u4E00-\u9Fa5]+',' ',i,
flags=re.I) for i in bai6]#中文字符 \u4E00-\u9Fa5 flags=re.I 不区分大小写
bai61[:5]
['刚收到 家里厨房突然出现小强了 看了这个评价挺多挺好 销量也大 赶紧定了三盒 一定要管用啊一定要管用 一定要管用 准备看下后续效果会继续追加评价 不知道多久才能消灭干净 还在厨房 没法做饭了 都不愿意进去了 有点担心会挥发 看很多人在用也就试试吧 哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎',
'朋友推荐的说之前用的挺管用的 在放药的前几天就没怎么见蟑螂了 然后出去玩之前把家里角角落落全都点涂上了 四天之后回来开门的时候内心相当忐忑啊 不过居然一只都没见 也不知道是真的没有了 还是跟我错峰出行了 但愿是管用了 不然我真疯了 第二次购买了 超级好用 之前家里蟑螂都翻烂了 朋友推荐这个 买了两支送了一支 点上胶饵以后 ',
'真心坑人啊 还没到 小时就凝固了 小强依然活跃 ',
'盆友推荐的 说特别好用 效果杠杠的 看双十一做活动 就买啦 效果应该不错吧 不过尸体都是家里不怕蟑螂的人处理的 所以我也不是很清楚 hellip 可以认真考虑家里常备啦 但是不太敢一次买很多 怕放不好变质了 还送了沉甸甸的一大包湿巾 很棒 可以用来给蟑螂尸体的地方消毒 ',
'我是买到假货吗 那么贵的蟑螂药居然还有 还是蟑螂已经百毒不侵了 ']
接着我们来去掉停用词(百度的停用词库)。不过在此之前,我们得先分一下词,这里我们用的分词工具是jieba分词。先来看一下jieba的使用:
jieba.lcut('真心坑人啊 还没到 小时就凝固了 小强依然活跃')
['真心',
'坑人',
'啊',
' ',
'还',
'没到',
' ',
'小时',
'就',
'凝固',
'了',
' ',
'小强',
'依然',
'活跃']
接下来正式进行分词
# 先读取停用词
# 原始字符串
stopwords = list(pd.read_csv(r'C:\Users\美丽小哈\data\百度停用词表.txt',
names=['stopwords'])['stopwords'])
bai62 = []
for i in bai61:
#对每条评论分析
seg1 = pd.Series(jieba.lcut(i))
ind1 = pd.Series([len(j) for j in seg1])>1 #长度大于1的保留
seg2 = seg1[ind1]
#去掉停用词 isin
ind2 = ~seg2.isin(pd.Series(stopwords))
seg3 = list(seg2[ind2].unique())#去重一下
if len(seg3)>0:
bai62.append(seg3)
bai62[0] #得到的是大列表套小列表
['收到',
'家里',
'厨房',
'小强',
'评价',
'销量',
'赶紧',
'三盒',
'管用',
'后续',
'效果',
'追加',
'多久',
'才能',
'消灭',
'干净',
'没法',
'做饭',
'进去',
'担心',
'挥发',
'很多',
'试试']
#组合多个列表到一个列表:
bai63 = [y for x in bai62 for y in x]
bai63[:5]
['收到', '家里', '厨房', '小强', '评价']
#词频统计
baifreq = pd.Series(bai63).value_counts()
baifreq[:10] # 看下前10个词
效果 541
蟑螂 409
双十 145
不错 144
评论 138
小强 114
收到 106
用户 100
填写 100
东西 95
dtype: int64
词云
#而构建一个词云所需要的数据 一个巨大字符串 (用空格分隔的词):
bai64 = ' '.join(bai63)
#最后一个步骤,调用WordCloud模块生成词云
#读取照片
mask = imageio.imread(r'C:\Users\美丽小哈\data\leaf.jpg')
#如果是中文的词云---字体
font = r'C:\Users\美丽小哈\data\simhei.ttf'
wc = WordCloud(background_color='white',mask=mask,
font_path=font).generate(bai64)
plt.figure(figsize=(8,8))
plt.imshow(wc)
plt.axis('off')#不要坐标轴
plt.show()