用Python去构建《天龙八部》小说人物的词云图

2018-03-10 14:38:41 Python 阅读 (5933) 评论(0)

上一篇博客用Python去分析《天龙八部》中谁是真正的猪脚说到用jieba库去分析小说中各个人物的出场次数,现在做一下进阶,利用分词后的结果去构建该小说的词云图。

一. 准备工作

   下载安装wordcloud库

   (1)pip安装

pip install wordcloud

   如果pip安装失败,可以采用第二种安装方式

   (2)下载whl文件安装

    去这个网站Pyhton扩展库下载wordcloud的whl文件(ctrl+F搜索“wordcloud”),记得要下载对应安装python版本的。

    然后还是通过pip命令安装,后面那个路径是你下载后的whl文件所在路径

blob.png


二. 代码分析

   (1).先上完整代码

import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt     # 数学绘图库
import jieba               # 分词库
from wordcloud import WordCloud  # 词云库

filename = "天龙八部精校版.txt"
txt = open(filename, "r", encoding="gb2312", errors="ignore").read()
words = jieba.cut(txt)
result = "/".join(words)  # 只有用"/"或" "等分割开的,才能用于构建词云图
# 常用的非人名的字词
no_name = ["说道", "出来", "如何", "跟着", "之后", "当真", "说话", "这里", "爹爹", "可是", "起来", "你们", "身上","两人","还是","这些","不会","自己","内力","怎么","南海","身子","脸上","原来","这么","弟子","众人", "这个","便是","倘若","突然","只是","不敢","他们","我们","见到","声音","心想","如此","只见","之中","不能","一个", "知道", "什么", "武功", "不是", "甚么", "一声", "咱们", "师父", "心中", "不知"]
# wordcloud配置
wc = WordCloud(
    font_path="C:\Windows\Fonts\msyhbd.ttc",  # 设置字体
    background_color='white',  # 背景颜色
    width=800, height=600,  # 设置宽高
    max_font_size=70, min_font_size=10,  # 字体最大/最小值
    stopwords=no_name,  # 设置停用词,不在词云图中显示
    max_words=2000,  # 设置最多显示的字数
    mode='RGBA'
)
wc.generate(result)
# 保存图片的名字
img_name = filename[:filename.rfind("."):] + "_词云图" + ".png"
# 生成图片
wc.to_file(img_name)
# 4、显示图片
plt.figure("词云图")  # 指定所绘图名称
plt.imshow(wc)       # 以图片的形式显示词云
plt.axis("off")      # 关闭图像坐标系
plt.show()

    (2)代码分析

      a)在导包的时候,容易出错,就是下图这个报错。

blob.png

         百度研究了很久,找到了解决办法,需要在导matplotlib.pyplot包前写上这两句import matplotlib as mpl         mpl.use("Agg"),但是具体原因还不清楚

import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt     # 数学绘图库

      b)wordcloud配置&生成

# wordcloud配置
wc = WordCloud(
    font_path="C:\Windows\Fonts\msyhbd.ttc", #设置字体,不设置的话,无法显示中文,这里调用windows系统内的字体文件
    background_color='white',  # 背景颜色
    width=800, height=600,  # 设置宽高
    max_font_size=70, min_font_size=10,  # 字体最大/最小值
    stopwords=no_name,  # 设置停用词,不在词云图中显示
    max_words=2000,  # 设置最多显示的字数
    mode='RGBA'
)
wc.generate(result)
# 保存图片的名字
img_name = filename[:filename.rfind("."):] + "_词云图" + ".png"
# 生成图片
wc.to_file(img_name)

    c)效果图

天龙八部精校版_词云图.png

三.进阶篇——设置自定义背景图片

    直接上代码

import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt     # 数学绘图库
from PIL import Image
import numpy as np
import jieba               # 分词库
from wordcloud import WordCloud, ImageColorGenerator  # 词云库

filename = "天龙八部精校版.txt"
txt = open(filename, "r", encoding="gb2312", errors="ignore").read()
words = jieba.cut(txt)
result = "/".join(words)  # 只有用"/"或" "等分割开的,才能用于构建词云图
# 常用的非人名的字词
no_name = ["说道", "出来", "如何", "跟着", "之后", "当真", "说话", "这里", "爹爹", "可是", "起来", "你们", "身上","两人","还是","这些","不会","自己","内力","怎么","南海","身子","脸上","原来","这么","弟子","众人", "这个","便是","倘若","突然","只是","不敢","他们","我们","见到","声音","心想","如此","只见","之中","不能","一个", "知道", "什么", "武功", "不是", "甚么", "一声", "咱们", "师父", "心中", "不知"]

# 初始化自定义背景图片
bg_img = "img6.jpg"
image = Image.open(bg_img)
graph = np.array(image)

# wordcloud配置
wc = WordCloud(
    font_path="C:\Windows\Fonts\msyhbd.ttc",  # 设置字体
    background_color='white',  # 背景颜色
    width=image.size[0],  # 设置宽,我这里设置和背景图片宽一样
    height=image.size[1],  # 设置高,我这里设置和背景图片高一样
    max_font_size=70, min_font_size=10,  # 字体最大/最小值
    stopwords=no_name,  # 设置停用词,不在词云图中显示
    max_words=2000,  # 设置最大显示的字数
    mode='RGBA'
)
wc.generate(result)

# 绘制文字的颜色以背景图颜色为参考
image_color = ImageColorGenerator(graph)  # 从背景图片生成颜色值
wc.recolor(color_func=image_color)
# 保存图片的名字
img_name = filename[:filename.rfind("."):] + "_词云图" + ".png"
# 生成图片
wc.to_file(img_name)
# 4、显示图片
plt.figure("词云图")  # 指定所绘图名称
plt.imshow(wc)       # 以图片的形式显示词云
plt.axis("off")      # 关闭图像坐标系
plt.show()

与无背景图片相比,需要导入图片处理的包。

其中,

# 绘制文字的颜色以背景图颜色为参考
image_color = ImageColorGenerator(graph)  # 从背景图片生成颜色值
wc.recolor(color_func=image_color)

这两行代码意思是从背景图片中提取颜色值作为词云图的颜色值,所以想要词云图有有些特殊图案的话,需要准备相应的背景图。

我这里背景图片:

img6.jpg

效果图:

天龙八部精校版_词云图.png

怎么样,是不是很神奇?


评论