首发于 人工智能小技巧
词云可视化:四行Python代码轻松上手到精通

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

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

本课概要

词云是文本大数据可视化的重要方式,可以将大段文本中的关键语句和词汇高亮展示。

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

学完本课之后,你可以将四大名著、古典诗词、时事新闻、法律法规、政府报告、小说诗歌等大段文本做成高大上的可视化词云,还可以将你的微信好友个性签名导出,看看你微信好友的“画风”是怎样的。



从远古山洞壁画到微信表情包,人类千百年来始终都是懒惰的视觉动物。连篇累牍的大段文本会让人感到枯燥乏味。在这个“颜值即正义”的时代,大数据更需要“颜值”才能展现数据挖掘的魅力。

词云的应用场景

关于本课程

作者:同济大学 子豪兄 2019-5-23
源代码及相关素材Github库:zihaowordcloud
Bilibili视频教程: 同济子豪兄

知乎专栏: 人工智能小技巧

简书专栏: 人工智能小技巧

粉丝答疑交流QQ群:953712961

微信赞赏码



不需要写代码——词云图片制作微信小程序



如果你不想写代码,可以直接忽略掉以下所有内容。这个微信小程序可以实现以下所有常用功能。

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

一行命令安装(推荐,适用于99.999%的情况)

打开命令行,输入下面这行命令,回车执行即可。

如果安装过程中报错(0.001%会发生)

如果报错:Microsoft Visual C++ 14.0 is required.
解决方法:
lfd.uci.edu/~gohlke/pyt 页面下载所需的wordcloud模块的.whl文件,再用pip安装下载的文件。
比如,对于64位windows操作系统,python版本为3.6的电脑,就应该下载
wordcloud-1.4.1-cp36-cp36m-win_amd64.whl这个文件
下载后打开命令行,使用cd命令切换到该文件的路径,执行pip install wordcloud-1.4.1-cp36-cp36m-win_amd64.whl命令,即可安装成功。

四行Python代码上手词云制作

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

运行完成之后,在代码所在的文件夹,就会出现output.png图片文件。可以看出,wordcloud自动将and that by the not from等废话词组过滤掉,并且把出现次数最多的people大号显示。



子豪兄带你逐行读代码

wordcloud库为每一个词云生成一个WordCloud对象(注意,此处的W和C是大写)

也就是说,wordcloud.WordCloud()代表一个词云对象,我们将它赋值给w

现在,这个w就是词云对象啦!我们可以调用这个对象。

我们可以在WordCloud()括号里填入各种参数,控制词云的字体、字号、字的颜色、背景颜色等等。

wordcloud库会非常智能地按空格进行分词及词频统计,出现次数多的词就大。

美化词云

2号词云:面朝大海,春暖花开(配置词云参数)

增加宽、高、字体、背景颜色等参数



如果参数过多,第二行写成长长的一行不好看,可以写成多行,让代码更工整

常用参数

background_color='white'

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

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

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

从外部文件读入文本

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



中文分词

中文分词第三方模块jieba

中文分词-小试牛刀

安装中文分词库jieba:在命令行中输入pip install jieba

打开python的交互式shell界面,也就是有三个大于号>>>的这个界面,依次输入以下命令。

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

中文分词库jieba的常用方法

精确模式(最常用,只会这个就行):每个字只用一遍,不存在冗余词汇。jieba.lcut('动力学和电磁学')

全模式:把每个字可能形成的词汇都提取出来,存在冗余。jieba.lcut('动力学和电磁学',cut_all=True)

搜索引擎模式:将全模式分词的结果从短到长排列好。jieba.lcut_for_search('动力学和电磁学')

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

一键执行的详细脚本文件详见 github代码库-zihaowordcloud中的test1-jieba.py文件。

4号词云:同济大学介绍词云(中文分词)



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



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

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

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



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

加scale参数为15的效果



不加scale参数的效果,稍显模糊



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



9号词云:《哈姆雷特》(勾勒轮廓线)



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







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

11号词云:绘制你的微信好友个性签名词云



文字情感分析与文本挖掘

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

安装中文文本分析库snownlp:在命令行中输入pip install snownlp

打开python的交互式shell界面,也就是有三个大于号>>>的这个界面,依次输入以下命令。

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

一键执行的详细脚本文件详见 github代码库-zihaowordcloud中的test2-snownlp.py文件。

12号词云:《三体Ⅱ黑暗森林》情感分析词云

# 12号词云:《三体Ⅱ黑暗森林》情感分析词云
# B站专栏:同济子豪兄 2019-5-23

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")

# 构建并配置两个词云对象w1和w2,分别存放积极词和消极词
w1 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)
w2 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)

