Python生成标签云/词云

原文地址:http://itdarcy.wang/index.php/20200104/355

python:3.7
功能模块:wordcloud 1.6.0、matplotlib 3.1.2

安装wordcloud

现在应该是能直接通过

pip install wordcloud

的方式安装了,如果不能安装可以从 这里 下载

在这里插入图片描述

选择的时候cp37表示python的版本是3.7,win_amd64表示64位,win32表示32位。然后通过

pip install wordcloud下载到本地后的全路径

比如:

pip install C:\Users\Administrator\Desktop\wordcloud-1.6.0-cp37-cp37m-win_amd64.whl

安装wordcloud。

一个最简单的实例

# 导入 wordcloud 模块和 matplotlib 模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 读入一个txt文件
text = open('articles.txt', 'r').read()

# 生成WordCloud对象并调用其中的generate()方法生成词云,其中传的参数为词的来源
wordcloud = WordCloud().generate(text)

# 显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

# to_file()用来保存词云的方法
wordcloud.to_file('test.jpg')

效果如下
在这里插入图片描述

自定义词列表、词频

将词表定义为字典的形式

text_dict = {
    'you': 2993,
    'and': 6625,
    'in': 2767,
    'was': 2525,
    'the': 7845,
}

将这个text_dict传入相应的构造词云的generate_from_frequencies()方法即可

WordCloud().generate_from_frequencies(text_dict)

完整代码如下

# 导入 wordcloud 模块和 matplotlib 模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 自定义词频字典
text_dict = {
    'you': 2993,
    'and': 6625,
    'in': 2767,
    'was': 2525,
    'the': 7845,
}

# 传入test_dict生成词表
wordcloud = WordCloud().generate_from_frequencies(text_dict)

# 显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

# 保存图片
wordcloud.to_file('test.jpg')

中文词云

1. 字体

中文的话需要自行指定字体,wordcloud这个模块中并没有封装中文字体。可以用系统的字体,字体的位置在 C:\Windows\Fonts
在这里插入图片描述

在字体上右击可以查看字体的名称
在这里插入图片描述
在生成wordcloud时通过 font_path = 'C:/Windows/Fonts/STKAITI.TTF' 属性指定字体位置,也可以自行下载字体样式,同样通过该属性指定其位置即可。

2. 分词

英文原生就是分好了词了的,就是空格。中文的句子中没有空格,需要通过其他的方式来分出词,jieba是一个用来做中文分词的模块。

text = open('4test.txt').read()
list_text = list(jieba.cut(text))

这样就从一篇文章中分出来了所有的词形成了一个词列表

一个完成的程序

import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
from collections import Counter

# 读入词来源文件
text = open('4test.txt',encoding='utf-8',errors='ignore').read()

# 使用 jieba 分词
text_jieba = list(jieba.cut(text))

# 使用 counter 做词频统计,选取出现频率前 100 的词汇
c = Counter(text_jieba)
common_c = c.most_common(100)

# 配置词云参数
wc = WordCloud(
    # 设置字体
    font_path = 'C:/Windows/Fonts/STKAITI.TTF'   
)
# 生成词云
wc.generate_from_frequencies(dict(common_c))
# 生成图片并显示
plt.figure()
plt.imshow(wc)
plt.axis('off')
plt.show()
# 保存图片
wc.to_file('test.jpg')

效果如下
在这里插入图片描述

可以看到它居然把标点符号也分出来了😂要去掉这些请看下面一节。

stopwords

stopwords(在有的教程中翻译成 停用词)的话就是一个词表,通过在生成wordcloud对象时通过stopwords属性来指定,指定了这个词表后词云中将不会再显示stopwords中的词,可以用这个表去掉一些无意义的词。

from wordcloud import STOPWORDS
wordcloud = WordCloud(stopwords=STOPWORDS).generate(text)

在cloudword模块中封装了一套sotpwords,这个概念应该是从自然语言处理的领域来的吧,自然语言处理要把文本生成词向量,但是能想象其中有些词对于处理目的是没有意义的,在英文中诸如the、on、in、at…在中文中如“的”、“呢”、“了”之类的,这些需要从词库中去掉。stopwords就是就是这么一套此列表,我们在构造wordcloud时去掉停用词也是可以理解的。cloudwrod模块提供的停用词是英文的,类型是set,print出来如下所示
在这里插入图片描述
我们也可以自行构造这样一个停用词列表,也可以在它的基础上追加自行一的词。

中文的话去网上也能找到类似的词表关键词:中文停用词,中文stopwords

增加分辨率

通过设置scale属性,值为float型,表示对图像放缩的倍数,默认值为1,指定比较高的值可以提高分辨率

WordCloud(scale=4).generate(text_dict).to_file('test.jpg')

通过其.to_file()的方法保存下来的才是高分辨率的图像,通过matplotlib.pyplot.imshow()不会发现分辨率的改变。

其他属性

还可以自定义词云图片的一些其他属性

查看它的源码可以发现其初始化函数中有如下一些属性。

def __init__(self, font_path=None, width=400, height=200, margin=2,
             ranks_only=None, prefer_horizontal=.9, mask=None, scale=1,
             color_func=None, max_words=200, min_font_size=4,
             stopwords=None, random_state=None, background_color='black',
             max_font_size=None, font_step=1, mode="RGB",
             relative_scaling='auto', regexp=None, collocations=True,
             colormap=None, normalize_plurals=True, contour_width=0,
             contour_color='black', repeat=False,
             include_numbers=False, min_word_length=0):
font_path=None,	# 自定义字体的位置
width=400, 		# 画布宽度
height=200, 	# 画布长度
margin=2,		# 边缘宽度,单位大概是像素
mask=None, 		# 指定图片蒙版对象,实现效果大概就是生成指定造型词云图像
scale=1,		# 放缩图像,数值指图像放大的倍数,比较高的值可以增加 分辨率
max_words=200, 	# 最多可以显示的词的数量
min_font_size=4,# 最小的字体字号
stopwords=None, # 停用词列表,即在词云中不显示哪些词
random_state=None			# int, or None,词的位置是随机生成的,如果指定一个定值,每次执行生成的词位置和颜色就是固定的。
background_color='black',	# 词云的背景颜色
max_font_size=None, 		# 最大的字体字号
font_step=1, 	# 大概是两个规格/等级的词的字号差
relative_scaling='auto'		# 字体大小与词频的相关度,默认是0.5,=0时按出现顺序显示大小,=1时词频比例设置字体比例

属性设置还可以参考 这里

还有

color_func这个属性可以配置生成的词云的颜色。

报错

在参考网上的教程制作词云的时候,大多数人用scipy.misc.imread读取图片,会产生如下的报错
在这里插入图片描述

原因是在比较新的版本中(我这里scipy版本为1.4.1,好像是在1.2的版本中imread就已经弃用),其中的imread已弃用,找了很多替换方案都无法解决,最终在 这里 找到了解决方案,采用的是其中的方案2,用 from matplotlib.pyplot import imread 代替之,另外经验证方案1、方案3在我的环境中无法解决问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BBJG_001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值