Python:Python 3.6 (64-bit)
Jetbrean:PyCharm Community Edition 2018.1
操作系统:Windows7
WorldCloud()官方使用说明 & matplotlib.pyplot.imshow()官方使用说明链接这里。先看我实现的代码和运行结果:
from wordcloud import WordCloud, ImageColorGenerator # 引入词云WordCloud
from scipy.misc import imread # 引入读取图片的工具
import jieba # 引入分词的词典
import matplotlib.pyplot as plt # 制图包, as作用是重命名长度大的程序,方便引用写码
text = open('G:/CPDA/1.txt','r').read() # 可分为两步, 1st: file = open(), 2nd: text = file.read()
# 英文文档不需要此行jieba代码。
cut_text = ' '.join(jieba.cut(text)) # 让jieba把文本进行分词,从而词云显示“词组”而不是“句子”。并重新命名为cut_text,以示区别。
# 注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
bg_pic = imread('G:/CPDA/1.png') # 文件路径需要加引号;创建图片,这是为了替换WordCloud默认的长方形输出形状;
wc = WordCloud( # WordCloud()设定词云参数,.generate()将str文本生成词云
mask=bg_pic, # 设定词云形状是bg_pic。
font_path='c:\windows\Fonts\simhei.ttf' # 设定文字的类型为中文黑体。
background_color='white', # 设定图片背景为白色。默认为黑色。
scale=15, # 设定图片像素密度为15.默认之为1。
).generate(cut_text)
image_color = ImageColorGenerator(bg_pic) # 提取图片的色彩分布
a = wc.recolor(color_func = image_color) # 替换默认的字体颜色
plt.imshow(a, interpolation='bilinear') # Bilinear:双线性插值算法,用来缩放显示图片。缩放就是把原图片的像素应用坐标系统,用坐标表示,
# 双线性插值算法就是把一个坐标不是整数的点的坐标,用最近的四个整数点坐标指示出来;
# 输出时,将云图按照图片的色彩分布进行显示。
plt.axis('off') # 关闭坐标轴显示
plt.show()
# 最终从窗口显示词云
wc.to_file("pjl_cloud1.jpg") # 保存图片,默认和本.py文件保存到一处。
附注部分:
Q1、pip install wordcloud装不了怎么办?
从官网链接下载,然后windows的cmd中执行:
pip install <系统盘路径> + <文件名> wordcloud‑1.4.1‑cp36‑cp36m‑win_amd64.whl
1. 一些国内浏览器无法下载wordcloud,比如QQ浏览器。可以使用Chorm浏览器。
1. 如何选择Wordcloud版本?例如:wordcloud‑1.4.1‑cp36‑cp36m‑win_amd64.whl
· “cp36”表示适用“Python3.6“,
· “win_amd64”表示适用64位“Python3.6“软件,
2. 不能为了图省事修改.whl文件的名字,否则无法安装。
Q2:如何正常显示中文,而不是矩形框框?
指定文本字体为中文,因为worldcloud默认英文
wordcloud = WordCloud(
font_path='c:\windows\Fonts\simhei.ttf', # 写明地址,指定文字的类型为中文黑体。
).generate(cut_text)
font_path='c:\windows\Fonts\xxx.ttf':C盘的“c”大小写没有影响,但文件路径有影响,如“Fonts“不能写成“fonts”。
拓展:怎么指定字体是中文?从哪里找中文字体?有2个途径:
- 其一 直接使用Windows自带中文(具体方法见问题3)
- 其二 网上下载.ttf格式的中文文档,放到C:\windows\fonts文件夹里边
Q3:为什么得到的是“句子云”? 为什么使用了jieba.cut()函数之后,还要使用 join()函数?
- 产生“句子云”的原因有2个:
- 要么没有使用jieba.cut()进行分词,txt被直接用于WordCloud.generate();
- 要么使用了jieba.cut()但是没有用符号分隔jieba分好的词,(比如''.join())使得句子变回了原始txt格式,这时WordCloud.generate()只能按标点符号得到“句子云”。
- 使用join()函数的原因:
- 使用jieba进行分词,我们会得到一个可迭代的generator,但是WordCloud.generate()只使用str格式,不使用generator。
- 这时候使用jion()函数把generator格式转换为str格式就OK了。通过例子我们能清楚的看出来jion()函数和jieba.cut()函数的功能:
from wordcloud import WordCloud, ImageColorGenerator # 引入词云WordCloud
from scipy.misc import imread # 引入读取图片的工具
import jieba # 引入分词的词典
import matplotlib.pyplot as plt # 制图包, as作用是重命名长度大的程序,方便引用写码
# jieba.cut()函数
# 假设我们有一个名为“haha.txt”,内容为“我勒个去,txt读取之后是什么格式?”的文件。
txt = open('f:/haha.txt', 'r').read()
cut_txt = ' '.join(jieba.cut(txt)) # 特殊符号为 空格符
j_txt = jieba.cut(txt)
cut1_txt = ''.join(jieba.cut(txt)) # 没有特殊符号
print(f'type of txt:{type(txt)}')
print(f'type of cut_txt:{type(cut_txt)}')
print(f'type of j_txt:{type(j_txt)}')
print(f'type of cut1_txt:{type(cut1_txt)}')
# 结果如下:
"""
type of txt:<class 'str'>
type of cut_txt:<class 'str'>
type of j_txt:<class 'generator'>
type of cut_txt:<class 'str'>
"""
print(txt)
print(cut_txt)
print(j_txt)
print(cut1_txt)
"""
# 我的测试文本内容
我勒个去,txt读取之后是什么格式? # str格式
我勒个 去 , txt 读取 之后 是 什么 格式 ? # 我们要的就是它:句子被分词 & 格式是str
<generator object Tokenizer.cut at 0x000000000B3F49E8> # 这是为什么jieba.cut()不能直接用
我勒个去,txt读取之后是什么格式? # 只是用jion.()可以把generator转化为str,但是jieba.cut()失效了,相当于没有分词。
"""
Q5:怎么用Windows自带的其他中文字体?
方法:在“C:\windows\fonts”文件夹下,使用“Display”类型字体。
Tips:“Text”类的不行,会被报错:
self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine)
OSError: cannot open resource