Python:wordcloud

wordcloud官方文档

1、简介

wordcloud是优秀的词云展示的第三方库

2、导入模块

import wordcloud

3、wordcloud对象初始化

以下参数值均为官方文档给出的默认值

复制代码
w=wordcloud.WordCloud(
    font_path=None,
    width=400,
    height=200,
    margin=2,
    ranks_only=None,
    prefer_horizontal=0.9,
    mask=None,
    scale=1,
    color_func=None,
    max_words=200,
    min_font_size=4,
    stopwords=None,
    random_state=None,
    background_color='black',
    max_font_size=None,
    font_step=1,
    mode='RGB',
    relative_scaling='auto',
    regexp=None,
    collocations=True,
    colormap=None,
    normalize_plurals=True,
    contour_width=0,
    contour_color='black',
    repeat=False,
    include_numbers=False,
    min_word_length=0,
    collocation_threshold=30
)
复制代码

参数含义:

参数

类型

默认值

说明

font_path string   字体文件路径,如果是中文词云,则该路径必须指向一个中文字体,否则会出错
width int 400 画布宽度
height int 200 画布高度
margin int 2 离画布边缘的距离
prefer_horizontal float 0.9 水平展示词语与垂直展示词语的数量比
mask

nd-array 或None

None 蒙版;如果给出了mask,那么width与height将不起作用,而是代之以mask——词云将生成于mask区域内;mask以外背景部分将填充以纯白色。
contour_width float 0 启用mask时,该项表示mask的轮廓线宽度
contour_color color value 'black' mask轮廓线的颜色
scale float 1 程序运行过程中,用于绘图和计算的时间比。对于大型词云,使用scale会明显更快,但会导致更粗糙的文字图形。更大的scale会有更精细文字图形,因为有更多的时间去参与绘图。
min_font_size int 4 最小的字体大小。当图形中没有更多的空间可以容纳最小字体时,程序运行完毕。
font_step int 1 不同等级间文字大小的差异。大于1时,程序运行速度加快,但结果图不太好看
max_words number 200 词云中的最大词语数
stopwords

string list

None

None

一个停用词表,停用词表中的词将不会用于词云构建。当使用generate_from_frequencies()时该参数将会被忽略

random_state

数字

None

随机数种子,同一个种子对应的随机数序列相同

background_color color value 'black' 背景色
max_font_size

int

None

None 最大词的尺寸。如果设置为None,将自动设置为图形高度
mode string 'RGB' 如果设置为'RGBA',并且background_color设置为None时,将采用透明的背景
relative-scaling

float

'auto'

词频对词云中词语大小的重要性。取0时,大小仅与词语等级有关;取1时,如果某词语的词频是另一词语的两倍,那它在词云中的大小也是该词语的两倍。

如果想综合考虑词频与词语等级,0.5附近不错。

默认为'auto'即0.5。

repeat参数为True时,该项将被设置为0

color_func callable None callable对象,表示为每个单词设置一个PIL color,详见官网
regexp

string

None

None

用于分割输入文本的正则表达式,格式为r'表达式';如果设置为None,将采用r'\w[\w']+'

当使用generate_from_frequencies()时,该参数会被忽略

collocations

bool

True

是否包含双单词词语(bigram)(针对英文);

当使用generate_from_frequencies()时,该参数会被忽略

colormap

string

matplotlib colormap

'viridis'

一个Matplotlib颜色表,在词云中绘制时将为每个词语随机取该表中的颜色;

当指定了color_func参数时,该参数会被忽略

normalize_plurals bool True

是否移除复数单词而把它的词频计入其单数形式中。

当使用generate_from_frequencies()时,该参数会被忽略

repeat bool False 当max_words或min_foont_size达到时,是否重复某些单词以填充剩余空白
include_numbers bool False 是否包含数字
min_word_length int 0 一个词语最少包含的字母数
collation_threshold int 30 双单词词语(bigrams)被认为是一个正确英文词语的阈值标准,具体见官网

