引言

从四行代码开始,一步步教你做出高大上的词云图片,可视化生动直观展示出枯燥文字背后的核心概念。进一步实现修改字体、字号、背景颜色、词云形状、勾勒边框、颜色渐变、分类填色、情感分析等高级玩法。

学完本课之后,你可以将四大名著、古典诗词、时事新闻、法律法规、政府报告、小说诗歌等大段文本做成高大上的可视化词云,还可以将你的微信好友个性签名导出,看看你微信好友的“画风”是怎样的。
词云可视化:四行Python代码轻松上手到精通 - 图4
词云的应用场景

  • 会议记录
  • 海报制作
  • PPT制作
  • 生日表白
  • 数据挖掘
  • 情感分析
  • 用户画像
  • 微信聊天记录分析
  • 微博情感分析
  • Bilibili弹幕情感分析
  • 年终总结

    安装本课程所需的Python第三方模块

    打开命令行,输入下面这行命令,回车执行即可。
    1. pip install numpy matplotlib pillow wordcloud imageio jieba snownlp itchat -i https://pypi.tuna.tsinghua.edu.cn/simple

    四行Python代码上手词云制作

    1号词云:《葛底斯堡演说》黑色背景词云(4行代码上手)

    ```python

    导入词云制作第三方库wordcloud

    import wordcloud

创建词云对象,赋值给w,现在w就表示了一个词云对象

w = wordcloud.WordCloud()

调用词云对象的generate方法,将文本传入

w.generate(‘and that government of the people, by the people, for the people, shall not perish from the earth.’)

将生成的词云保存为output1.png图片文件,保存出到当前文件夹中

w.to_file(‘output1.png’)

  1. 运行完成之后,在代码所在的文件夹,就会出现`output.png`图片文件。可以看出,wordcloud自动将`and that by the not from`等废话词组过滤掉,并且把出现次数最多的`people`大号显示。<br />![](https://cdn.nlark.com/yuque/0/2021/png/1517354/1628427001734-f6a0fb41-85d7-4d66-ac8f-232d6d55e1c2.png#align=left&display=inline&height=200&margin=%5Bobject%20Object%5D&originHeight=200&originWidth=400&size=0&status=done&style=none&width=400)<br />`wordcloud`库为每一个词云生成一个WordCloud对象(注意,此处的W和C是大写),也就是说,`wordcloud.WordCloud()`代表一个词云对象,我们将它赋值给`w`。现在,这个`w`就是词云对象啦!我们可以调用这个对象。我们可以在`WordCloud()`括号里填入各种参数,控制词云的字体、字号、字的颜色、背景颜色等等。wordcloud库会非常智能地按空格进行分词及词频统计,出现次数多的词就大。
  2. <a name="MPi8l"></a>
  3. ## 美化词云
  4. <a name="7kQXs"></a>
  5. #### 2号词云:面朝大海,春暖花开(配置词云参数)
  6. 增加宽、高、字体、背景颜色等参数。<br />这里使用的HarmonyOS_Sans鸿蒙开源字体,[下载连接](https://communityfile-drcn.op.hicloud.com/FileServer/getFile/cmtyPub/011/111/111/0000000000011111111.20210608111628.62420999153403221248286695242932:50520607053655:2800:27F307A9789BAC4269AD95AC3BB2C8F68B4857BA697D207904B1937733A2C648.zip?needInitFileName=true)。
  7. ```python
  8. import wordcloud
  9. # 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
  10. # HarmonyOS_Sans_SC_Regular.ttf 是鸿蒙简体中文开源字体
  11. w = wordcloud.WordCloud(width=1000,
  12. height=700,
  13. background_color='white',
  14. font_path='HarmonyOS_Sans_SC_Regular.ttf')
  15. # 调用词云对象的generate方法,将文本传入
  16. w.generate('从明天起,做一个幸福的人。喂马、劈柴,周游世界。从明天起,关心粮食和蔬菜。我有一所房子,面朝大海,春暖花开')
  17. # 将生成的词云保存为output2-poem.png图片文件,保存到当前文件夹中
  18. w.to_file('output2-poem.png')

