查看原文
其他

数据呈现丨中文文本可视化:用 Python 轻松制作词云

江东、咪咪 数据Seminar 2021-06-03




摘要

本文给出了一个根据中国电视剧剧本的“内容提要”,用 Python 对文本进行最基础的分词处理、词频统计以及绘制词云图的案例。



引言

随着大数据资源不断被挖掘,以及机器学习的方法在实践中的持续应用,对传统结构化数据的分析处理已经不能满足人们对社会、经济、商业领域的研究需求。非结构化数据,例如文本、语音、图像等又是一块极具开发价值的数据金矿,亟待人们的挖掘,对非结构化数据的分析处理已经逐渐成为学界新的前沿探索方向。
在所有对非结构化数据的处理方法中,文本分析技术已经初露端倪,在学界,张秀敏,杨连星等(2019)针对社会责任报告这一叙述性文本披露领域,基于印象管理和委托代理理论,探讨了修辞语言运用特征及其影响因素,苏立宁、廖求宁(2019)基于2006-2017年的政策文本分析了“长三角”经济区地方政府人才政策的差异与共性。在业界,更是有各类互联网平台公司根据用户发表的评论或者文章分析用户的情绪,并将其用于各种商业运作。
最近,团队收集了一批影视剧的备案公示数据和许可发行数据,其中信息量较多且有意义的是备案公示中的“内容提要”。研究人员想从“内容提要”中提取相关信息,以分析国内影视剧的现状和发展趋势。然而“内容提要”是纯文本格式,无法直接使用,因此我对备案公示数据进行了简单的分词处理,并使用词云图以便更好的展示“内容提要”中的主要信息。
数据的处理主要包括以下三部分:

1、对备案公示的“内容提要”进行分词处理;

2、对分词结果进行词频统计,删除词频低于设定值的词语;

3、使用词云图直观的展示“内容提要”的信息。

下面展示一下我的处理过程,以供大家参考,相互交流学习。


处理过程


一、相关库的安装

我使用的是 Python 处理数据,在正式开始工作之前,需要准备好工作环境,即相关库的安装。我们需要用到的 Python 相关库主要有以下4个:

1、jieba:中文分词

2、wordcloud:词云图制作

3、matplotlib:可视化工具,用于展示制作的词云图

4、PIL:Python 的第三方图像处理库,用于读取图片。(注意:安装PIL时命令行输入 pip install pillow,这是因为 PIL 原来是只支持 Python2 的版本的,后来出现了移植到 Python3 的库pillow,但是使用的时候,仍然使用的是 PIL。)


其它的同 Python 其他库安装方式一样,命令行中输入:pip install module_name 导入相关库,在使用过程中缺什么库,再使用 pip 安装即可:
import osimport jiebaimport numpy as npimport pandas as pd
from PIL import Image # 读取图片from wordcloud import WordCloud # 词云图制作from collections import defaultdict # 统计词频from matplotlib import pyplot as plt from wordcloud import ImageColorGenerator # 获取自定义图片上的颜色

左右滑动查看更多



二、数据读取

#读取 csv 文件fpath = '../datas/tv_data.csv' data = pd.read_csv(fpath, sep=',', encoding='utf-8', usecols=[2, 3, 5])data.head() # 查看前5行

左右滑动查看更多

原始的 csv 数据中有9个字段,实际上只需要剧名、公示日期、内容提要3个字段即可,因此使用 usecols 参数仅读取这3列的数据,在原始数据中他们的列索引分别为2、3、5。读取到的数据结果如下:



三、分词处理

分词时需要去除助词、介词、连词、语气词及标点符号等一些没有实际意义的词语,这些停用词可以从网上自行下载。除此之外,还需要自定义一个停用词表,用以去除那些在文本中没有实际意义的词语,比如:最终、因为、一切、经历等。


(一) 载入停用词表