补充:

1、画布越大,程序越慢。如果想快速获得大的词云,有两种方法:a、设置小的画布;b、使用scale参数

2、构建词云时,词语等级比词频的权重更大,二者的比重可以通过参数relative_scaling修改,当然默认参数'auto'就已经很好了(至于什么是词语等级,笔者也不清楚,可能是英文专有的某个等级吧,希望有明白的人可以帮我解答一下)

3、处理中文文本时,font_path必须指向一个中文文字的ttf文件,例如

font_path='C:/Windows/Fonts/simhei.ttf'

否则原方法将会识别不了中文

4、参数mask为,从外部通过scipy.misc.imread( filename )读入的png文件,例如:

from scipy.misc import imread
M=imread('picture.png')
w=wordcloud.WordCloud(mask=M)

 

4、方法

w=wordcloud.WordCloud(...)
w.func()

这里的func可以是以下方法:

方法 说明
fit_words(frequencies) {词语:词频}dict对象生成词云
generate_from_frequencies(frequencies) 同上
generate(text) 文本数据(string类型)生成词云
generate_from_text(text) 同上
process_text(text) 将一个长文本划分为词语,消除其中的停用词
recolor([random_state , color_func , colormap]) 重新设置颜色模式
to_array() 将词云转化为一个数字数组
to_file(filename) 输出为image文件(文件类型为filename的后缀)
to_svg([embed_font , optimize_embedded_font,...]) 输出为SVG文件

补充:

1、在用文本数据生成词云时,由于中英文差异——英文一个单词就表示一个词语,中文词语还需要根据语境识别,所以制作中文词云时,必须先用jieba库进行词性划分(详见:jieba:统计一篇文章中词语数 - ShineLe - 博客园),然后以空格形式将这些词语连接起来,使其具有与英文词语一样的形式(英文词语都是以空格分开),之后再使用generate(text)generate_from_text(text)方法提取时才不会出错。否则直接读取一篇正常的中文文章并用上述两种方法,一定会出错的!

代码:使用jieba库对中文文章进行词性划分,并用空格连接

复制代码
import jieba
import re

def clean(line):
    pattern = re.compile(u'[^\u4e00-\u9fa5]')
    line = re.sub(pattern,'',line)
    return line

with open('《边城》.txt' , 'r' , encoding='utf-8') as f:
    s=f.read() #读取原文本
    s=clean(s) #删除其中符号、数字等非中文字符
    words=jieba.lcut(s)
    ch2eng=' '.join(words) #用空格连接中文词语,构成一个完整的字符串
复制代码

2、如果已经有词语词频数据,可以通过方法fit_words(frequencies)、generate_from_frequencies(frequencies)构建词云,这里的frequenciesdict对象Counter对象,数据组织形式为{ '词语1':词频 , '词语2':词频 , ...},例如

{ '翠翠':439 , '祖父':270 , ...},这种数据可以通过collections.Counter()得到(具体方法见:Python:计数器collections.Counter - ShineLe - 博客园 和  jieba:统计一篇文章中词语数 - ShineLe - 博客园 第七部分例子①)。需要注意的是,Counter()的返回值是Counter类型,并不是dict类型,虽然二者很像。

把Counter类型转换为Dict的方法是

    result_Counter=Counter(wordlist)
    result_list = sorted(result_Counter.items(), key=lambda item: item[1], reverse=True)
    result_dict = dict(result_list)

先用sorted()函数进行排序,得到排序后的list类型,再用dict()将list转化为dict类型

5、显示

    plt.imshow(w) #w为wordcloud对象
    plt.axis('off')
    plt.show()

6、保存

w.to_file('cloud.png')

其他:Python数据可视化 -- Wordcloud - MAU - 博客园

(7条消息) 用python实现词频分析+词云_丨小小花丨的博客-CSDN博客_python词云分析

posted @   ShineLe  阅读(629)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示