output2-poem.png

常用参数

  • width 词云图片宽度,默认400像素
  • height 词云图片高度 默认200像素
  • background_color 词云图片的背景颜色,默认为黑色background_color='white'
  • font_step 字号增大的步进间隔 默认1号

font_path 指定字体路径 默认None,对于中文可用font_path='msyh.ttc'

  • mini_font_size 最小字号 默认4号
  • max_font_size 最大字号 根据高度自动调节
  • max_words 最大词数 默认200
  • stop_words 不显示的单词 stop_words={"python","java"}
  • Scale 默认值1。值越大,图像密度越大越清晰
  • prefer_horizontal:默认值0.90,浮点数类型。表示在水平如果不合适,就旋转为垂直方向,水平放置的词数占0.9?
  • relative_scaling:默认值0.5,浮点型。设定按词频倒序排列,上一个词相对下一位词的大小倍数。有如下取值:“0”表示大小标准只参考频率排名,“1”如果词频是2倍,大小也是2倍
  • mask 指定词云形状图片,默认为矩形

通过以下代码读入外部词云形状图片(需要先pip install imageio安装imageio)

  1. import imageio
  2. mk = imageio.imread("picture.png")
  3. w = wordcloud.WordCloud(mask=mk)

也就是说,我们可以这样来构建词云对象w,其中的参数均为常用参数的默认值,供我们自定义:

  1. w = wordcloud.WordCloud(
  2. width=400,
  3. height=200,
  4. background_color='black',
  5. font_path=None,
  6. font_step=1,
  7. min_font_size=4,
  8. max_font_size=None,
  9. max_words=200,
  10. stopwords={},
  11. scale=1,
  12. prefer_horizontal=0.9,
  13. relative_scaling=0.5,
  14. mask=None)

从外部文件读入文本

3号词云:乡村振兴战略中央文件(句子云)

关于实施乡村振兴战略的意见.txt

  1. import wordcloud
  2. # 从外部.txt文件中读取大段文本,存入变量txt中
  3. with open('关于实施乡村振兴战略的意见.txt', encoding='utf-8') as file:
  4. txt = file.read()
  5. # 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
  6. w = wordcloud.WordCloud(width=1000,
  7. height=700,
  8. background_color='white',
  9. font_path='HarmonyOS_Sans_SC_Regular.ttf')
  10. # 将txt变量传入w的generate()方法,给词云输入文字
  11. w.generate(txt)
  12. # 将词云图片导出到当前文件夹
  13. w.to_file('output3-sentence.png')

output3-sentence.png

中文分词

中文分词第三方模块jieba

安装中文分词库jieba:在命令行中输入pip install jieba
打开python的交互式shell界面,也就是有三个大于号>>>的这个界面,依次输入以下命令。

  1. >>> import jieba
  2. >>> textlist = jieba.lcut('计算机科学与技术')
  3. >>> textlist
  4. ['计算机科学', '与', '技术']
  5. >>> string = " ".join(textlist)
  6. >>> string
  7. '计算机科学 与 技术'

以上代码将一句完整的中文字符串转换成了以空格分隔的词组成的字符串,而后者是绘制词云时generate()方法要求传入的参数。

中文分词库jieba的常用方法

精确模式(最常用,只会这个就行):每个字只用一遍,不存在冗余词汇。jieba.lcut('计算机科学与技术')
全模式:把每个字可能形成的词汇都提取出来,存在冗余。jieba.lcut('计算机科学与技术',cut_all=True)
搜索引擎模式:将全模式分词的结果从短到长排列好。jieba.lcut_for_search('计算机科学与技术')

