Python数据可视化:词云库的讲解和如何制作词云
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
以下文章来源于仓储进化 ,作者 小无为
身边总是不经意间能看到词云的效果图。本章介绍python实现词云的方法。效果如下:
(词云--出现频率越多的词,字体越大 )
工具篇
1、安装可视化库
pip3 install matplotlib
( matplotlib 是专业的python可视化库,可用来生成各种各样的图表。也是二级考试里面推荐的可视化库。)
2、安装词云库, 用来生成词云图片信息的
pip3 install wordcloud
3、安装 “结巴” 库, 这个名字起的真接地气, 给开发者点个赞
pip3 install jieba
这个库用来解析中文,把一句话解析成一个个的词,
我们中文不像英文每个词之间有空格。需要根据语义分析拆分成词组
我们用《剑雨》的一段对话举例:
import jieba #引入结巴库 str="师傅,他为何说禅机已到,
佛祖点化世人讲究机缘,
禅机一过缘即灭矣,
而禅机未到虽点亦不中
我愿化身石桥又是何意"
print(str)
# 解析拆分词组 lcut的方法
words = jieba.lcut(str)
print(words)
效果如下:
( 把完整的句子拆分成一个个的词,看着断断续续,可能这就是结巴的由来吧,【拆词】最难的这部分,结巴库都做好了,这也是python强大的原因吧,各式各样的库都有了 )
结巴库
网上下载txt格式的《西游记》,
下载完成后转换成utf-8格式再保存一下。
转化方法:记事本另存为的时候,选择编码格式UTF-8
稍微、稍微、稍微列一下涉及到的知识点
( 不要被吓到,不难,都是二级考试要求的内容 )
- print的format的格式化输出
- for 循环用法
- 文件的开打,读取,关闭,文件路径
- 数组,python不叫数组,叫list列表
- python的字典类型 key:value,类似java的map类型或者json对象
准备工作:
- 西游记和python文件可放到一个目录,引用起来方便,直接文件名就 ok,不用写路径了,
- 拷贝一个中文字体库,放到同目录下,也是为了引入方便,在Windows的C:WindowsFonts里面,随便找一个中文字体,就行,否则生成的图片都是乱码, (也可以用绝对路径直接指定)
- 准备几张图片,词云支持按指定的图片形状显示,比如心形,五角星,汽包,或者人像等等,但要求图片是白色背景
format 格式化输出:
#列标题 formatprint("{0:<5}{1:<8}{2:<5}".format("序号","词语", "频率"))
{0:<5} :
0 表示序号:第一个参数,第一列,
< 左对齐, > 右对齐
5 代表宽度
任务一:统计西游记里面出现频率最高的10个词:
后面为了方便,我们把这个叫主代码。
#引入结巴库import jieba
#open 内置函数 不需要引用 直接使用
#开打文件西游记和python 文件放到同一个目录,可直接引用不需要路径
f = open("西游记.txt", "r" ,encoding="utf-8" )
# 查看文件的编码格式
print("文件的编码格式:"+f.encoding)
#读取文件
txt = f.read()
#关闭文件,良好的习惯
f.close()
# 使用精确模式对文本进行分词
# 使用结巴库把西游拆分成一个个的词组
words = jieba.lcut(txt)
# 通过键值对的形式存储词语及其出现的次数
# 大括号表示 python的字典类型对应,
# 键值对 key:value1 ,类似java的map对象和list
counts = {}
chiyun = []
for word in words:
# == 1 单个词语不计算在内
if len(word) < 2 :
continue
else:
# 遍历所有词语,每出现一次其对应的值加 1
counts[word] = counts.get(word, 0) + 1
#将键值对转换成列表
items = list(counts.items())
# 根据词语出现的次数进行从大到小排序
items.sort(key=lambda x: x[1], reverse=True)
#列标题 format
print("{0:<5}{1:<8}{2:<5}".format("序号","词语", "频率"))
#需要显示的范围 10即显示前10个,0到9
for i in range(10):
word, count = items[i]
print("{0:<5}{1:<8}{2:>5}".format(i+1,word, count))
效果如下:
行者 妥妥的第一主角。
我预期的师徒四人后,就应该有观音
我们看前20是否有观音,在主代码里的第39行代码for循环的范围改成20
for i in range(20):
还是没有观音, 放出前100,200,300 到500在看:
终于出现了,在349位,重复61次,
应该是有哪里问题,直觉判断不止61次重复
任务二:统计四个字重新次数
把上面主代码25行,改成小于4,即长度小于4个的词不统计
if len(word) < 4 :
效果如下:
预知后事如何,请听下回分解,‘下回分解’排第二合理。
悟空每次打妖怪都要吹下牛,在洞口报个名:我是五百年前大闹天宫的齐天大圣,这两个词出现在前10 合理。
词云库
我们在梳理下流程:
注意下:结巴库不是必须,主要是用来把句子拆分成词,如果你已经有统计好的词组,可直接用词云显示。
试一个简单的:我们手工创建个词组,直接用词云显示出来。即绕开结巴库了
from wordcloud import WordCloud# python的可视化库,也是二级考试推荐的可视化库
import matplotlib.pyplot as plt
str=["齐天大圣","大圣","大圣","八戒","嫦娥"]
#数组里面添加内容
str.append("玉兔")
str.append("女儿国")
str.append("牛魔王")
str.append("大圣")
str.append("土地公公")
str.append("小神仙")
str.append("八戒")
print(str)
#join 函数 用斜杆拼接词组mask =maskph,
#这里一定要join拼接一下 转成字符串
text_cut = "/".join(str)
#看一下连接后的样子
#关键点 text_cut 是词云要处理的内容
print(text_cut)
wordcloud = WordCloud( background_color="white",font_path = "msyh.ttc", width=1000, height=860, margin=2).generate(text_cut)
# 显示图片
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
可观察下效果图:主要join后的输出,用/拼接成了一个字符串:
效果图:
(大圣和八戒出现次数多,字体最大)
词云图
先把全代码放上,后面实例在解析:
这段可先略过,下面直接看效果图:
#引入结巴库
import jieba
#词云库
from wordcloud import WordCloud
# python的可视化库,也是二级考试推荐的可视化库
import matplotlib.pyplot as plt
from PIL import Image #处理图片的
#矩阵 好像也是协助处理图片的
import numpy as np
#open 内置函数 不需要引用 直接使用
#开打文件西游记和python 文件放到同一个目录,可直接引用不需要路径
f = open("西游记.txt", "r" ,encoding="utf-8" )
# 查看文件的编码格式
print("文件的编码格式:"+f.encoding)
#读取文件
txt = f.read()
#关闭文件,良好的习惯
f.close()
# 使用精确模式对文本进行分词
# 使用结巴库把西游拆分成一个个的词组
words = jieba.lcut(txt)
# 通过键值对的形式存储词语及其出现的次数
# 大括号表示 python的字典类型对应,
# 键值对 key:value1 ,类似java的map对象和list
counts = {}
#数组对象 用来接收需要传递给词云的内容
chiyun = []
for word in words:
# == 1 单个词语不计算在内
if len(word) < 2 :
continue
else:
# 遍历所有词语,每出现一次其对应的值加 1
counts[word] = counts.get(word, 0) + 1
#将键值对转换成列表
items = list(counts.items())
# 根据词语出现的次数进行从大到小排序
items.sort(key=lambda x: x[1], reverse=True)
#列标题 format
print("{0:<5}{1:<8}{2:<5}".format("序号","词语", "频率"))
#需要显示的范围 10即显示前10个,0到9
for i in range(80):
word, count = items[i]
print("{0:<5}{1:<8}{2:>5}".format(i+1,word, count))
chiyun.append(word)
#print(chiyun)
#加载图片信息
maskph = np.array(Image.open("山东舰航母.png"))
#join 函数 用斜杆拼接词组
text_cut = "/".join(chiyun)
wordcloud = WordCloud(mask =maskph, background_color="white",font_path = "msyh.ttc", width=1000, height=860, margin=2).generate(text_cut)
# 显示图片
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
效果1:全部显示
即:结巴库处理好的词组,不做限制,全部送给词云显示:
显示二:限定内容显示
比如改成 只输出前20个词:(显示密度会稀好多)
即:结巴库处理好后,取前20个高频词传给词云显示:
( 这个二级教材里面没有哈 )
再试一下前20的 四个字的词:
以上是 Python数据可视化:词云库的讲解和如何制作词云 的全部内容, 来源链接: utcz.com/z/530252.html