python词云生成库-wordcloud

WordCloud 是一个用于生成词云的 Python 库,它可以根据提供的文本数据创建出美观的视觉化图像,其中文本的大小和频率成比例。同时也提供了丰富的绘制功能, 可以结合 matplotlib 库进行复杂的操作
关键的方法就是WordCloud方法

一、模块介绍

导入模块

from wordcloud import WordCloud

该类的定义如下:

def __init__(self, font_path=None, width=400, height=200, margin=2,
             ranks_only=None, prefer_horizontal=.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: 字符串, 词云中字体格式文件的路径
用于字体的字体路径(OTF或TTF)。默认为Linux机器上的DroidSansMono路径。如果你在其他操作系统上或没有这个字体,你需要调整这个路径。
width: 整数,默认=400, 画布的宽度。
height: 整数,默认=200, 画布的高度。
prefer_horizontal: 浮点数,默认=0.90
尝试水平适应相对于垂直适应的比例。如果 prefer_horizontal < 1,算法会在单词不适应时尝试旋转单词。(目前没有内置方法仅获取垂直单词。)
mask: 数组或None,默认=None
如果不为None,给出在何处绘制单词的二进制掩模。如果mask不为None,将忽略width和height,并使用mask的形状。所有白色(#FF或#FFFFFF)条目将被视为“屏蔽”,而其他条目则可以自由绘制。
contour_width: 浮点数,默认=0
如果mask不为None且contour_width > 0,绘制掩模轮廓。
contour_color: 颜色值,默认="black", 掩模轮廓颜色。
scale: 浮点数,默认=1
计算与绘制之间的缩放。对于大的词云图像,使用scale而不是更大的画布尺寸会显著更快,但可能导致单词的拟合更粗糙。
min_font_size: 整数,默认=4, 使用的最小字体大小。当这个大小没有更多空间时停止。
font_step: 整数,默认=1, 字体的步长。font_step > 1可能会加速计算,但可能给出较差的拟合。
max_words: 数量,默认=200, 最大单词数。
stopwords: 字符串集合或None
将被消除的单词。如果为None,将使用内置的STOPWORDS列表。如果使用generate_from_frequencies,则忽略。
background_color: 颜色值,默认="black", 词云图像的背景颜色。
max_font_size: 整数或None,默认=None
最大单词的最大字体大小。如果为None,则使用图像的高度。
mode: 字符串,默认="RGB"
当mode为"RGBA"且background_color为None时,将生成透明背景。
relative_scaling: 浮点数,默认='auto'
单词相对频率对字体大小的重要性。如果relative_scaling=0,只考虑单词排名。如果relative_scaling=1,频率是两倍的单词将有两倍的大小。如果你想同时考虑单词频率和不仅仅它们的排名,relative_scaling大约0.5通常看起来不错。如果为'auto',则除非repeat为真,否则设置为0.5,此时设置为0。版本更新:: 2.0默认现在是'auto'。
color_func: 可调用,默认=None
有参数word, font_size, position, orientation, font_path, random_state的可调用函数,为每个单词返回一个PIL颜色。覆盖"colormap"。有关指定matplotlib色谱的信息,请参见colormap。要创建单色的词云,使用
color_func=lambda *args, **kwargs: "white"。单色也可以使用RGB代码指定。例如,
color_func=lambda *args, **kwargs: (255,0,0)设置颜色为红色。
regexp: 字符串或None(可选)
在process_text中分割输入文本为标记的正则表达式。如果指定为None,则使用r"\w[\w']+"。如果使用generate_from_frequencies,则忽略。
collocations: 布尔,默认=True
是否包括两个单词的搭配(二元组)。如果使用generate_from_frequencies,则忽略。
colormap: 字符串或matplotlib色谱,默认="viridis"
从每个单词随机抽取颜色的matplotlib色谱。如果指定了"color_func",则忽略。
normalize_plurals: 布尔,默认=True
是否去除单词末尾的's'。如果为True,一个单词以's'结尾和不以's'结尾都出现时,去掉以's'结尾的单词并将它的计数加到没有's'结尾的版本上——除非单词以'ss'结尾。如果使用generate_from_frequencies,则忽略。
repeat: 布尔,默认=False
是否重复单词和短语直到达到max_words或min_font_size。
include_numbers: 布尔,默认=False, 是否将数字作为短语包含进来。
min_word_length: 整数,默认=0, 单词必须有的最少字母数才能被包含。
collocation_threshold: 整数,默认=30
大二元组必须具有高于此参数的Dunning似然性搭配分数才能被计为大二元组。默认值30是任意的。

属性
words_: 字符串到浮点数的字典, 关联频率的单词令牌。2.0后words_ 是一个字典
layout_: 元组列表((字符串, 浮点数), 整数, (整数, 整数), 整数, 颜色)
编码拟合的词云。对于每个单词,它编码字符串、规范化频率、字体大小、位置、方向和颜色。频率由最常出现的单词归一化。颜色格式为'rgb(R, G, B)'

二、WordCloud常用的方法

1. generate(self, text)

接收一个字符串作为输入,计算文本中各单词的频率,并生成相应的词云。这是最基础也是最常用的方法之一。

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 示例文本
text = "This is a simple example showing how to generate a word cloud using the generate method. Generate method uses the input text directly."

# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=800, max_words=100, background_color='white').generate(text)

# 显示词云
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

在这里插入图片描述

2. generate_from_frequencies(frequencies)

直接接收一个字典,其中键是单词,值是该单词的频率,用来生成词云。这适用于已经计算好词频的情况。

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 示例文本
dic = {'This': 120, 'example': 90, 'showing': 80, 'word': 70, 'cloud': 60, 'Generate': 50, 'method': 40, 'text': 30, 'input': 20, 'directly': 10}
# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=800, max_words=100, background_color='white').generate_from_frequencies(dic)

# 显示词云
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

在这里插入图片描述

3. fit_words(frequencies)

这个方法接收一个字典,其中键是单词,值是对应的频率,然后根据这些频率生成词云。类似于generate_from_frequencies

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 示例文本
dic = {'This': 120, 'example': 90, 'showing': 80, 'word': 70, 'cloud': 60, 'Generate': 50, 'method': 40, 'text': 30, 'input': 20, 'directly': 10}
# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=800, max_words=100, background_color='white').fit_words(dic)

# 显示词云
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

在这里插入图片描述

4. generate_from_text(text)

接收一个字符串作为输入,计算文本中各单词的频率,并生成相应的词云。类似于generate。

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 示例文本
text = "This is a simple example showing how to generate a word cloud using the generate method. Generate method uses the input text directly."# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=800, max_words=100, background_color='white').generate_from_text(text)

# 显示词云
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

在这里插入图片描述

三、进阶技巧

1. 设置蒙版

蒙版设置, 设置蒙版之后, 词云的形状就会显示为设置的蒙版形状

from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

mask_image = np.array(Image.open('./static/img.png'))

# 示例文本
text = "This is a simple example showing how to generate a word cloud using the generate method. Generate method uses the input text directly."# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=800, mask=mask_image, max_words=100, background_color='white')

wordcloud.generate_from_text(text)

# 显示词云
plt.figure(figsize=(8, 8), facecolor=None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

在这里插入图片描述

2. 设置过滤词

对于一些不希望出现的词, 可以通过设置stopword过滤, 实现方法有两种

  1. 在切词阶段, 将过滤词剔除, 过滤词要求是一个集合{}
  2. 在生成词云阶段, 使用stopword参数添加过滤词数组, 注意, 此时如果通过generate_from_frequencies方法生成, 此参数则忽略
    方式一:
stop_words = {'?', ',', '有', '其', '非常', '的', '为', '所', ':', '和', '”', "'", '\\u3000', '乎', '?', '这', '不', '在', '比', '“', '"', '而', '很', '被', '我', '那'}
datas = [... ...]  # 词云数据
cloud_data = []
for data in datas:
    qdatas = jieba.lcut(data)
    qdata_filter = [word for word in qdatas if word not in excludes]
    cloud_data.extend(qdata_filter)


wordcloud = WordCloud(
    font_path='./static/msyh.ttc',
    background_color='white',
    colormap='magma',
    max_font_size=40,
    random_state=42,
    max_words=300,
    # 宽
    width=1000,
    # 高
    height=880,
    mask = mask_image
).generate(' '.join(cloud_data))

方式二:

stop_words = {'?', ',', '有', '其', '非常', '的', '为', '所', ':', '和', '”', "'", '\\u3000', '乎', '?', '这', '不', '在', '比', '“', '"', '而', '很', '被', '我', '那'}
datas = [... ...]  # 词云数据

wordcloud = WordCloud(
    font_path='./static/msyh.ttc',
    background_color='white',
    colormap='magma',
    max_font_size=40,
    random_state=42,
    max_words=300,
    # 宽
    width=1000,
    # 高
    height=880,
    mask = mask_image,
    -- 设置过滤词
    stopwords=stop_words
).generate(datas)

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 12:02:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 12:02:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 12:02:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 12:02:05       18 阅读

热门阅读

  1. Spring Boot 开发 -- swagger3.0 集成

    2024-06-07 12:02:05       6 阅读
  2. RFFE:射频前端(Radio Frequency Front-End,RFFE)

    2024-06-07 12:02:05       8 阅读
  3. 供应链经理面试题

    2024-06-07 12:02:05       5 阅读
  4. Web前端ES6-ES13笔记合集

    2024-06-07 12:02:05       9 阅读
  5. mongodb集群

    2024-06-07 12:02:05       6 阅读
  6. MongoDB $rename 给字段一次重新命名的机会

    2024-06-07 12:02:05       9 阅读
  7. docker-compose部署Redis6.0

    2024-06-07 12:02:05       6 阅读
  8. Spark read load Parquet Files

    2024-06-07 12:02:05       8 阅读
  9. 悉数六大设计原则

    2024-06-07 12:02:05       9 阅读