以下命令演示了三种分词模式及结果,精确模式是最常用的。

  1. >>> import jieba
  2. >>> textlist1 = jieba.lcut('动力学和电磁学')
  3. >>> textlist1
  4. ['计算机科学', '与', '技术']
  5. >>> textlist2 = jieba.lcut('动力学和电磁学',cut_all=True)
  6. >>> textlist2
  7. ['计算', '计算机', '计算机科学', '算机', '科学', '与', '技术']
  8. >>> textlist3 = jieba.lcut_for_search('动力学和电磁学')
  9. >>> textlist3
  10. ['计算', '算机', '科学', '计算机', '计算机科学', '与', '技术']

4号词云:西南民族大学介绍词云(中文分词)

  1. import jieba
  2. import wordcloud
  3. # 构建并配置词云对象w
  4. w = wordcloud.WordCloud(width=1000,
  5. height=700,
  6. background_color='white',
  7. font_path='HarmonyOS_Sans_SC_Regular.ttf')
  8. # 调用jieba的lcut()方法对原始文本进行中文分词,得到string
  9. txt = '同济大学(Tongji University),简称“同济”,是中华人民共和国教育部直属,由教育部、国家海洋局和上海市共建的全国重点大学,历史悠久、声誉卓著,是国家“双一流”、“211工程”、“985工程”重点建设高校,也是收生标准最严格的中国大学之一'
  10. txtlist = jieba.lcut(txt)
  11. string = " ".join(txtlist)
  12. # 将string变量传入w的generate()方法,给词云输入文字
  13. w.generate(string)
  14. # 将词云图片导出到当前文件夹
  15. w.to_file('output4-tongji.png')

output4-tongji.png**

5号词云:乡村振兴战略中央文件(词云)

  1. import jieba
  2. import wordcloud
  3. # 构建并配置词云对象w
  4. w = wordcloud.WordCloud(width=1000,
  5. height=700,
  6. background_color='white',
  7. font_path='HarmonyOS_Sans_SC_Regular.ttf')
  8. # 对来自外部文件的文本进行中文分词,得到string
  9. with open('关于实施乡村振兴战略的意见.txt', encoding='utf-8') as file:
  10. txt = file.read()
  11. txtlist = jieba.lcut(txt)
  12. string = " ".join(txtlist)
  13. # 将string变量传入w的generate()方法,给词云输入文字
  14. w.generate(string)
  15. # 将词云图片导出到当前文件夹
  16. w.to_file('output5-village.png')

output5-village.png

高级词云:绘制指定形状的词云

6号词云:乡村振兴战略中央文件(五角星形状)wujiaoxing.png

  1. import jieba
  2. import wordcloud
  3. # 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
  4. import imageio
  5. mk = imageio.imread("wujiaoxing.png")
  6. # 构建并配置词云对象w,注意要加scale参数,提高清晰度
  7. w = wordcloud.WordCloud(width=1000,
  8. height=700,
  9. background_color='white',
  10. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  11. mask=mk,
  12. scale=15)
  13. # 对来自外部文件的文本进行中文分词,得到string
  14. f = open('关于实施乡村振兴战略的意见.txt',encoding='utf-8')
  15. txt = f.read()
  16. txtlist = jieba.lcut(txt)
  17. string = " ".join(txtlist)
  18. # 将string变量传入w的generate()方法,给词云输入文字
  19. w.generate(string)
  20. # 将词云图片导出到当前文件夹
  21. w.to_file('output6-village.png')

output6-village.png

7号词云:新时代中国特色社会主义(中国地图形状)chinamap.png

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mk = imageio.imread("chinamap.png")
  5. # 构建并配置词云对象w,注意要加scale参数,提高清晰度
  6. w = wordcloud.WordCloud(width=1000,
  7. height=700,
  8. background_color='white',
  9. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  10. mask=mk,
  11. scale=15)
  12. f = open('新时代中国特色社会主义.txt',encoding='utf-8')
  13. txt = f.read()
  14. txtlist = jieba.lcut(txt)
  15. string = " ".join(txtlist)
  16. w.generate(string)
  17. w.to_file('output7-chinamap.png')

output7-chinamap.png

