本文介绍一种快速生成关键词-词频统计-词云生成的办法,作为Python数据分析初级技能,除基本运行环境外无需其他软件或工具,且流程搭建成功后可重复利用,可极大提升相似事务的处理效率。
一、操作环境
1.1 搭建Python运行环境,如尚未搭建建议下载安装Anaconda,并搭配Jupyter Notebook作为IDE
1.2 需加载pandas,jieba, pyecharts等常用包,直接输入pip install+包名称可能会很慢,建议搜索豆瓣镜像文件快速安装
1.3 数据源可以是现有文件或通过爬虫手段获取,需保证有足够的数据量
二、原始数据获取
本文以京东商城热销的"iphone 13"机型为例,从购买者发布的文字评论中提取关键词进行统计,所以原始数据即评论原文。通过爬虫手段获取最近1000条评论,并保存至本地csv文件,以下为字段预览:
三、Pandas读取文件
3.1 导入本次所需要用到的包:
import pandas as pdimport jiebaimport pyecharts.options as optsfrom pyecharts.charts import WordCloud
读取csv文件:
data = pd.read_csv(r'(文件路径).csv')data.head()
成功读取数据:
查看评论数据是否异常:
data['评价内容'].describe()
一共1000条评论,没有重复(文字重复有极大的刷单嫌疑)
pandas能够用data[字段名]的方法选中特定字段,也可以通过loc[]选中特定行,比如[商品评价]字段中第1行数据:
data['评价内容'].loc[0] #0代表第1行数据
有了这个核心功能,才能在后面用循环语句把一个个支离破碎的单词放在一个列表里进行词频统计
四、分词
Jieba是目前最流行的中文分词组件,比如一句很常见的话:
“我是一个热爱祖国的中国人”
通过jieba可以根据中文语义把句子切分并提取出可作为关键词的单词:
jieba.lcut('我是一个热爱祖国的中国人')
Output[]: ['我', '是', '一个', '热爱祖国', '的', '中国', '人']
有了这样的关键词列表,后续做词频统计会更加方便
五、获取词频
5.1获取全部的关键词列表
由于[商品评论]一共有1000行(本例子算少的),需要用jieba.lcut对每一行的评论原文都进行分词,因此使用for循环语句,并且用List的extend功能获取完整的关键词List:
review_all = [] #先做一个空List,用来装下所有关键词for i in range(999): #已知一共1000条数据review = jieba.lcut(data['评价内容'].loc[i])review_all.extend(review)review_all
Output[]:
['iPhone13',
'手机',
'收到',
'了',
',',
'粉色',
'也',
'太',
'好看',
'了',
'吧',
...]
5.2 对关键词总表进行单词词频统计
首先指定一份“非关键词”名单,比如逗号","可能出现的频次很高,但很明显,这不是我们需要的,可以用一个excludes表列出这类不需要的名单:
excludes = {",",":","“","。","”","、",";"," ","!","?","","\n", "iphone13", "13", "12"}
利用遍历对关键词出现次数做累计,并输出频次前100的关键词:
counts= {}cloud_data = []excludes = {",",":","“","。","”","、",";"," ","!","?","","\n", "iphone13", "13", "12"}for word in review_all:if len(word) == 1: #不使用单字作为关键词continueelif word in excludes:continueelse:rword = wordcounts[rword] = counts.get(rword, 0) + 1items = list(counts.items())items.sort(key=lambda x:x[1],reverse = True)for i in range(100):word, count = items[i]cloud_data.extend([word, count])cloud_data
Output[]:
['拍照',
930,
'效果',
844,
'速度',
839,
'运行',
792,
'屏幕',
758,
'外观',
731,
'音效',
631,
...]
六、生成词云
做词云图的方法有很多,这里推荐使用Pyecharts自带的WordCloud包,在Jupyter
Notebook可以直接输出动态html在页面上,可以灵活调整各项参数(参考官网说明书)。唯一的问题在于,上文我们得到的是一个包含关键词和频次的List,而Pyecharts词云如果要将列表作为参数直接使用,需要元组数据,即[(“关键词”:频次)]结构,因此需要多一步操作,可以使用for循环解决:
L = [] #做一个新的空List用来装下我们要用的元组for i in range(199): #由于我们取Top100关键词+频次,所以一共是200个元素if i % 2 == 0:#偶数位[i]是我们需要的关键词,[i+1]即对应的频次a = cloud_data[i]b = cloud_data[i+1]tuple_x = tuple([cloud_data[i],cloud_data[i+1]])#List转元组L.append(tuple_x) #这里不能用extend,只能用appendL
Output[]:
[('拍照', 930),
('效果', 844),
('速度', 839),
('运行', 792),
('屏幕', 758),
('外观', 731),
('音效', 631),
('非常', 625),
('外形', 593),
('手机', 531),
('待机时间', 502),
('不错', 441),
('苹果', 395),
('好看', 365),
('流畅', 353),
('喜欢', 318),
...]
然后将L这个元组列表传到WordCloud()生成云图:
c = (WordCloud().add("", L, word_gap = 0, word_size_range=[10, 50], mask_image = r'(自定义图片路径)', rotate_step = 90, width = 2000, height = 2000, is_draw_out_of_bound = False).set_global_opts(title_opts=opts.TitleOpts(title=""), ))c.render_notebook()
Output:
公众号水印是本人的,非转载,部分代码片段参考网友的,循环以及List转tuple那段是自己手撕出来的,并尽可能说明原理,希望对初学者有帮助。