一、基本知识
Python 有很多可用于制作词云图的库,其中比较常用的有 wordcloud
和 jieba
。
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_size
、min_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()
结果:
三、可能出现的报错
运行结果中可能会出现以下问题:
针对不同的问题,可以采取相应的解决方法。
四、一些常见词云图的模板
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_size
和 max_font_size
参数来控制单词大小,以便更好地适应形状。