8号词云:《三国演义》词云(stopwords参数去除词)三国演义.txt

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. mk = imageio.imread("chinamap.png")
  5. # 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里去掉“曹操”和“孔明”两个词
  6. w = wordcloud.WordCloud(width=1000,
  7. height=700,
  8. background_color='white',
  9. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  10. mask=mk,
  11. scale=15,
  12. stopwords={'曹操','孔明'})
  13. f = open('threekingdoms.txt',encoding='utf-8')
  14. txt = f.read()
  15. txtlist = jieba.lcut(txt)
  16. string = " ".join(txtlist)
  17. w.generate(string)
  18. w.to_file('output8-threekingdoms.png')

词云可视化:四行Python代码轻松上手到精通 - 图11

9号词云:《哈姆雷特》(勾勒轮廓线)hamlet.txt alice.png

  1. import wordcloud
  2. import imageio
  3. # 将外部文件包含的文本保存在string变量中
  4. string = open('hamlet.txt').read()
  5. mk = imageio.imread("alice.png")
  6. # 构建词云对象w,注意增加参数contour_width和contour_color设置轮廓宽度和颜色
  7. w = wordcloud.WordCloud(background_color="white",
  8. mask=mk,
  9. contour_width=1,
  10. contour_color='steelblue')
  11. w.generate(string)
  12. w.to_file('output9-contour.png')

词云可视化:四行Python代码轻松上手到精通 - 图12

10号词云:《爱丽丝漫游仙境》词云(按模板填色)alice_color.png

  1. # 导入绘图库matplotlib和词云制作库wordcloud
  2. import matplotlib.pyplot as plt
  3. from wordcloud import WordCloud,ImageColorGenerator
  4. # 将外部文件包含的文本保存在text变量中
  5. text = open('alice.txt').read()
  6. # 导入imageio库中的imread函数,并用这个函数读取本地图片queen2.jfif,作为词云形状图片
  7. import imageio
  8. mk = imageio.imread("alice_color.png")
  9. # 构建词云对象w
  10. wc = WordCloud(background_color="white",
  11. mask=mk,)
  12. # 将text字符串变量传入w的generate()方法,给词云输入文字
  13. wc.generate(text)
  14. # 调用wordcloud库中的ImageColorGenerator()函数,提取模板图片各部分的颜色
  15. image_colors = ImageColorGenerator(mk)
  16. # 显示原生词云图、按模板图片颜色的词云图和模板图片,按左、中、右显示
  17. fig, axes = plt.subplots(1, 3)
  18. # 最左边的图片显示原生词云图
  19. axes[0].imshow(wc)
  20. # 中间的图片显示按模板图片颜色生成的词云图,采用双线性插值的方法显示颜色
  21. axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
  22. # 右边的图片显示模板图片
  23. axes[2].imshow(mk, cmap=plt.cm.gray)
  24. for ax in axes:
  25. ax.set_axis_off()
  26. plt.show()
  27. # 给词云对象按模板图片的颜色重新上色
  28. wc_color = wc.recolor(color_func=image_colors)
  29. # 将词云图片导出到当前文件夹
  30. wc_color.to_file('output10-alice.png')

词云可视化:四行Python代码轻松上手到精通 - 图13

进阶词云:尽享数据驱动与开源社区

