大家肯定都看过词云,也就是提取一段文字中的关键字,并将其根据出现的频率有大小不同的分类按照图片的方式展示出来,如下:
那么我们要怎么实现呢,其中,python就有一个叫wordcloud的模块可以简单实现:
首先,我们需要安装wordcloud, pip安装如下
pip install wordcloud
wordcloud有如下的属性(部分,这段代码需要的部分):
scale #画布放大倍数,也就是清晰度,值越大对应输出的文件也就越清晰
font_path #设置字体样式
background_color #设置背景的颜色
max_words #词云所能展示的最大词数
mask #词云所形成的形状
max_font_size #字体的最大值
width,height,margin #画布的宽高和边框
如果只是要简单的词云只需要将文字文件读入或者自己定一个带有文字的字符串就可以生成输出啦
text = '#自定义一个字符串#'
wdcloud = WordCloud(scale = 4,
font_path = '',#存放字体路径
background_color = 'white',
max_words = 50,
max_font_size = 10,
width = 100, height = 100, margin = 1)
matplotlib.pyplot.imshow(wdcloud.generate(text))#生成并输出词云
这样一来,简单的词云就已经可以生成啦,只有三行,是不是很简单?
虽然我也不知道为什么要叫结巴,但是真的好用啊,首先先要下载jieba模块:老样子,使用前要import
pip install jieba
然后是对自己需要的自定义单词的添加,以免需要的词被分割了
def add_word(words):
for word in words:
jieba.add_word(word)
add_word(my_words_list)
然后就是使用jieba对文字进行清洗,去掉无关词(例如:你,我,啊之类没有意义的单词)
实现如下:
def jiebaClearText(text):#清洗单词,去掉无关词
mywordlist = []#存放洗净后的单词
string = ""#返回洗净后的字符串
seg_list = jieba.cut(text,cut_all = False)#分割句子
liststr = "/ ".join(seg_list)#'/'后是有空格的,用于wordcloud分词,也用于稍后的单词分割
f_stop = open(stopwords_path, encoding = 'utf-8')#单词停用表
try:
f_stop_text = f_stop.read()
finally:
f_stop.close()
f_stop_list = f_stop_text.split('\n')
for myword in liststr.split('/'):
if not(myword.strip() in f_stop_list) and len(myword.strip()) > 1:
mywordlist.append(myword)
for item in mywordlist:
string+=item
return string
返回的就是一个用空格分开的字符串,就可以用于wordcloud进行分词啦
这里的输出呢有两种意思,一种是输出到控制台,一种是输出到图片文件,但是两种都很简单
第一种,输出到控制台,这时候我们就需要使用到matplotlib.pyplot模块中的imshow方法
matplotlib是用于数据可视化的一个模块,所以在这里用是很方便的
首先(没下载模块的),先老样子下载模块matplotlib
pip install matplotlib
然后就非常简单啦,我们可以用wordcloud的generate生成词云,然后用imshow()输出即可
matplotlib.pyplot.imshow(wdcloud.generate(text))
当然,我们也可以对画面进行修改,去掉坐标轴
import matplot.pyplot as plt
wdcloud.generate(text)
plt.figure()
plt.imshow(wdcloud)
plt.axis("off")
plt.show()
如果想要把字体换成背景里的颜色怎么办?简单,我们将背景的颜色提取出来不就好了吗,wordcloud就有这种功能,叫做ImageColorGenerator
image_colors = ImageColorGenerator(#背景图片路径#)
plt.imshow(wdcloud.recolor(color_func = image_colors))#换成背景图片的颜色
就这样,控制台输出就完成啦,接下来我们介绍文件输出
第二种,文件输出,也很简单,wordcloud早就想到你们会想输出到文件里存起来,wordcloud有一个方法叫做to_file,是不是很明了作用
wdcloud.to_file(path.join(#你要存放的路径#))
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 23 11:18:06 2019
@author: DKchaos
"""
from os import path
import imageio
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, ImageColorGenerator
d = path.dirname(__file__)#当前文件路径
stopwords = {}
isCN = 1#中文分词
back_img_path = "guangdong.jpg"#图片路径
text_path = "text.txt"#文本路径
font_path = "simsun.ttc"#设置字体路径
stopwords_path = "stopwords.txt"#停用词词表
imgname1 = "WordCloudDefautColors.png"#默认颜色,仅样子是图片
imgname2 = "WordCloudColorByImg.png"#根据图片布局颜色
my_words_list = []#结巴分词列表,如果需要自加词即可自己添加
back_img = imageio.imread(path.join(d, back_img_path))#设置背景图片
#设置词云属性
wdcloud = WordCloud(scale = 16,#清晰度,值越大出来的图片越清晰,但是cpu运算时间也会加长
font_path = font_path,#字体
background_color = "white",#背景颜色
max_words = 100,#词云的最大词数
mask = back_img,#背景图片
max_font_size = 20,#字体最大值
width = 1080, height = 1080, margin = 2,#设置图片大小
)
#添加词库,也就是自加单词
def add_word(li):
for items in li:
jieba.add_word(items)
add_word(my_words_list)
text = open(path.join(d, text_path),encoding = 'utf-8').read()
def jiebaClearText(text):#清洗单词,去掉无关词
mywordlist = []
string = ""
seg_list = jieba.cut(text,cut_all = False)
liststr = "/ ".join(seg_list)#'/'后是有空格的,用于wordcloud分词
f_stop = open(stopwords_path, encoding = 'utf-8')
try:
f_stop_text = f_stop.read()
finally:
f_stop.close()
f_stop_list = f_stop_text.split('\n')
for myword in liststr.split('/'):
if not(myword.strip() in f_stop_list) and len(myword.strip()) > 1:
mywordlist.append(myword)
for item in mywordlist:
string+=item
return string
text = jiebaClearText(text)
wdcloud.generate(text)
image_colors = ImageColorGenerator(back_img)
plt.figure()
plt.imshow(wdcloud)
plt.axis("off")
plt.show()
wdcloud.to_file(path.join(d, imgname1))
plt.imshow(wdcloud.recolor(color_func = image_colors))#换个背景图片的颜色
plt.axis("off")
plt.show()
wdcloud.to_file(path.join(d, imgname2))