def read_stopword(fpath): """ 读取中文停用词表 """ with open(fpath, 'r', encoding='utf-8') as file: stopword = file.readlines() return [word.replace('\n', '') for word in stopword] #加载多个停用词表path = '/Users/liuliangdong/project/jupyter_project/NLP/stopwords'name_list = ['中文停用词.txt', '哈工大停用词.txt', 'stopword.txt']
stop_word = []for fname in name_list: stop_word += read_stopword(os.path.join(path, fname))stop_word = set(stop_word) # 停用词表去重

左右滑动查看更多

我加载了3个停用词表,中文停用词和哈工大停用词这两个是从网上下载的,另外一个则是根据文本的实际情况自定义的。同时读取3个独立的文件,为了避免停用词列表重复,使用 set() 将停用词列表转化为集合去重。


(二)分词

def cut_word(ser, stop_word): """ 使用jieba.cut()对内容提要分词处理, :params ser: pd.Series object :params stop_word: list or tuple object """ # 删除分词结果中的停用词 result = [word for word in jieba.cut(ser['内容提要']) if word not in stop_word] # 去除分词后长度小于2的词语 return ' '.join([word for word in result if len(word)>1])
data['内容提要'] = data.apply(lambda x: pd.Series(cut_word(x, stop_word)), axis=1)

左右滑动查看更多

调用 jieba.cut(sentence)  方法定义分词函数,jieba 的具体用法请参考官方文档:
结巴中文分词:https://github.com/fxsjy/jieba
分词时过滤掉停用词表中的词语,同时去除分词结果中的单字,因为从这些单字中看不出实际意义。然后使用 apply() 方法对所有的“内容提要”进行分词处理,至此分词工作就完成了,如下图所示,我们可以将分词的结果保存下来,以便后续的使用。



四.统计词频

(一)创建计数器函数

def count_words(word_lists, n): """ 统计词频,并过滤掉词频小于某个阈值 n 的词语 : params word_lists 二维列表 """ frequency = defaultdict(int) # 实例化对象 for word_list in word_lists: for word in word_list: frequency[word] += 1 # 去除词频小于某一阈值的词语,.items()遍历字典的key以及value new_dict = {key:value for key, value in frequency.items() if value > n} return new_dict

左右滑动查看更多

defaultdict:是 Python 内建函数 dict 的一个子类,Python 中通过 Key 访问字典,当 Key 不存在时,会引发‘KeyError’异常。为了避免这种情况的发生,可以使用 collections 类中的 defaultdict() 方法来为字典提供默认值,其用法与 dict 基本相同。使用字典生成式来达到去除低于设定阈值词频(n)的词语的目的。


(二)计数器调用

#将分词结果转化为一个二维列表word_lists = [item.split() for item in data['内容提要']]#调用计数器并传入参数,去除词频小于20的词语frequency = count_words(word_lists, 20)#以字典的值对字典排序frequency = sorted(frequency.items(), key=lambda d:d[1], reverse=True)

左右滑动查看更多

frequency.items() 得到了 [(key, value)] 列表,使用 sorted() 按照 value 进行降序排序,部分结果如下:



五.词云图制作

Python 制作词云图的库有多种,主流的有 pyecharts 中的 WordCloud 库和本次制作词云使用的 wordcloud 库,pyecharts 制作词云图比较繁琐,因此我更倾向于选择 wordcloud 制图。wordcloud 制作词云图时可以使用默认图形,也可自定义图片制作。下面将为大家展示这两种制图过程。


(一) 使用默认方式制作词云图

#对象实例化wc = WordCloud(font_path='./SIMFANG.TTF')  # 设置显示中文的字体
content = ' '.join(data['内容提要'].tolist())  # 将所有的分词结果拼接为一个字符串,间隔为一个空格wc.generate(content) # 接收字符串文本,生成词云图
#保存词云图wc.to_file('../images/cloud/电视剧内容提要词云图.png')
#以下代码为实时展示制作的词云图plt.imshow(wc)plt.axis('off')plt.show()

左右滑动查看更多

词云图的实际效果如下图,可以看到词云图的从开始到写入磁盘4行代码就可以搞定,着实是非常的简单。
在上述实例化词云图对象时,参数 font_path 用于设置词云图中文字的字体,其取值为字体的存放路径,如果不设置该参数则会导致词云图中的中文无法显示。字体的获取也很简单,在 windows 系统中 system/font 中存放着很多显示中文字体,都可以使用。


(二) 词云图常用参数

虽然制作出简单的词云图,但是毫无美感可言,因此在实例化词云图对象时,除了上述的 font_path 外,还有10多个参数用来个性化输出词云图,我这里总结了部分常用的参数及我个人设置供大家参考:

👉max_words:词云图中显示词语的最大数量,默认200     

👉width:词云图宽度,默认400

👉height:词云图高度,默认200

👉min_font_size:字体的最小尺寸,默认4

👉max_font_size:字体的最大尺寸

👉background_color:词语图背景色,默认 black

👉stopwords:停用词列表

👉colormap:为词语设置显示颜色,默认 viridis,除此之外还有 cool,winter,spring,summer等,详细可参考 matplotlib 的 cmap 配色:https://matplotlib.org/users/colormaps.html

wc = WordCloud( font_path='./SIMFANG.TTF', # 设置中文字体 max_words=400, # 最大词数量 min_font_size=2, # 最小字体 max_font_size=60, # 最大字体 background_color='black', # 设置词云图背景色 colormap='autumn', # 设置文词显示的颜色 stopwords=['成为'], # 设置停用词 width=600, # 词云图的尺寸 height=400, )

左右滑动查看更多

按上述设置生成的词云图,效果如下:



(三) 自定义词云图模板

上面的图形生成的词云图虽然多了些变化,但其外形上仍然是中规中矩的,如果我们想生成自定义形状的词云图,那又该如何呢?当然在 wordcloud 中有对应的方法来帮我们完成该工作,做法也非常简单,只需在实例化词语图对象时,添加 mask 参数以及他的辅助参数 scale。mask 为模版图片转化而来的数组,scale 则是设置词云图为原模版图片的倍数,默认为1。实现过程:
bg_image = np.array(Image.open('./datas/yang.jpg')) # 读取模板图片并将其转化为数组wc = WordCloud( font_path='./datas/SIMSUN.TTC', mask=bg_image, # 设置背景图 scale=0.5, # 原图的几倍 colormap='PiYG',)

左右滑动查看更多

模版图片如下图:

图源水印

用该图为模版制作的词云图如下:

我们也可以通过以下方法,用模版图片的颜色来对词云图文字颜色重新填充,而不是使用它本身给定的文字颜色。
#提取背景图片中的颜色img_colors = ImageColorGenerator(bg_image)#将文词颜色替换为,背景图片中的颜色wc.recolor(color_func=img_colors)

左右滑动查看更多



结语

至此,对影视剧内容提要的处理工作就已经完成,剩下的分析过程就可以交给团队的小姐姐进行了!大家也可以对本例中的WordCloud的参数进行自定义修改,根据自己的喜好调试出“合胃口”的词云图。




►往期推荐

回复【Python】👉 简单有用易上手


回复【学术前沿】👉机器学习丨大数据

回复【数据资源】👉公开数据

回复【可视化】👉 你心心念念的数据呈现

回复【老姚专栏】👉老姚趣谈值得一


►一周热文

数据呈现丨台风天,别出门,在家学热力图

特别推荐丨老姚专栏:关于实证研究,我只能告诉你这么多了

学术前沿丨认真起来,统计学、统计模型和机器学习原来不一样!

学术前沿丨当计量经济学遭遇机器学习(三):高维回归之岭回归

工具&方法丨菜鸟升级打怪系列之python代码优化(2)



数据Seminar

这里是大数据、分析技术与学术研究的三叉路口



作者:江东(刘良东)、咪咪(陈静晗)审阅:杨奇明编辑:青酱




    欢迎扫描👇二维码添加关注    


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存