许久之前写了一篇《Python网络爬虫实战》的博客,里面讲了爬虫的过程,但是没有讲如何分析。这次讲述一下用如何通过词云分析,来从这些文本数据里面获得结论
主要是看了一下随着日期,玩家每天的评论变化,其中红色柱状是总的评论数
这里我们发现几个非常有趣的点, (1)4.13前后出现了评分陡降的情况 (2)4月底评分持续低迷
这段时间肯定是发生了什么事情,所以才出现掉分的情况。具体的原因,我们可以通过对评论的内容进行挖掘探究
所以我们这里 要做的是,对这问题时间的评论进行提取,并对其进行词云分析,得到热词 从而可以通过这些热词来反推玩家的讨论焦点,找到导致评分下降的原因
-------------------------------------以下过程仅针对第一个评分陡降的点,即4月13日前后---------------------------
1、语句分词:将完整的自然语言语句,切割成一个个单独的词汇,便于词频统计。这是个挺复杂的事情,尤其是中文的分词,因为汉语中并没有空格这样的分隔符,但是不用担心,python有第三方库函数可以解决——Jieba分词
2、过滤停用词:分词后的词汇里面,会带有很多的 “的” 、“我” 、“我们” 、“游戏”等高频但是没有什么意义的词汇,因此需要过滤掉。这里我们需要自己准备好一些需要过滤的词库,称为停用词——Jieba分词已支持该功能
3、词频分析:分割后的语句,其实就是一大堆的词汇,我们再通过统计词频,就可以知道哪些是高频词汇了——Jieba分词同样已支持该功能
4、词云生成:其实当你拥有词频后,分析就已经基本结束了。如果需要更直观的展示出来(例如放进PPT或者分析报告里),可以生成一个词云来实现——这里要用到的是wordcloud库函数
下面贴一下各部分对应的代码。(需要注意的是,以下分析使用的是目标时间4月12日~4月14日的评论数据,因为提取过程与本文关系不大,因此没有单独贴出来)
step 1 语句分词:
#调用了jieba分词的函数cut,对sentensce进行分词。这里的sentence是包含多个语句的List对象,需要转成str
sentence_seged=jieba.cut(str(sentence)) #jieba初步分词
step 2 过滤停用词:
#加载停用词,从停用词文件star_stopwords.txt中逐行读取词汇
stopwords=[line.strip() for line in open('star_stopwords.txt','r').readlines()]
#过滤停用词,如果词汇在停用词中,就去掉。否则保留
words='' #创建输出容器
for word in sentence_seged: #过滤掉所有停用词
if word not in stopwords:
if word!='\t': #循环直至结尾
words+=word
words+=' '
step 3 词频分析:
#调用jieba分词的词频分析函数,来生成词频统计
keywords = jieba.analyse.extract_tags(str(words), #需要统计的词汇
topK=50, #返回热词数量,50指最高频的50个
withWeight=True, #是否返回权重,权重≈频率
allowPOS=()) #是否过滤词性,如果有需要可以指定,如"n" "v"
word_weights = pd.DataFrame(keywords)
word_weights.head(20) #展示词频结果
运行结果如下:
0 1
0 暗改 0.240368
1 云雀 0.094070
2 玩法 0.092025
3 恶心 0.083570
4 剧情 0.081063
5 收益 0.073015
6 装备 0.070598
7 体验 0.070330
8 思议 0.068136
9 扫荡 0.065506
10 星弧 0.063627
11 官方 0.062411
12 修复 0.053854
13 策划 0.051040
14 单机游戏 0.049488
15 可玩性 0.049488
16 让玩家 0.049322
17 角色 0.045681
18 迷宫 0.044745
19 雷电 0.042122
20 关卡 0.041186
其实到这里,我们已经能够获得所需要的信息了,在分数骤降的这段时间(4月12日~4月14日)里,我们可以发现暗改”、“恶心”这两个词出现的很频繁,然后我们再回去之前爬取到的评论里搜索一下相关评论,就知道问题在哪了:跨越星弧官方对产出奖励等数值进行了暗改, 并且没有向玩家进行说明,导致很多玩家都极为不满
为了可以更方便的展示,我们把词云也生成出来
step 4 词云生成:
#建立wordcloud对象,通过WordCloud库函数生成词云,直观展示结果
wc = WordCloud(font_path='STXIHEI.TTF', #wc没有中文字体库,需要导入一个
width=800, #设定展示区域的大小
height=600,
mode='RGBA',
background_color=None)
wc.generate(str(words)) #通过我们的过滤后的分词结果生成词云
plt.figure(figsize=(20, 10))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show() # 建立一个图表对象,并显示图片
至此,分析完成。结论:
在4月13日前后,《跨越星弧》官方对产出奖励等数值进行了暗改, 并且没有向玩家进行说明,导致很多玩家都极为不满,进而狂打差评
(这可能不是唯一原因,但至少是最重要的原因)
下面说一下自己学到的一些新的体会
1、积累停用词库:分析过程其实很简单,第三方库函数已经帮我们完成了大量的工作。实际上,词频分析最大的工作量来自于针对性的停用词库。
因为不同场景下的文本,其包含的高频无用词是有很大的区别的,这是我们的进行词频分析的主要阻碍,因此当你需要进行某一领域的词频分析时,学会积累和管理个性化停用词库非常重要。
例如我在进行跨越星弧的分析时,会发现“游戏”、“很好”、‘推荐’、“星弧”这类词出现的非常频繁,但却没有任何帮助,经过不断的重复跑代码,加停用词,最终才得到了一个比较有效的结果
2、合理选择工具:词频分析、词云分析,其实本质上是同一个东西。当词频分析的结果已经足够支撑你的结论的时候,没有必要为了一个好看的词云图而花费太多时间去调整。
以上。
对于《跨越星弧》的评论,4月23日~5月1日间的评论分数持续低迷,其实也可以通过类似的方式进行分析。这里由于篇幅原因就不多赘述了。感兴趣的读者可以参考类似方法,看看能得出什么结论