程序员有三种美德:懒惰,急躁和傲慢
平时在网上经常看到这样的图片
我就想,这些东西能不能用python实现呢,果然python库无所不在,有一个库wordcloud就是干这个的
如果你没有可以使用pip下载安装
首先我们想象做这东西都需要什么东西
1.因为都是用词组成的,需要很多词,如果提供的是文本则需要分词操作
2.这些词有大有小,大小和出现的频率有关系
3.图有形状
首先我们来解决一下分词的问题,做这东西也有相应的库,名字叫jieba
名字比较奇怪,反过来想也挺形象,结巴说话就是蹦词嘛,哈哈
wordlist_jieba=jieba.cut(text)
引入jieba,一句话分词,返回一个列表
wordcloud=WordCloud(background_color="black",
max_words=150,
max_font_size=85,
font_path="FZLTXIHK.TTF"
).generate(text)
image=wordcloud.to_image()
image.show()
然后使用wordcloud来生成词云,参数的作用就是名字(背景颜色 最大词数量 最大字体 字体文件路径)
然后使用to_image转换成图片,最后显示出来
但是你会发现一个问题,一段话里面有很多你不想要的词,不管中国人说话还是外国人说话语句中就有很多语气助词,连接词等等,比如:然后,这些,那些,所以,但是,因为
我们不想要这些词,我们可以使用stopw0rds来去除这些词
然后我还需要改变词云的外形,因为默认的形状是矩形,很难看
这里还需要两个库,一个是PIL处理图片的,一个是numpy科学计算的
mask_pic=numpy.array(Image.open(os.path.join(cur_path,"love.jpg")))
使用os.path.join生成一个指定环境下指定文件名的路径,使用Image.open打开图片,再使用numpy.array把图片转换为数组
然后在生成词云时添加参数mask值为图像数组就好了,mask相当于一个遮罩层
完整代码发一份
from wordcloud import WordCloud
import jieba
import numpy
import PIL.Image as Image
import os
stopwords={"然后":0,"这些":0,"那些":0,"所以":0,"但是":0}
cur_path=os.path.dirname(__file__)+"./resources"
def chinese_jieba(text):
wordlist_jieba=jieba.cut(text)
text_jieba=" ".join(wordlist_jieba)
return text_jieba
with open(os.path.join(cur_path,"qingshi.txt")) as file:
text=file.read()
text=chinese_jieba(text)
mask_pic=numpy.array(Image.open(os.path.join(cur_path,"love.jpg")))
# print(text)
#背景颜色 词数量 词字体大小 字体文件路径(需要放到和py文件同一个路径下) 去掉的词 遮罩层
wordcloud=WordCloud(background_color="black",
max_words=150,
max_font_size=85,
font_path="FZLTXIHK.TTF",
stopwords=stopwords,
mask=mask_pic).generate(text)
image=wordcloud.to_image()
image.show()
生成图:
这是用一百首情诗做出来的,一百首情诗的浓缩,程序猿的浪漫