11号词云:绘制你的微信好友个性签名词云(此案例已失效,腾讯关闭了微信网页版登陆接口)

  1. # 微信库ichat
  2. import wordcloud
  3. import itchat
  4. import jieba
  5. import imageio
  6. import matplotlib.pyplot as plt
  7. itchat.login() # 先登录微信,跳出登陆二维码
  8. tList = []
  9. friends = itchat.get_friends(update=True) # 获取好友列表
  10. # 构建所有好友个性签名组成的大列表tList
  11. for i in friends:
  12. signature = i["Signature"] # 获取个性签名
  13. if 'emoji' in signature:
  14. pass
  15. else:
  16. tList.append(signature)
  17. text = " ".join(tList)
  18. # 对个性签名进行中文分词
  19. wordlist_jieba = jieba.lcut(text, cut_all=True)
  20. wl_space_split = " ".join(wordlist_jieba)
  21. mk = imageio.imread("chinamap.png")
  22. # 构建并配置词云对象w,注意要加scale参数,提高清晰度
  23. my_wordcloud = wordcloud.WordCloud(background_color='white',
  24. width=1000,
  25. height=700,
  26. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  27. max_words=2000,
  28. mask=mk,
  29. scale=20)
  30. my_wordcloud.generate(wl_space_split)
  31. nickname = friends[0]['NickName']
  32. filename = "output11-{}的微信好友个性签名词云图.png".format(nickname)
  33. my_wordcloud.to_file(filename)
  34. # 显示词云图片
  35. plt.imshow(my_wordcloud)
  36. plt.axis("off")
  37. plt.show()
  38. print('程序结束')

文字情感分析与文本挖掘

Python中文语言处理第三方库snownlp小试牛刀

安装中文文本分析库snownlp:在命令行中输入pip install snownlp
打开python的交互式shell界面,也就是有三个大于号>>>的这个界面,依次输入以下命令。

  1. >>> import snownlp
  2. >>> word = snownlp.SnowNLP("中华民族伟大复兴")
  3. >>> feeling = word.sentiments
  4. >>> feeling
  5. 0.9935086411278989
  6. >>> word = snownlp.SnowNLP("快递慢到死,客服态度不好,退款!")
  7. >>> feeling = word.sentiments
  8. >>> feeling
  9. 0.00012171645785852281

snownlp的语料库是淘宝等电商网站的评论,所以对购物类的文本情感分析准确度很高。

12号词云:《三国演义》情感分析词云

  1. import jieba
  2. import wordcloud
  3. import imageio
  4. import snownlp
  5. mk = imageio.imread("chinamap.png")
  6. # 构建并配置两个词云对象w1和w2,分别存放积极词和消极词
  7. w1 = wordcloud.WordCloud(width=1000,
  8. height=700,
  9. background_color='white',
  10. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  11. mask=mk,
  12. scale=15)
  13. w2 = wordcloud.WordCloud(width=1000,
  14. height=700,
  15. background_color='white',
  16. font_path='HarmonyOS_Sans_SC_Regular.ttf',
  17. mask=mk,
  18. scale=15)
  19. # 对来自外部文件的文本进行中文分词,得到积极词汇和消极词汇的两个列表
  20. f = open('三国演义.txt',encoding='utf-8')
  21. txt = f.read()
  22. txt_list = jieba.lcut(txt)
  23. positive_list = []
  24. negative_list = []
  25. # 下面对文本中的每个词进行情感分析,情感>0.96判为积极词,情感<0.06判为消极词
  26. print('开始进行情感分析,请稍等,三国演义全文那么长的文本需要三分钟左右')
  27. for each in txt_list:
  28. each_word = snownlp.SnowNLP(each)
  29. feeling = each_word.sentiments
  30. if feeling > 0.96:
  31. positive_list.append(each)
  32. elif feeling < 0.06:
  33. negative_list.append(each)
  34. else:
  35. pass
  36. # 将积极和消极的两个列表各自合并成积极字符串和消极字符串,字符串中的词用空格分隔
  37. positive_string = " ".join(positivelist)
  38. negative_string = " ".join(negativelist)
  39. # 将string变量传入w的generate()方法,给词云输入文字
  40. w1.generate(positive_string)
  41. w2.generate(negative_string)
  42. # 将积极、消极的两个词云图片导出到当前文件夹
  43. w1.to_file('output12-positive.png')
  44. w2.to_file('output12-negative.png')
  45. print('词云生成完成')

output12-positive.pngoutput12-negative.png

