首先要安装wordcloud(用于生成词云),matplotlib(用于绘图),jieba(用于分词),PIL(用于连接图片,进行词云轮廓的选择)。
安装:pip install worldcloud matplotlib jieba PIL
准备一些文本,在这里我使用的是古诗。
下面是对WordCloud()函数参数的介绍:
WordCloud()
可选的参数
font_path
:可用于指定字体路径,包括otf
和ttf(tff是汉语,建议使用SimHei.tff,资源已上传。)
width
:词云的宽度,默认为400height
:词云的高度,默认为200mask
:蒙版,可用于定制词云的形状min_font_size
:最小字号,默认为4max_font_size
:最大字号,默认为词云的高度max_words
:词的最大数量,默认为200stopwords
:将被忽略的停用词,如果不指定则使用默认的停用词词库background_color
:背景颜色,默认为black
mode
:默认为RGB
模式,如果为RGBA
模式且background_color
设为None
,则背景将透明下面我们以英文版独立宣言片段为例来生成词云。(默认是英文版,如果想生成汉语词云,需要对参数进行修改)。
独立宣言片段内容如下:(我将其写入了data.csv)
Declaration of Independence
When in the course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.
We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness. That to secure these rights, Governments are instituted among Men, deriving their just powers from the consent of the governed. That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to alter or to abolish it, and to institute new Government, laying its foundation on such principles and organizing its powers in such form, as to them shall seem most likely to effect their Safety and Happiness. Prudence, indeed, will dictate that Governments long established should not be changed for light and transient causes; and accordingly, all experience hath shown that mankind are more disposed to suffer, while evils are sufferable, than to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and usurpations, pursuing invariably the same Object evinces a design to reduce them under absolute Despotism, it is their right, it is their duty, to throw off such Government, and to provide new Guards for their future security. Such has been the patient sufferance of these Colonies; and such is now the necessity which constrains them to alter their former Systems of Government. The history of the present King of Great Britain is a history of repeated injuries and usurpations, all having in direct object the establishment of an absolute Tyranny over these States. To prove this, let Facts be submitted to a candid world.
We, therefore, the Representatives of the united States of America, in General Congress, assembled, appealing to the Supreme Judge of the world for the rectitude of our intentions, do, in the Name, and by Authority of the good People of these Colonies, solemnly publish and declare, That these United Colonies are, and of Right ought to be Free and Independent States; that they are Absolved from all Allegiance to the British Crown, and that all political connection between them and the State of Great Britain, is and ought to be totally dissolved; and that as Free and Independent States, they have full Power to levy War, conclude Peace, contract Alliances, establish Commerce, and to do all other Acts and Things which Independent States may of right do. And for the support of this Declaration, with a firm reliance on the protection of divine Providence, we mutually pledge to each other our Lives, our Fortunes and our sacred Honor.
Done in Congress, at the unanimous request of the delegates of the thirteen United States of America, on the Fourth day of July, in the year of our Lord one thousand seven hundred and seventy-six.
结果生成如下:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = open('data.csv').read()
wc = WordCloud().generate(text)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
wc.to_file('wordcloud.png')
当然,我们平时使用最多的是汉语,所以我们需要对汉语进行一个词云生成,更贴近我们的生活。
这里首先需要我们下载一个汉语字体,推荐使用Simhei.tff。
下面,我们以黄国平的致谢论文为例进行分析:(我已将原文写入data.csv中)
原文如下:
我走了很远的路,吃了很多的苦,才将这份博士学位论文送到你的面前。二十二载求学路,一路风雨泥泞,许多不容易。如梦一场, 仿佛昨天一家人才团聚过。
出生在一个小山坳里,母亲在我十二岁时离家。父亲在家的日子不多,即便在我病得不能自已去医院的时候,也仅是留下勉强够治病的钱后又走了。我十七岁时,他因交通事故离世后,我哭得稀里糊涂,因为再得重病时没有谁来管我了。同年,和我住在一起的婆婆病故,真的无能为力。她照顾我十七年,下葬时却仅是一副薄薄的棺材。另一个家庭成员是老狗小花,为父亲和婆婆守过坟,后因我进城上高中而命不知何时何处所终。如兄长般的计算机启蒙老师没能看到我的大学录取通知书,对我照顾有加的师母也在不惑之前匆匆离开人世。每次回去看他们,这一座座坟茔都提示着生命的每一分钟都弥足珍贵。
人情冷暖,生离死别,固然让人痛苦与无奈,而贫穷则可能让人失去希望。家徒四壁,在煤油灯下写作业或者读书都是晚上最开心的事。如果下雨,保留节目就是用竹笋壳塞瓦缝防漏雨。高中之前的主要经济来源是夜里抓黄鳝、周末钓鱼、养小猪崽和出租水牛。那些年里,方圆十公里的水田和小河都被我用脚测量过无数次。被狗和蛇追,半夜落水,因蓄电瓶进水而摸黑逃回家中:学费没交,黄鳝却被父亲偷卖了,然后买了肉和酒,都是难以避免的事。人后的苦尚且还能克服,人前的尊严却无比脆弱。上课的时候,因拖欠学费而经常被老师叫出教室约谈。雨天湿漉着上课,屁股后面说不定还是泥。夏天光着脚走在滚烫的路上。冬天穿着破旧衣服打着寒颤穿过那条长长的过道领作业本。这些都可能成为压垮骆驼的最后一根稻草。如果不是考试后常能从主席台领奖金,顺便能贴一墙奖状满足最后的虚荣心,我可能早已放弃。
身处命运的漩涡,耗尽心力去争取那些可能本就是稀松平常的东西,每次转折都显得那么的身不由己。幸运的是,命运到底还有一丝怜惜。进入高中后,学校免了全部学杂费,(省略)一家帮助解决了生活费。进入大学后,计算机终于成了我一生的事业与希望,胃溃疡和胃出血也终与我作别。
我很庆幸保研时选择了自动化所,感谢研究生部的老师们将我从别的部门调剂到模式识别实验室,感谢导师宗成庆老师选择了我。宗老师将我引入了科学研究的大门,博士这五年无疑是我过去最幸福的时光。惭愧的是,离宗老师的期望显然还有很远的距离,我也知道本可以做得更好。这一段经历已经成为我这一生值得回味的美好瞬间之一。我很喜欢人机交互式机器翻译这个题目,但也仅开了个头。在未来,希望能有机会弥补这段遗憾。从家出发坐大巴雷要两个半小时才能到县城,一直盼着走出大山。从炬光乡小学、大寅镇中学、仪陇县中学、绵阳市南山中学,到重庆的西南大学,再到中科院自动化所,我也记不清有多少次因为现实的压力而觉得自己快扛不下去了。这一路,信念很简单,把书念下去,然后走出去,不枉活一世。世事难料,未来注定还会面对更为复杂的局面。但因为有了这些点点滴滴,我已经有勇气和耐心面对任何困难和挑战。理想不伟大,只愿年过半百,归来仍是少年,希望还有机会重新认识这个世界,不辜负这一生吃过的苦。最后如果还能做出点让别人生活更美好的事,那这辈子就赚了。
最近这些年,特别感谢(省略隐私人)重塑了我的人生。感谢老师和老师为我的研究提出诸多建设性的意见和建议。与他们的交流过程中,我也被他们坦诚为人、踏实做事的处世风格所感染。感谢所有和我一起在课题组工作的老师们和学习的同学们:(隐私省略)我们在研究上共同努力,互相学习,如亲兄弟姐妹一般谈笑风生。不论大家将来在何处,我想我们都不会忘记这些年一起度过的时光。感谢课题组(隐私省略)女士,感谢模式识别综合办实验室的(隐私省略)和(隐私省略)等老师, 感谢研究生部的(隐私省略)等老师, 他们为我的学习和工作给予了极大的帮助。这会成为我日后工作的动力,希望最后能成为课题组值得骄做的学生。
生成内容如下:
但是明显因为字数太少,训练结果不算很理想。下面我们使用字数比较多的唐诗三百首进行训练。
唐诗三百首的内容省略,结果如下:
这就比较明显了,高频出现的词汇占空间比重比较大。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 打开文本
text = open('data.csv').read()
# 生成对象
wc = WordCloud(font_path="C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simhei_31bf3856ad364e35_10.0.22621.1_none_55bd821267d31393\simhei.ttf", width=800, height=600, mode='RGBA', background_color=None).generate(text)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
但是有时候分词问题很烦,就是说两个本不想干的字出现在一起,且频率跟高,就会在词云上占很大比重,比如“你真的好可爱啊,你真的好漂亮啊,你真的好善良啊”,通过分词可能会出现‘的好’但是,这两个字组合起来本身不带有很明显的意义。是我们不希望得到的。这时如果有一个分词工具就好得多了。由此,我们引入一个jieba的库。
使用pip install jieba可以下载。
还是对唐诗三百首进行训练,加上分词后训练结果如下:
(⊙o⊙)…,其实并不是jieba库的效果不好,而是选用古诗作为训练题材有点不太好...,古诗中很少能有组成常见的现代词语的连续的字词(博主推荐大家使用其他文本资源,也欢迎分享(在下方留言))。
嘻嘻,不够使用致谢论文就好多了:(但是还是建议训练量尽量多一点,致谢论文的字数太少,随机性较强)。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
# 打开文本
text = open('data.csv').read()
text = ' '.join(jieba.cut(text))
print(text[:100])
# 生成对象
wc = WordCloud(font_path="C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simhei_31bf3856ad364e35_10.0.22621.1_none_55bd821267d31393\simhei.ttf", width=800, height=600, mode='RGBA', background_color=None).generate(text)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
有趣的是,我们还可以使用固定轮廓来绘制词云:
以下面图片为例:
仍使用致谢论文作为训练集来生成词云:
注意,资源图片的背景一定要是白色的。
from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
# 打开文本
text = open('data.csv').read()
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
# 生成对象
mask = np.array(Image.open("xixi.jpg"))
wc = WordCloud(mask=mask, font_path='C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simhei_31bf3856ad364e35_10.0.22621.1_none_55bd821267d31393\simhei.ttf', mode='RGBA', background_color=None).generate(text)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
为了和原图有较高的拟合度,我们也可以使用原图的颜色风格,这时只需要对代码做一些简单的修改,生产的图片如下:
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
# 打开文本
text = open('data.csv').read()
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
# 生成对象
mask = np.array(Image.open("xixi.jpg"))
wc = WordCloud(mask=mask, font_path='C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simhei_31bf3856ad364e35_10.0.22621.1_none_55bd821267d31393\simhei.ttf', mode='RGBA', background_color=None).generate(text)
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
当然,如果你喜欢革命风格,也能满足你,这时我们可以自己选择颜色范围,只需要对代码做一点点修改,修改后成果如下:
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
import random
# 打开文本
text = open('data.csv').read()
# 中文分词
text = ' '.join(jieba.cut(text))
print(text[:100])
# 生成对象
def random_color(word, font_size, position, orientation, font_path, random_state):
s = 'hsl(0, %d%%, %d%%)' % (random.randint(200, 230), random.randint(60, 80))
print(s)
return s
mask = np.array(Image.open("xixi.jpg"))
wc = WordCloud(color_func= random_color, mask=mask, font_path='C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simhei_31bf3856ad364e35_10.0.22621.1_none_55bd821267d31393\simhei.ttf', mode='RGBA', background_color=None).generate(text)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
关于配色问题,可以参考如下网址:CSS3/Color/HSL - W3C Wiki