wordcloud自动生成词云图 之 词云图生成


发布时间:2020-02-07 20:52    作者: Uncle Hui   已过去:2 月   阅读总量:108 已被赞:1


接上篇 :http://www.hui2017.top/blog/6jcPhiobhAEerGnAoob36Z/

上篇完成了中间件,成功获取了搜索的关键词,我们来实现云图

1.安装wordcloud

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple wordcloud

如果是win系统安装,安装往往会失败,提示没有C++,请直接转到这篇文章,可以完美解决http://www.hui2017.top/blog/3hhqWTrSAf7nqUkCgc4oeQ/

安装成功后,再次安装就会成功。

2. views.py

#词云生产
from wordcloud import WordCloud
from PIL import Image
import matplotlib.pyplot as plt
import jieba  #pip install jieba
import numpy as np

 

def word_cloud():
    # 打开文本
    with open('word.txt' ,'r',encoding='utf-8') as text :
        text = text.read()
        # 中文分词
        text = ' '.join(jieba.cut(text))
        #打开图片
        mask = np.array(Image.open("china.png"))
        # 生成对象
        wc = WordCloud(mask=mask,font_path='msyh.ttf', mode='RGBA', background_color=None).generate(text)
        # 显示词云
        plt.imshow(wc, interpolation='bilinear')
        plt.axis('off')
        plt.show()
        # 保存到文件
        wc.to_file('media/wc.png')

3.我希望在博客首页生成,每次打开我的首页 就会生成一次最新的云图,就去首页视图里调用函数 word_cloud()

4.在项目下传入:字体msyh.ttf,china.png

5.首页展示图片

后记:词云图一般使用:

1. 英文词云

from wordcloud import WordCloud
import matplotlib.pyplot as plt
 
# 打开文件
text = open('constitution.txt').read()
 
# 生成对象
wc = WordCloud().generate(text=text)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
 
# 保存文件
wc.to_file('wordcloud.png')
 

2.中文词云

# -*- coding: utf-8 -*-
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
 
# 打开文本
text = open('xyj.txt').read()
 
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
 
# 生成对象
wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
 
# 保存到文件
wc.to_file('wordcloud3.png')
 

3.词云样式以图片为型

# -*- coding: utf-8 -*-
from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
 
# 打开文本
text = open('xyj.txt').read()
 
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
 
# 生成对象
mask = np.array(Image.open("black_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
 
# 保存到文件
wc.to_file('wordcloud4.png')
 

4.从图片中取色


# -*- coding: utf-8 -*-
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
 
# 打开文本
text = open('xyj.txt').read()
 
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
 
# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)
 
# 从图片中生成颜色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
 
# 保存到文件
wc.to_file('wordcloud5.png')
 

5.调色

 from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import random
import jieba
 
# 打开文本
text = open('xyj.txt').read()
 
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
 
 
# 颜色函数
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))
    print(s)
    return s
 
# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(color_func=random_color, mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
 
# 保存到文件
wc.to_file('wordcloud6.png')
 

6.关键词权重设置


# -*- coding: utf-8 -*-
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba.analyse
 
# 打开文本
text = open('xyj.txt').read()
 
# 提取关键词和权重
freq = jieba.analyse.extract_tags(text, topK=200, withWeight=True)
print(freq[:20])
freq = {i[0]: i[1] for i in freq}
 
# 生成对象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate_from_frequencies(freq)
 
# 从图片中生成颜色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
 
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
 
# 保存到文件
wc.to_file('wordcloud7.png')
 

常见参数说明:

font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
width : int (default=400) //输出的画布宽度,默认为400像素 
height : int (default=200) //输出的画布高度,默认为200像素 
prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 ) 
mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。 
min_font_size : int (default=4) //显示的最小的字体大小 
font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。 
max_words : number (default=200) //要显示的词的最大个数 
stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS 
background_color : color value (default=”black”) //背景颜色,如background_color='white',背景颜色为白色。 
max_font_size : int or None (default=None) //显示的最大的字体大小 
mode : string (default=”RGB”) //当参数为“RGBA”并且background_color不为空时,背景为透明。 
relative_scaling : float (default=.5) //词频和字体大小的关联性 
color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_func 
regexp : string or None (optional) //使用正则表达式分隔输入的文本 
collocations : bool, default=True //是否包括两个词的搭配
colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。
fit_words(frequencies)  //根据词频生成词云
generate(text)  //根据文本生成词云
generate_from_frequencies(frequencies[, ...])   //根据词频生成词云
generate_from_text(text)    //根据文本生成词云
process_text(text)  //将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap])   //对现有输出重新着色。重新上色会比重新生成整个词云快很多。
to_array()  //转化为 numpy array
to_file(filename)   //输出到文件
 

点赞

1




登陆后方可评论