[Python word_cloud 样例 标签云系列(三)]

[Python word_cloud 样例 标签云系列(三)]
转载地址:https://zhuanlan.zhihu.com/p/20436642word_cloud/examples at master · amueller/word_cloud · GitHub
上面是官方样例。这一篇里的大部分尝试都基于这些样例进行修改。前提是你已经完成了安装,依照上一篇修改了 FONT_PATH 。
还记得 http://zhuanlan.zhihu.com/666666/20432734 里提到的中文分词方法吧,这次我们就不再赘述对文本的预处理了。有所不同的是,在上次的 pytagcloud 库中我们要求传入字典,而这次我们要求传入数组。所以需要做一点小小的改动。
上一次我们是这么写的:

wd = {}fp=codecs.open("rsa.txt", "r",'utf-8');alllines=fp.readlines();fp.close();for eachline in alllines: line = eachline.split(' ') #print eachline, wd[line[0]] = int(line[1])print wd

这次我们需要将其中生成字典的部分变为数组:

-- coding: utf-8 --import codecsfp=codecs.open("rs300.txt", "r",'utf-8');wd = []alllines=fp.readlines();fp.close();for eachline in alllines: line = eachline.split('\') line[1]=int(line[1]) wd.append(line) #print eachline,print wd

文本预处理好了以后,我们就可以开始对照样例依葫芦画瓢,尝试生成词云了。在此过程中会强调一些比较重要的方法,请自行对照上一篇的文档理解。

word_cloud 生成词云有两个方法。from text 和 from frequencies 。如果我们处理英文文档的话,就可以直接使用第一个方法,而不需要提前预处理文本,由于我们要做的是中文文本,所以我们必须自己分词,并处理为数组,使用第二种方法。
让我们从一个最简单的例子开始,也就是官方文档的 simple.py

-- coding: utf-8 --"""Minimal Example===============Generating a square wordcloud from the US constitution using default arguments."""from os import pathfrom wordcloud import WordCloudd = path.dirname(file)# Read the whole text. 此处原为处理英文文本,我们修改为传入中文数组#text = open(path.join(d, 'constitution.txt')).read()frequencies = [(u'知乎',5),(u'小段同学',4),(u'曲小花',3),(u'中文分词',2),(u'样例',1)]# Generate a word cloud image 此处原为 text 方法,我们改用 frequencies #wordcloud = WordCloud().generate(text)wordcloud = WordCloud().fit_words(frequencies)# Display the generated image:# the matplotlib way:import matplotlib.pyplot as pltplt.imshow(wordcloud)plt.axis("off")# take relative word frequencies into account, lower max_font_size#wordcloud = WordCloud(max_font_size=40, relative_scaling=.5).generate(text)wordcloud = WordCloud(max_font_size=40, relative_scaling=.5).fit_words(frequencies)plt.figure()plt.imshow(wordcloud)plt.axis("off")plt.show()# The pil way (if you don't have matplotlib)#image = wordcloud.to_image()#image.show()

运行代码得到结果:

长的很像我们在第一篇中输出的结果。但是我们可以注意到,上次的结果如右图,词语间是不会发生嵌套的,而这次输出的左图,字间空隙也可以插入词语了。
这一步成功以后起码说明我们中文环境配好了,可以开始更深层次的尝试了。
在下面的演示中,我为了节省力气,会直接使用一些英文的文档,这样省去处理中文分词的步骤。
大家在用的时候只要记得修改 FONT_PATH 、 utf-8 编码、处理数据为数组格式使用 frequencies 方法这三点就可以了。
接下来我们来到 masked.py
如文件名所示,这一次我们要自定义遮罩形状来生成真正的词云了!
根据文档说明,遮罩图片的白色部分将被视作透明,只在非白色部分区域作图。于是我们找到一张黑白素材图。

-- coding: utf-8 --""""Masked wordcloud================Using a mask you can generate wordclouds in arbitrary shapes."""from os import pathfrom PIL import Imageimport numpy as npimport matplotlib.pyplot as pltfrom wordcloud import WordCloud, STOPWORDSd = path.dirname(file)# Read the whole text.text = open(path.join(d, 'alice.txt')).read()# read the mask image# taken from# http://www.stencilry.org/stencils/movies/alice%20in%20wonderland/255fk.jpgalice_mask = np.array(Image.open(path.join(d, "huge.jpg")))wc = WordCloud(background_color="white", max_words=2000, mask=alice_mask, stopwords=STOPWORDS.add("said"))# generate word cloudwc.generate(text)# store to filewc.to_file(path.join(d, "alice.png"))# showplt.imshow(wc)plt.axis("off")plt.figure()plt.imshow(alice_mask, cmap=plt.cm.gray)plt.axis("off")plt.show()

如下图:


图做好了,可是总觉得哪里怪怪的。可能是颜色太过鲜艳吧,配色总感觉不是那么舒服,有没有更逼格的处理?自然是有的。我们来到 a_new_hope.py
还是上面的图,直接处理。

"""Using custom colors====================Using the recolor method and custom coloring functions."""import numpy as npfrom PIL import Imagefrom os import pathimport matplotlib.pyplot as pltimport randomfrom wordcloud import WordCloud, STOPWORDSdef grey_color_func(word, font_size, position, orientation, random_state=None, **kwargs): return "hsl(0, 0%%, %d%%)" % random.randint(60, 100)d = path.dirname(file)# read the mask image# taken from# http://www.stencilry.org/stencils/movies/star%20wars/storm-trooper.gifmask = np.array(Image.open(path.join(d, "huge.jpg")))# movie script of "a new hope"# http://www.imsdb.com/scripts/Star-Wars-A-New-Hope.html# May the lawyers deem this fair use.text = open("a_new_hope.txt").read()# preprocessing the text a little bittext = text.replace("HAN", "Han")text = text.replace("LUKE'S", "Luke")# adding movie script specific stopwordsstopwords = STOPWORDS.copy()stopwords.add("int")stopwords.add("ext")wc = WordCloud(max_words=1000, mask=mask, stopwords=stopwords, margin=10, random_state=1).generate(text)# store default colored imagedefault_colors = wc.to_array()plt.title("Custom colors")plt.imshow(wc.recolor(color_func=grey_color_func, random_state=3))wc.to_file("a_new_hope.png")plt.axis("off")plt.figure()plt.title("Default colors")plt.imshow(default_colors)plt.axis("off")plt.show()


这样的灰调颜色比上面花花绿绿的感觉好多了。可是总不能老用黑白啊,需要色彩的时候怎么办?最后一站我们来到 colored.py
为了突出我们鲜明且令人舒服的色调,我挑选了一幅小黄人的图片进行处理。

!/usr/bin/env python2"""Image-colored wordcloud========================You can color a word-cloud by using an image-based coloring strategy implemented inImageColorGenerator. It uses the average color of the region occupied by the wordin a source image. You can combine this with masking - pure-white will be interpretedas 'don't occupy' by the WordCloud object when passed as mask.If you want white as a legal color, you can just pass a different image to "mask",but make sure the image shapes line up."""from os import pathfrom PIL import Imageimport numpy as npimport matplotlib.pyplot as pltfrom wordcloud import WordCloud, STOPWORDS, ImageColorGeneratord = path.dirname(file)# Read the whole text.text = open(path.join(d, 'alice.txt')).read()# read the mask / color image# taken from http://jirkavinse.deviantart.com/art/quot-Real-Life-quot-Alice-282261010alice_coloring = np.array(Image.open(path.join(d, "xhr.jpg")))wc = WordCloud(background_color="white", max_words=2000, mask=alice_coloring, stopwords=STOPWORDS.add("said"), max_font_size=40, random_state=42)# generate word cloudwc.generate(text)# create coloring from imageimage_colors = ImageColorGenerator(alice_coloring)# showplt.imshow(wc)plt.axis("off")plt.figure()# recolor wordcloud and show# we could also give color_func=image_colors directly in the constructorplt.imshow(wc.recolor(color_func=image_colors))plt.axis("off")plt.figure()plt.imshow(alice_coloring, cmap=plt.cm.gray)plt.axis("off")plt.show()

效果还可以,但是和我想的…不太一样…我们尝试调整一些参数。……当然,最佳效果可能需要很多次的尝试才会出现。比如我将字号调大以后就会出现一些……奇怪的输出,难道是因为白色白的不够纯净吗。


总体上讲这样的配色已经比上面那种花花绿绿的配色好多了…至于为什么白色区域还会有词语,我刚看了一下小黄人的原图,白色区域的确不完全是 255,255,255 ,应该是这个原因。

好了,到这里我们四幅样例就都做完了。最后我发现缺少一张封面图,那就再多来一张,顺便尝试一下 scale 参数。
我们尝试在如下位置加入 scale 参数,设置为 1.5 倍。
wc=WordCloud(background_color="white",max_words=2000,mask=alice_coloring,stopwords=STOPWORDS.add("said"),max_font_size=40,random_state=42,scale =1.5 )

可以看到输出的图片的确是原图的 2 倍。

再次强调使用 word_cloud 的几个要点吧:
1、FONT_PATH
2、中文要实现分词,输出为数组,使用 frequencies 方法
3、scale 的用法,由于程序运行时间较长,如果生成大幅图片会很慢,可以使用 scale 调节大小,但是会牺牲词语对形状的拟合度

到此标签云这一系列就能告一段落了。我们由中文分词引入,为了可视化展示,试用了两个标签云生成器。下面简单总结比较一下 pytagcloud 和 word_cloud 的优点:
pytagcloud :
优点:依赖较少;可以同时添加多个字体,在代码中选择;提供相对完善的配色方案。
word_cloud:
优点:文字空隙可以嵌套词语;支持自定义词云形状;支持通过图片上色。
缺点:依赖较

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • 需要使用到的各类库 PIL matplotlib numpy wordcloud 首先是需要安装wordcloud...
    Julianlee107阅读 1,212评论 0 2
  • 一直觉得WordCloud挺好玩的,今天偶然看到一篇关于WordCloud的博客,于是试了一下。没想到遇到一串问题...
    3146135b760e阅读 2,984评论 0 6
  • 镜子——一种表面光滑,具有反射光线能力的物品。日常生活中多用于整理仪容,它可以反射出你的一切然后成像。也许清晨的时...
    荞麦杆子阅读 380评论 0 2
  • 文/七蒙主 买房这件事,是不是你人生中的头等大事?如果是,那么解决好这件事,你就会感觉轻松很多。然而,因为北上广深...
    七蒙主阅读 909评论 10 9
  • 一个人,坐在夜幕中, 听,风捎来麦子的问候, 还有,青草拔节的躁动。 硕大的砾石,站在河边, 注视着远方,还有我,...
    又见依依阅读 90评论 0 3