数据呈现丨中文文本可视化:用 Python 轻松制作词云
摘要
本文给出了一个根据中国电视剧剧本的“内容提要”,用 Python 对文本进行最基础的分词处理、词频统计以及绘制词云图的案例。
引言
1、对备案公示的“内容提要”进行分词处理;
2、对分词结果进行词频统计,删除词频低于设定值的词语;
3、使用词云图直观的展示“内容提要”的信息。
处理过程
一、相关库的安装
1、jieba:中文分词
2、wordcloud:词云图制作
3、matplotlib:可视化工具,用于展示制作的词云图
4、PIL:Python 的第三方图像处理库,用于读取图片。(注意:安装PIL时命令行输入 pip install pillow,这是因为 PIL 原来是只支持 Python2 的版本的,后来出现了移植到 Python3 的库pillow,但是使用的时候,仍然使用的是 PIL。)
import os
import jieba
import numpy as np
import 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) # 停用词表去重
左右滑动查看更多
(二)分词
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)
左右滑动查看更多
四.统计词频
(一)创建计数器函数
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
左右滑动查看更多
(二)计数器调用
#将分词结果转化为一个二维列表
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)
左右滑动查看更多
五.词云图制作
(一) 使用默认方式制作词云图
#对象实例化
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()
左右滑动查看更多
(二) 词云图常用参数
👉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,
)
左右滑动查看更多
(三) 自定义词云图模板
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】👉 简单有用易上手
回复【学术前沿】👉机器学习丨大数据
回复【数据资源】👉公开数据
回复【可视化】👉 你心心念念的数据呈现
回复【老姚专栏】👉老姚趣谈值得一看
►一周热文
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
欢迎扫描👇二维码添加关注