一、基本知识
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()
结果:
三、可能出现的报错
运行结果中可能会出现以下问题:
缺少文件错误: 如果指定的文本文件不存在,则会在控制台中输出“文件不存在”等提示信息,应该检查实际的文件路径是否正确。
编码错误: 如果读取的文本文件的编码不是 UTF-8,则可能会出现编码错误,此时程序无法正确地处理文本内容,需要指定正确的编码格式。
分词错误: 使用 Jieba 库进行中文分词时,可能会有一些无意义的词被保留下来影响词频统计和词云图生成效果,这时可以手动添加停止词列表,将无意义的词排除在外。还有一种情况是分词结果不准确,如将一个人名分成了两个词,需要手动处理。
字体错误: 如果在生成词云图时无法加载指定的字体文件,则可能会出现“cannot open resource”等错误,此时可以尝试更换字体文件或者重新安装 PIL 库。
显示问题: 在生成词云图后,可能会出现词云图显示过小或者过大、无法显示等问题,此时可以调整 WordCloud 类的参数,如
width
和height
来设置词云图的大小。
针对不同的问题,可以采取相应的解决方法。
四、一些常见词云图的模板
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
参数来控制单词大小,以便更好地适应形状。