制作文章词云

制作文章词云
惯例,首先po上需要用到的工具的github链接吧:

  1. 链接:word_cloud
    介绍:A little word cloud generator in Python. Read more about it on the blog post or the website. The code is Python 2, but Python 3 compatible.

  2. 链接:jieba
    介绍:“结巴”中文分词:做最好的 Python 中文分词组件

代码展示

人生苦短,先po代码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# encoding=utf-8

import re
import matplotlib.pyplot as plt
from scipy.misc import imread
import jieba.analyse
from wordcloud import WordCloud

# 读入背景图片
bg_pic = imread('mask.jpg')

# 读取一个txt文件
blog_path = r'../_posts/添加一个萌物.md' # 这里需要注意,要填入你自己对应博文的路径
text_source = ''
with open(blog_path, 'r', encoding='utf8') as f:
text_source = f.read()

word_freq = dict(jieba.analyse.extract_tags(text_source, topK=100, withWeight=True))
# 这里是计算词语的出现频率的,后面会讲解一下参数

wc = WordCloud(
background_color='black', # 背景底色
mask=bg_pic, # 设置背景图
max_words=2000, # 设置最大显示的字数
font_path=r"C:\Windows\Fonts\AdobeHeitiStd-Regular.otf",
# 设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文)
max_font_size=200, # 设置字体最大值
random_state=50, # 设置有多少种随机生成状态,即有多少种配色方案
)
myword = wc.generate_from_frequencies(word_freq) #生成词云

#展示词云图
# plt.imshow(myword,interpolation='bilinear')
# plt.axis("off")
# plt.show()

# 提取文件名
pattern = re.compile(r'(\w+).md')
out_img = re.search(pattern, blog_path).group(1)
# 导出图片
wc.to_file('{}.jpg'.format(out_img))

代码讲解

分两个部分:

jieba:

先看这段代码:

1
word_freq = dict(jieba.analyse.extract_tags(text_source, topK=100, withWeight=True))

重点在jieba.analyse.extract_tags这个方法,里面有3个参数:

  1. text_source:原始博文的字符数据
  2. topK:这个指的是出现最多的100个关键字,你可以调节这个数值
  3. withWeight:这个是让数据返回时带上对应的频率值,也是这个代码中的一个关键点。

由于返回的数据是一个list,而词云的方法generate_from_frequencies接收的是一个dict,所以最后把它转化为一个字典。

WordCloud:

这里我们只要注意WordCloud这个类初始化时要填入的参数:

1
2
3
4
5
6
7
8
9
wc = WordCloud(
background_color='black', # 背景底色
mask=bg_pic, # 设置背景图
max_words=2000, # 设置最大显示的字数
font_path=r"C:\Windows\Fonts\AdobeHeitiStd-Regular.otf",
# 设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文)
max_font_size=200, # 设置字体最大值
random_state=50, # 设置有多少种随机生成状态,即有多少种配色方案
)

每个参数后面都加上了注释,使用技巧上是,可以修改background_colormax_font_sizerandom_state这几个参数来调整图片显示的效果。

font_path这里我用的是我电脑上的字体路径

bg_pic这里我是使用了from scipy.misc import imreadscip中的imread方法,把图片以数据的形式读入,这样就可以把要展示的文字以图片轮廓的形式展现出来。

输出/展示

1
2
3
4
5
6
7
8
9
10
11
#展示词云图
# plt.imshow(myword,interpolation='bilinear')
# plt.axis("off")
# plt.show()

# 提取文件名
pattern = re.compile(r'(\w+).md')
out_img = re.search(pattern, blog_path).group(1)

# 导出图片
wc.to_file('{}.jpg'.format(out_img))

我们可以展示词云,也可以导出到文件,中间我还用正则把博文的文件名提取出来作为词云图的文件名。

最后,一张自定义关于博文的词云图就生成在了代码的本地目录了。

词云图嵌入到博文中

查看了Next的官网,看到了一个内置标签,找到突破容器宽度限制的图片这个标签的使用

1
2
3
4
5
6
7
8
9
<!-- HTML方式: 直接在 Markdown 文件中编写 HTML 来调用 -->
<!-- 其中 class="full-image" 是必须的 -->
<img src="/image-url" class="full-image" />

<!-- 标签 方式,要求版本在0.4.5或以上 -->
{% fullimage /image-url, alt, title %}

<!-- 别名 -->
{% fi /image-url, alt, title %}

使用以下:

1
{% fi /image-url, alt, title %}

只要设置/image-url改为图片的路径。
我的所有图片放到了Hexo\source\uploads这个文件夹内的。
而Next的主题是有把uploads这个文件路径放到环境变量中的
只要写如:/uploads/<filename>.jpg路径就可以了。


最后,一幅自定义的词云图就可以展示在你的博客里咯,
这个技能你get√到了吗? 赶紧用起来吧!

0%