wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,经过词云生成的图片,咱们能够更加直观的看出某篇文章的故事梗概。python
首先贴出一张词云图(以哈利波特小说为例):字体
在生成词云图以前,首先要作一些准备工做搜索引擎
1.安装结巴分词库spa
pip install jieba
Python中的分词模块有不少,他们的功能也都是大同小异,咱们安装的结巴分词 是当前使用的最多的类型。3d
下面我来简单介绍一下结巴分词的用法code
结巴分词的分词模式分为三种:对象
(1)全模式:把句子中全部的能够成词的词语都扫描出来, 速度快,可是不能解决歧义问题blog
(2)精确模式:将句子最精确地切开,适合文本分析索引
(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提升召回率,适合用于搜索引擎分词图片
下面用一个简单的例子来看一下三种模式的分词区别:
1 import jieba 2 3 # 全模式:把句子中全部的能够成词的词语都扫描出来, 速度快,可是不能解决歧义问题 4 text = "哈利波特是一常优秀的文学做品" 5 seg_list = jieba.cut(text, cut_all=True) 6 print(u"[全模式]: ", "/ ".join(seg_list)) 7 8 # 精确模式:将句子最精确地切开,适合文本分析 9 seg_list = jieba.cut(text, cut_all=False) 10 print(u"[精确模式]: ", "/ ".join(seg_list)) 11 12 # 默认是精确模式 13 seg_list = jieba.cut(text) 14 print(u"[默认模式]: ", "/ ".join(seg_list)) 15 16 # 搜索引擎模式:在精确模式的基础上,对长词再次切分,提升召回率,适合用于搜索引擎分词 17 seg_list = jieba.cut_for_search(text) 18 print(u"[搜索引擎模式]: ", "/ ".join(seg_list))
下面是对这句话的分词方式:
经过这三种分词模式能够看出,这些分词模式并无很好的划分出“哈利波特”这个专有名词,这是由于在结巴分词的字典中并无记录这个名词,因此须要咱们手动添加自定义字典
添加自定义字典:找一个方便引用的位置 (下图的路径是我安装的位置),新建文本文档(后缀名为.txt),将想添加的词输入进去(注意输入格式),保存并退出
在上面的代码中加入自定义字典的路径,再点击运行
jieba.load_userdict("/home/jmhao/anaconda3/lib/python3.7/site-packages/jieba/mydict.txt")
分词结果,能够看出“哈利波特”这个词已经被识别出来了
结巴分词还有另外一个禁用词的输出结果
1 stopwords = {}.fromkeys(['优秀', '文学做品']) 2 3 #添加禁用词以后 4 seg_list = jieba.cut(text) 5 final = '' 6 for seg in seg_list: 7 if seg not in stopwords: 8 final += seg 9 seg_list_new = jieba.cut(final) 10 print(u"[切割以后]: ", "/ ".join(seg_list_new))
能够看到输出结果中并无“优秀”和“文学做品”两个词
结巴分词还有不少比较复杂的操做,具体的能够去官网查看,我就再也不过多的赘述了
下面咱们正式开始词云的制做
首先下载模块,这里我所使用的环境是Anaconda,因为Anaconda中包含不少经常使用的扩展包,因此这里只须要下载wordcloud。若使用的环境不是Anaconda,则另需安装numpy和PIL模块
pip install wordcloud
而后咱们须要找一篇文章并使用结巴分词将文章分红词语的形式
1 # 分词模块 2 def cut(text): 3 # 选择分词模式 4 word_list = jieba.cut(text,cut_all= True) 5 # 分词后在单独个体之间加上空格 6 result = " ".join(word_list) 7 # 返回分词结果 8 return result
这里我在当前文件夹下建立了一个文本文档“xiaoshuo.txt”,并复制了一章的小说做为词云的主体文字
使用代码控制,打开并读取小说的内容
1 #导入文本文件,进行分词,制做词云 2 with open("xiaoshuo.txt") as fp: 3 text = fp.read() 4 # 将读取的中文文档进行分词 5 text = cut(text)
在网上找到一张白色背景的图片下载到当前文件夹,做为词云的背景图(若不指定图片,则默认生成矩形词云)
#设置词云形状,若设置了词云的形状,生成的词云与图片保持一致,后面设置的宽度和高度将默认无效 mask = np.array(image.open("monkey.jpeg"))
接下来能够根据喜爱来定义词云的颜色、轮廓等参数 下面为经常使用的参数设置方法
font_path : "字体路径" | 词云的字体样式,若要输出中文,则跟随中文的字体 |
width = n | 画布宽度,默认为400像素 |
height = n | 画布高度,默认为400像素 |
scale = n | 按比例放大或缩小画布 |
min_font_size = n | 设置最小的字体大小 |
max_font_size = n | 设置最大的字体大小 |
stopwords = 'words' | 设置要屏蔽的词语 |
background_color = ''color | 设置背景板颜色 |
relative_scaling = n | 设置字体大小与词频的关联性 |
contour_width = n | 设置轮廓宽度 |
contour_color = 'color' | 设置轮廓颜色 |
完整代码
1 #导入词云库 2 from wordcloud import WordCloud 3 #导入图像处理库 4 import PIL.Image as image 5 #导入数据处理库 6 import numpy as np 7 #导入结巴分词库 8 import jieba 9 10 # 分词模块 11 def cut(text): 12 # 选择分词模式 13 word_list = jieba.cut(text,cut_all= True) 14 # 分词后在单独个体之间加上空格 15 result = " ".join(word_list) 16 return result 17 18 #导入文本文件,进行分词,制做词云 19 with open("xiaoshuo.txt") as fp: 20 text = fp.read() 21 # 将读取的中文文档进行分词 22 text = cut(text) 23 #设置词云形状 24 mask = np.array(image.open("monkey.jpeg")) 25 #自定义词云 26 wordcloud = WordCloud( 27 # 遮罩层,除白色背景外,其他图层所有绘制(以前设置的宽高无效) 28 mask=mask, 29 #默认黑色背景,更改成白色 30 background_color='#FFFFFF', 31 #按照比例扩大或缩小画布 32 scale=1, 33 # 若想生成中文字体,需添加中文字体路径 34 font_path="/usr/share/fonts/bb5828/逐浪雅宋体.otf" 35 ).generate(text) 36 #返回对象 37 image_produce = wordcloud.to_image() 38 #保存图片 39 wordcloud.to_file("new_wordcloud.jpg") 40 #显示图像 41 image_produce.show()
注:若想要生成图片样式的词云图,找到的图片背景必须为白色,或者使用Photoshop抠图替换成白色背景,不然生成的词云为矩形
个人词云原图:
生成的词云图: