华数云图科创小分队

华数云图科创小分队

一、基本知识

Python 有很多可用于制作词云图的库,其中比较常用的有 wordcloudjieba

wordcloud 是一个用于生成词云图的 Python 库,其使用了 Python 的 PIL 库和 numpy 库。您可以使用 pip 命令来安装 wordcloud 库:

pip install wordcloud

jieba 则是一个中文文本处理库,可以用于中文分词,即将一段中文文本切割成一个个独立的词汇。您也可以使用 pip 命令来安装 jieba 库:

pip install jieba

下面我们来看一个简单的例子。首先,我们需要先读取文本文件,并将其内容进行分词处理。此处我们使用 jieba 库来进行分词。下面是代码:

import jieba

# 读取文本内容
file_path = 'sample.txt'
with open(file_path, 'r', encoding='utf-8') as f:
    text = f.read()

# 使用 jieba 库进行分词
seg_list = jieba.cut(text)
words = ' '.join(seg_list)

# 打印分词结果
print(words)

然后,我们使用 wordcloud 库来生成词云图,并将分词结果传入 WordCloud 对象。下面是代码:

from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt

# 创建 WordCloud 对象
wc = WordCloud(background_color='white', stopwords=STOPWORDS,
               font_path='msyh.ttc', width=800, height=600)

# 生成词云图
wc.generate(words)

# 显示词云图
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

在这个例子中,我们使用了 msyh.ttc 字体来显示中文字符,可以根据您的需要选择其他字体。同时使用了 STOPWORDS 来过滤常见的无意义词汇。WordCloud 对象还可以接收一些其他参数,例如 max_font_sizemin_font_size 等等,以调整词语的字体大小。

二、案例

从以下三部小说中挑选一部,给出人物出现的频率统计以及对应的词云图。要求:减少跟任务无关的介词、动词等关键词,需要根据词云图看出人物出场频率。

分别是西游记、三国演义、红楼梦

import os
import re
from collections import Counter
import jieba
from wordcloud import WordCloud

# 读取文件内容
file_path = '红楼梦.txt'
if os.path.exists(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
else:
    print(f'文件 "{file_path}" 不存在!')
    text = ''

# 使用正则表达式去除所有非汉字字符和空白字符
text = re.sub(r'[^\u4e00-\u9fa5]', '', text)

# 使用 jieba 进行分词
seg_list = jieba.cut(text)
words = [word for word in seg_list if len(word) >= 2 and word not in ('他们', '一个', '自己', '没有', '什么', '那些', '就是', '还有', '已经')]

# 使用 Counter 统计每个词出现的次数,并只保留出现频率最高的前 50 个词
word_counts = Counter(words)
top_n = 50
words_top_n = word_counts.most_common(top_n)

# 打印前 top_n 个出现频率最高的词
for i, (word, count) in enumerate(words_top_n):
    print(f'第 {i+1} 高频词:{word}, 出现次数:{count}')

# 指定字体为宋体
# font_path = 'SimSun.ttf'
font_path = 'C:\\Windows\\Fonts\\simsun.ttc'  # Windows 系统下的宋体字体路径
wc = WordCloud(font_path=font_path, width=800, height=600, background_color='white',
               max_words=200, colormap='Dark2', contour_width=1, contour_color='black',
               stopwords={}, min_font_size=10, max_font_size=80)

# 生成词云图
wc.generate_from_frequencies(word_counts)

# 显示词云图
import matplotlib.pyplot as plt
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

结果:

Python词云图的制作与案例分享-LMLPHP

 三、可能出现的报错

运行结果中可能会出现以下问题:

针对不同的问题,可以采取相应的解决方法。

四、一些常见词云图的模板

4.1读取txt文件中的内容生成词云图

以下是基于 Python 生成词云图的示例代码:

import os
from wordcloud import WordCloud

# 读取文件内容
file_path = 'your.file.txt'
if os.path.exists(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
else:
    print(f'文件 "{file_path}" 不存在!')
    text = ''

# 创建词云对象
wc = WordCloud(background_color='white', max_words=200, font_path='simhei.ttf')

# 生成词云图
wc.generate(text)

# 显示词云图
import matplotlib.pyplot as plt
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

以上示例代码中,可以通过修改文件路径、背景颜色、生成的最大单词数、字体等参数以及调用 Matplotlib 库来自定义生成的词云图。其中,WordCloud 类提供了丰富的选项来生成高度定制化的词云图,例如可以通过 stopwords 参数指定需要过滤掉的单词列表,也可以通过 colormap 参数指定颜色方案,并可以通过 to_file 方法将词云图保存到文件中。这样我们就可以将学校主页上《学校简介》做成漂亮的词云图。

4.2读取txt文件中的内容生成词云图并安装要求指定形状

基于 Python 生成指定形状词云图的示例代码,以心形为例:

import os
from PIL import Image
import numpy as np
from wordcloud import WordCloud, ImageColorGenerator

# 读取文本文件内容
file_path = 'path/to/your/file.txt'
if os.path.exists(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
else:
    print(f'文件 "{file_path}" 不存在!')
    text = ''

# 加载形状图片并转换为数组
pic_path = 'path/to/your/shape.png'
if os.path.exists(pic_path):
    image = Image.open(pic_path)
    mask = np.array(image)
else:
    print(f'文件 "{pic_path}" 不存在!')
    mask = None

# 创建词云对象
wc = WordCloud(background_color='white', max_words=200, font_path='simhei.ttf', mask=mask)

# 根据文本和形状生成颜色
wc.generate(text)
image_colors = ImageColorGenerator(mask)

# 绘制词云图并显示
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12,6))
axes[0].imshow(wc, interpolation='bilinear')
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation='bilinear')
for ax in axes:
    ax.set_axis_off()
plt.tight_layout()
plt.show()

以上示例代码中,PIL 库用于加载形状图片,并将其转换为 NumPy 数组;WordCloud 类的 mask 参数用于指定形状;ImageColorGenerator 类则根据形状图像生成词云的颜色方案。

需要注意的是,指定形状可能会导致词云图中出现很多空白区域,因此一般要使用 recolor 方法将图像重新着色,以填充空白区域。此外还可以通过调整 min_font_sizemax_font_size 参数来控制单词大小,以便更好地适应形状。

04-28 20:22