13号词云:《三国演义》人物阵营分色词云

  1. from wordcloud import WordCloud, get_single_color_func
  2. import imageio
  3. import jieba
  4. class SimpleGroupedColorFunc(object):
  5. """Create a color function object which assigns EXACT colors
  6. to certain words based on the color to words mapping
  7. Parameters
  8. ----------
  9. color_to_words : dict(str -> list(str))
  10. A dictionary that maps a color to the list of words.
  11. default_color : str
  12. Color that will be assigned to a word that's not a member
  13. of any value from color_to_words.
  14. """
  15. def __init__(self, color_to_words, default_color):
  16. self.word_to_color = {word: color
  17. for (color, words) in color_to_words.items()
  18. for word in words}
  19. self.default_color = default_color
  20. def __call__(self, word, **kwargs):
  21. return self.word_to_color.get(word, self.default_color)
  22. class GroupedColorFunc(object):
  23. """Create a color function object which assigns DIFFERENT SHADES of
  24. specified colors to certain words based on the color to words mapping.
  25. Uses wordcloud.get_single_color_func
  26. Parameters
  27. ----------
  28. color_to_words : dict(str -> list(str))
  29. A dictionary that maps a color to the list of words.
  30. default_color : str
  31. Color that will be assigned to a word that's not a member
  32. of any value from color_to_words.
  33. """
  34. def __init__(self, color_to_words, default_color):
  35. self.color_func_to_words = [
  36. (get_single_color_func(color), set(words))
  37. for (color, words) in color_to_words.items()]
  38. self.default_color_func = get_single_color_func(default_color)
  39. def get_color_func(self, word):
  40. """Returns a single_color_func associated with the word"""
  41. try:
  42. color_func = next(
  43. color_func for (color_func, words) in self.color_func_to_words
  44. if word in words)
  45. except StopIteration:
  46. color_func = self.default_color_func
  47. return color_func
  48. def __call__(self, word, **kwargs):
  49. return self.get_color_func(word)(word, **kwargs)
  50. mk = imageio.imread("chinamap.png")
  51. w = wordcloud.WordCloud(width=1000,
  52. height=700,
  53. background_color='white',
  54. font_path='res/HarmonyOS_Sans_SC_Regular.ttf',
  55. mask=mk,
  56. scale=15,
  57. max_font_size=60,
  58. max_words=20000,
  59. font_step=1)
  60. # 对来自外部文件的文本进行中文分词,得到string
  61. f = open('三国演义.txt', encoding='utf-8')
  62. txt = f.read()
  63. txt_list = jieba.lcut(txt)
  64. sentence = " ".join(txt_list)
  65. # 将string变量传入w的generate()方法,给词云输入文字
  66. w.generate(string)
  67. # 创建字典,按人物所在的不同阵营安排不同颜色,绿色是蜀国,橙色是魏国,紫色是东吴,粉色是诸侯群雄
  68. color_to_words = {
  69. 'green': ['刘备','刘玄德','孔明','诸葛孔明', '玄德', '关公', '玄德曰','孔明曰',
  70. '张飞', '赵云','后主', '黄忠', '马超', '姜维', '魏延', '孟获',
  71. '关兴','诸葛亮','云长','孟达','庞统','廖化','马岱'],
  72. 'red': ['曹操', '司马懿', '夏侯', '荀彧', '郭嘉','邓艾','许褚',
  73. '徐晃','许诸','曹仁','司马昭','庞德','于禁','夏侯渊','曹真','钟会'],
  74. 'purple':['孙权','周瑜','东吴','孙策','吕蒙','陆逊','鲁肃','黄盖','太史慈'],
  75. 'pink':['董卓','袁术','袁绍','吕布','刘璋','刘表','貂蝉']
  76. }
  77. # 其它词语的颜色
  78. default_color = 'gray'
  79. # 构建新的颜色规则
  80. grouped_color_func = GroupedColorFunc(color_to_words, default_color)
  81. # 按照新的颜色规则重新绘制词云颜色
  82. w.recolor(color_func=grouped_color_func)
  83. # 将词云图片导出到当前文件夹
  84. w.to_file('output13-threekingdoms.png')

output13-threekingdoms.png

课后闲话

wordcloud库

wordcloud的Github主页

词云绘制的原理

python123:你不知道的词云