目录
目标:用python画出,网上流行的wordcloud词云图
1 准备工作
1.1环境准备
1.1.1安装步骤
1.2 资源准备
1.2.1 文本文件内容如下
1.2.2 图片资源
2 代码测试
2.1 第一版代码和效果
2.1.1 代码和效果
2.1.2 一般plt里解决中文乱码问题
2.1.3 wordcloud的中文显示方框解决办法
2.2 修改后的代码
2.3 导入新的模块
2.3.1 导入模块
2.3.2 可能又是jupyternotebook这个IDE的特殊性导致的?
2.4 读取txt文件的内容,存储在变量wordlist里
2.5 用wordcloud() 函数生成图片
2.6 核心
3 基础代码:WordCloud.generate() 报错的问题
解决一个奇怪的报错:TypeError: WordCloud.generate() missing 1 required positional argument: 'text'
3.1 基础 wordcloud代码,报错
3.1.1 代码
3.1.2 网上查到的方法不对
3.1.3 解决办法
3.1.4 出错原因
4 wordcloud() 语法详细
目标:用python画出,网上流行的wordcloud词云图
1 准备工作
1.1环境准备
- 确保已经安装了 wordcloud 模块
- 如果你运行代码时,加上了这句from wordcloud import WordCloud,STOPWORDS,
- 报错: 找不到wordcloud 模块 ,那么你就需要先安装wordcloud 模块
1.1.1安装步骤
以我的环境 anaconda为例子
- step1: 运行anaconda prompt 命令行的IDE
- step2: 可以先输入 conda list 看看都安装了什么,也可以不看,^ ^
- step3: 输入 pip show wordcloud ,如果显示找不到就是没有安装
- step4: 输入 pip install wordcloud 安装完成即可
- step5: 输入 pip show wordcloud 检查下是否安装成功,看看版本信息,也可以部看,^ ^
1.2 资源准备
1.2.1 文本文件内容如下
随便找点词语,有重复的,不重复的即可。
开心、喜悦、狂喜、尽情、快乐、愉悦、畅快、欣喜、幸福、得意、痛快、满足、欢乐、快活
快乐,舒畅,舒心,欢畅,夷悦,欣忭,怡悦,得意,愿意,欢跃,夷愉,欢快,喜悦,快活,愉快,欢乐,忻悦,欣喜,欢喜,痛快,雀跃,乐意
眉开眼笑 眉飞色舞 喜上眉梢 喜在眉宇 喜眉笑目 捧腹大笑 手舞足蹈 前仰后合
开怀大笑 欢蹦乱跳 笑容可掬 喜笑顡开 笑逐颜开 相视而笑 谈笑风生 兴高采烈
喜从天降 高高兴兴 开开心心 嘻嘻哈哈 满怀喜悦 满心欢喜 喜出望外 大喜过望
甜美、微笑、兴奋,陶醉,高兴,自豪、欣慰,满意、幸运、嬉笑,满意、幸运、嬉笑,狂笑,荣幸,痛快、满足、欢乐、快活,畅快、欣喜、幸福、得意,开心、喜悦、狂喜、尽情、快乐、愉悦、畅快、欣喜、幸福、逸乐、尽情、舒畅、愉快、喜哈、愉快
1.2.2 图片资源
- 图片要注意,wordcloud是把词语生成在图片中,之前有图像的地方,而不是空白的地方
- 因此不要找那种 空白区域特别大的,否则最后效果可能会让你惊讶
2 代码测试
2.1 第一版代码和效果
2.1.1 代码和效果
- 这效果不对啊,这么多方框是什么情况?
from wordcloud import WordCloud,STOPWORDS
import PIL.Image as image#默认矩形,有想要的形状可以加入图片#plt.rcParams['font.family']='LiSu'# 正常显示中文
#plt.rcParams['axes.unicode_minus']=False# 正常显示负号def get_wordList():f = open(r'C:\Users\Administrator\Desktop\t2.txt')wordList = f.read()return wordList
def get_wordClound(mylist):pic_path = r'C:\Users\Administrator\Desktop\tp2.jpg'#注意路径img_mask = np.array(image.open(pic_path))#图片解码 wordcloud = WordCloud(background_color = "white",mask = img_mask).generate(mylist)#font_path ="C:/Windows/Fonts/msyh.ttc",#mask = img_mask掩码 generate(mylist)获取数据plt.imshow(wordcloud)plt.axis("off")#去除坐标轴
wordList = get_wordList()
get_wordClound(wordList)plt.title("wordcloud词云实验")
plt.show()
2.1.2 一般plt里解决中文乱码问题
matplotlib 对中文的支持有问题
一般画图时,遇到图片相关中文显示问题,一般在代码前面加这2句
plt.rcParams['font.family']='LiSu'# 正常显示中文
plt.rcParams['axes.unicode_minus']=False# 正常显示负号
2.1.3 wordcloud的中文显示方框解决办法
- wordcloud = WordCloud(background_color = "white",mask = img_mask).generate(mylist)
- 函数WordCloud()加上 font_path ="C:/Windows/Fonts/msyh.ttc",
- wordcloud = WordCloud(font_path ="C:/Windows/Fonts/msyh.ttc",background_color = "white",mask = img_mask).generate(mylist)
2.2 修改后的代码
from wordcloud import WordCloud,STOPWORDS
import PIL.Image as image#默认矩形,有想要的形状可以加入图片plt.rcParams['font.family']='LiSu'# 正常显示中文
plt.rcParams['axes.unicode_minus']=False# 正常显示负号def get_wordList():f = open(r'C:\Users\Administrator\Desktop\t2.txt')wordList = f.read()return wordList
def get_wordClound(mylist):pic_path = r'C:\Users\Administrator\Desktop\tp2.jpg'#注意路径img_mask = np.array(image.open(pic_path))#图片解码 wordcloud = WordCloud(font_path ="C:/Windows/Fonts/msyh.ttc",background_color = "white",mask = img_mask).generate(mylist)#mask = img_mask掩码 generate(mylist)获取数据plt.imshow(wordcloud)plt.axis("off")#去除坐标轴
wordList = get_wordList()
get_wordClound(wordList)plt.title("wordcloud词云实验")
plt.show()
2.3 导入新的模块
2.3.1 导入模块
from wordcloud import WordCloud,STOPWORDS
import PIL.Image as image #默认矩形,有想要的形状可以加入图片#居然不需要 import matplotlib ?
2.3.2 可能又是jupyternotebook这个IDE的特殊性导致的?
- 居然不需要 import matplotlib
- 后面使用 plt.show() 也没有出错
jupyternotebook我现在知道的例外的特点:
- 不用写 plt.show() 也能显示matplotlib.pyplot 下的figure内的图形
- 不支持弱引用
2.4 读取txt文件的内容,存储在变量wordlist里
def get_wordList():
f = open(r'C:\Users\Administrator\Desktop\t2.txt')
wordList = f.read()
return wordList
2.5 用wordcloud() 函数生成图片
- 先进行图片解码
- 然后再显示图片
def get_wordClound(mylist):
pic_path = r'C:\Users\Administrator\Desktop\tp2.jpg'
img_mask = np.array(image.open(pic_path))
wordcloud = WordCloud(font_path ="C:/Windows/Fonts/msyh.ttc",background_color = "white",mask = img_mask).generate(mylist)
#mask = img_mask掩码 generate(mylist)获取数据
plt.imshow(wordcloud)
plt.axis("off")#去除坐标轴
- 需要用图片解码
pic_path = r'C:\Users\Administrator\Desktop\tp2.jpg'#注意路径
img_mask = np.array(image.open(pic_path))#图片解码
- 用 plt.imshow() 显示图片
- 隐藏坐标轴
plt.imshow(wordcloud)
plt.axis("off")#去除坐标轴
2.6 核心
wordcloud = WordCloud(font_path ="C:/Windows/Fonts/msyh.ttc",background_color = "white",mask = img_mask).generate(mylist)
调用之前的函数
wordList = get_wordList()
get_wordClound(wordList)
3 基础代码:WordCloud.generate() 报错的问题
解决一个奇怪的报错:TypeError: WordCloud.generate() missing 1 required positional argument: 'text'
3.1 基础 wordcloud代码,报错
3.1.1 代码
import matplotlib.pyplot as plt
import wordcloudtext="你好,hello,hi"
wordcloud=wordcloud.WordCloud.generate(text)
3.1.2 网上查到的方法不对
这个错误通常出现在使用了一个过期的Pillow库版本或者安装错误的Pillow库版本上。建议检查你的Pillow库版本是否正确,并更新至最新版本。可以通过以下命令更新Pillow库:pip install --upgrade Pillow(可能出现权限不允许,使用管理员身份运行cmd窗口)
pip install --upgrade Pillow
在执行generate方法时报错ValueError: Only supported for TrueType fonts
解决方法:
先确认一下WordCloud的font_path参数指向的font文件路径有无问题,如果没问题大概率就是pip没有更新的问题了
generate实例: >>> text3.generate() Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: generate() missing 1 required positional argument: 'words' >>> 产生一些与text3风格类似的随机文本。但在本机上却出错,原因是我使用的是nltk3.3和Python3.6,该版本下generate函数被注释了,所以无法使用。 而《python自然语言处理时》书中用的是NLTK2.0版本。
3.1.3 解决办法
- wordcloud=wordcloud.WordCloud.generate(text)
- 修改为
- wordcloud=wordcloud.WordCloud().generate(text)
- 马上就不报错了
下面是修正的代码
import matplotlib.pyplot as plt
import wordcloudtext="你好,hello,hi"
wordcloud=wordcloud.WordCloud().generate(text)
下面是修正的代码,加上显示图形,
import matplotlib.pyplot as plt
import wordcloudtext="你好,hello,hi"
wordcloud=wordcloud.WordCloud().generate(text)plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
效果如下
3.1.4 出错原因
- wordcloud=wordcloud.WordCloud.generate(text)
- wordcloud=wordcloud.WordCloud().generate(text)
- 必须是函数WordCloud()的返回对象的的方法.generate(text)
- 而不是对象名为WordCloud这样的某个对象的方法.generate(text)
# 创建一个WordCloud对象 wordcloud = WordCloud()
还要注意大小写wordcloud.WordCloud()
下面2段只要1个,要改
from wordcloud import WordCloud# 创建一个WordCloud对象
wordcloud = WordCloud()# 定义文本
text = "This is a sample text for word cloud generation."# 使用WordCloud.generate()函数生成词云图
wordcloud.generate(text)# 显示词云图
wordcloud.to_image().show()
from wordcloud import WordCloud
import matplotlib.pyplot as plt# 创建一个WordCloud对象
wordcloud = WordCloud()# 生成词云图
text = "Python wordcloud词云,在一段文本中提取关键词进行扁平化的展示,更能吸引目标客户的眼球。"
wordcloud.generate(text)# 显示词云图
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
4 wordcloud() 语法详细
4.1 几级对象辨析
wordcloud.WordCloud().generate(text)
4.2 函数基础语法
wordcloud = WordCloud(font_path ="C:/Windows/Fonts/msyh.ttc",background_color = "white",mask = img_mask).generate(mylist)
wordcloud.WordCloud
WordCloud的参数:
font_path:可用于指定字体路径
width:词云的宽度,默认为 400;
height:词云的⾼度,默认为 200;
mask:蒙版,可⽤于定制词云的形状;
min_font_size:最⼩字号,默认为 4;
max_font_size:最⼤字号,默认为词云的⾼度;
max_words:词的最⼤数量,默认为 200;
stopwords:将被忽略的停⽤词,若不指定则使⽤默认停⽤词词库;
background_color:背景颜⾊,默认为 black;
mode:默认为RGB模式,如果为RGBA模式且background_color设 为 None,则背景将透明。
generate(str) 接受一个字符串
# 打开文本
text = open(base_dir + 'constitution.txt').read()
# 生成对象
wc = WordCloud().generate(text)
4.3 如何显示
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
# 显示词云图
wordcloud.to_image().show()
# 显示
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
4.4 保存为图片
wc.to_file("默认样式.png")
输出
- 提供了四个输出函数:
- to_array(self):numpy数组格式
- to_file(self, filename)
- to_html(self):没有实现
- to_image(self):PIL图像
依赖的包
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
import matplotlib.pyplot as plt
import jieba
import jieba.analyse
from PIL import Image
import random
import numpy as np
5 设置图片效果
使用透明背景 蒙板
透明背景: mode=‘RGBA’, background_color=None
mask = np.array(Image.open("black_mask.png"))
wc = WordCloud(font_path='Hiragino.ttf', mode='RGBA', background_color=None, mask=mask, width=600, height=400)
使用蒙版中的颜色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
自定义颜色
# 颜色函数
def random_color(word, font_size, position, orientation, font_path, random_state):
s = 'hsl(0, %d%%, %d%%)' % (random.randint(60, 80), random.randint(60, 80))
return s
...
wc = WordCloud(color_func=random_color, font_path='Hiragino.ttf',mode='RGBA', background_color=None, mask=mask)
使用权重
# 提取关键词和权重
freq = jieba.analyse.extract_tags(text_new, topK=200, withWeight=True) # 列表
freq = {i[0]: i[1] for i in freq} # 字典
mask = np.array(Image.open(f"{base_dir}color_mask.png"))
wc = WordCloud(font_path='Hiragino.ttf',mode='RGBA', background_color=None, mask=mask)
res = wc.generate_from_frequencies(freq)
freq = nltk.FreqDist(word_text)
# wc.fit_words(freq) # 然后再generate
wc.generate_from_frequencies(freq)
6 jieba 和分词
# 分词
text_new = " ".join(jieba.cut(text))
wc = WordCloud('Hiragino.ttf') # 不加字体会中文乱码
text = ' '.join(jieba.cut(text))
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloudtext = open("D:/++/宏观经济和资产配置.txt", encoding="utf-8").read() # 标明文本路径,打开# 生成对象
wc = WordCloud(font_path = "C:\Windows\Fonts\Microsoft YaHei UI\msyh.ttc",width=500, height=400, mode="RGBA", background_color=None).generate(text)
# 显示词云图
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()#保存文件
wc.to_file("C:/Users/xiao/Desktop/ciyun1.png")