# 对来自外部文件的文本进行中文分词,得到积极词汇和消极词汇的两个列表
f = open('三体黑暗森林.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
positivelist = []
negativelist = []

# 下面对文本中的每个词进行情感分析,情感>0.96判为积极词,情感<0.06判为消极词
print('开始进行情感分析,请稍等,三国演义全文那么长的文本需要三分钟左右')
# 导入自然语言处理第三方库snownlp
import snownlp
for each in txtlist:
    each_word = snownlp.SnowNLP(each)
    feeling = each_word.sentiments
    if feeling > 0.96:
        positivelist.append(each)
    elif feeling < 0.06:
        negativelist.append(each)
    else:
        pass
# 将积极和消极的两个列表各自合并成积极字符串和消极字符串,字符串中的词用空格分隔
positive_string = " ".join(positivelist)
negative_string = " ".join(negativelist)


# 将string变量传入w的generate()方法,给词云输入文字
w1.generate(positive_string)
w2.generate(negative_string)

# 将积极、消极的两个词云图片导出到当前文件夹
w1.to_file('output12-positive.png')
w2.to_file('output12-negative.png')
print('词云生成完成')



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

# 13号词云:三国人物阵营分色词云
# B站专栏:同济子豪兄 2019-5-23

# 导入wordcloud库,并定义两个函数
from wordcloud import (WordCloud, get_single_color_func)

class SimpleGroupedColorFunc(object):
    """Create a color function object which assigns EXACT colors
       to certain words based on the color to words mapping

       Parameters
       ----------
       color_to_words : dict(str -> list(str))
         A dictionary that maps a color to the list of words.

       default_color : str
         Color that will be assigned to a word that's not a member
         of any value from color_to_words.
    """

    def __init__(self, color_to_words, default_color):
        self.word_to_color = {word: color
                              for (color, words) in color_to_words.items()
                              for word in words}

        self.default_color = default_color

    def __call__(self, word, **kwargs):
        return self.word_to_color.get(word, self.default_color)


class GroupedColorFunc(object):
    """Create a color function object which assigns DIFFERENT SHADES of
       specified colors to certain words based on the color to words mapping.

       Uses wordcloud.get_single_color_func

       Parameters
       ----------
       color_to_words : dict(str -> list(str))
         A dictionary that maps a color to the list of words.

       default_color : str
         Color that will be assigned to a word that's not a member
         of any value from color_to_words.
    """

    def __init__(self, color_to_words, default_color):
        self.color_func_to_words = [
            (get_single_color_func(color), set(words))
            for (color, words) in color_to_words.items()]

        self.default_color_func = get_single_color_func(default_color)

    def get_color_func(self, word):
        """Returns a single_color_func associated with the word"""
        try:
            color_func = next(
                color_func for (color_func, words) in self.color_func_to_words
                if word in words)
        except StopIteration:
            color_func = self.default_color_func

        return color_func

    def __call__(self, word, **kwargs):
        return self.get_color_func(word)(word, **kwargs)

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")

w = WordCloud(width=1000,
              height=700,
              background_color='white',
              font_path='msyh.ttc',
              mask=mk,
              scale=15,
              max_font_size=60,
              max_words=20000,
              font_step=1)

import jieba
# 对来自外部文件的文本进行中文分词,得到string
f = open('三国演义.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 创建字典,按人物所在的不同阵营安排不同颜色,绿色是蜀国,橙色是魏国,紫色是东吴,粉色是诸侯群雄
color_to_words = {
    'green': ['刘备','刘玄德','孔明','诸葛孔明', '玄德', '关公', '玄德曰','孔明曰',
              '张飞', '赵云','后主', '黄忠', '马超', '姜维', '魏延', '孟获',
              '关兴','诸葛亮','云长','孟达','庞统','廖化','马岱'],
    'red': ['曹操', '司马懿', '夏侯', '荀彧', '郭嘉','邓艾','许褚',
            '徐晃','许诸','曹仁','司马昭','庞德','于禁','夏侯渊','曹真','钟会'],
    'purple':['孙权','周瑜','东吴','孙策','吕蒙','陆逊','鲁肃','黄盖','太史慈'],
    'pink':['董卓','袁术','袁绍','吕布','刘璋','刘表','貂蝉']
}

# 其它词语的颜色
default_color = 'gray'

# 构建新的颜色规则
grouped_color_func = GroupedColorFunc(color_to_words, default_color)

# 按照新的颜色规则重新绘制词云颜色
w.recolor(color_func=grouped_color_func)

# 将词云图片导出到当前文件夹
w.to_file('output13-threekingdoms.png')



课后闲话

wordcloud库

wordcloud的Github主页

词云绘制的原理

python123:你不知道的词云

词云制作微信小程序



微信赞赏码



参考资料与扩展阅读

翻译:WorldCloud()官方使用说明 & matplotlib.pyplot.imshow()官方使用说明

Python语言程序设计MOOC 北京理工大学 嵩天

python123:你不知道的词云

文本素材来源

深圳SEO优化公司资阳网络营销哪家好安顺关键词排名包年推广哪家好锦州建网站多少钱泰安网站开发推荐大运网站优化排名价格鄂州网站推广工具公司泉州网站推广方案邵阳企业网站改版岳阳英文网站建设推荐滨州网站优化公司那曲网站优化多少钱保定网站推广方案公司娄底如何制作网站黄石网络营销武汉高端网站设计推荐白银SEO按天收费哪家好衡水百度竞价多少钱钦州营销型网站建设报价临汾网站优化按天扣费哪家好丽水企业网站建设价格天门网站制作设计公司漳州网站搭建价格昌吉SEO按天收费安康百度seo哪家好临夏SEO按天收费报价衡水SEO按效果付费公司吉祥外贸网站制作哪家好绥化百度竞价包年推广多少钱安康网络推广民治网站改版报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化