zoukankan      html  css  js  c++  java
  • Matplotlib学习---用wordcloud画词云(Word Cloud)

    画词云首先需要安装wordcloud(生成词云)和jieba(中文分词)。

    先来说说wordcloud的安装吧,真是一波三折。首先用pip install wordcloud出现错误,说需要安装Visual C++ 14.0。折腾半天安装好Visual C++后,还是不行,按网上指点,下载第三方包安装(https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud)。安装是成功了,可是在anaconda里导入的时候又出现了问题,说是"no module named wordcloud"。随后又折腾了各种方案,比如网上有人说重新安装pillow包,等等,均不可行。突发奇想,打开Pycharm试了试,导入成功了。这说明wordcloud包其实已经安装好了,只是anaconda不识别。最后,终于找到解决方案:在anaconda prompt里输入命令:conda install -c conda-forge wordcloud,即可安装成功(https://anaconda.org/conda-forge/wordcloud)。

    再来看一下wordcloud的基本原理(摘自:http://www.bubuko.com/infodetail-2695943.html):

    总的来说,wordcloud做的是三件事:

    (1) 文本预处理

    (2) 词频统计

    (3) 将高频词以图片形式进行彩色渲染

    下面用vanity fair这本小说来试一下画词云图。(wordcloud的一些参数介绍可参见:https://www.cnblogs.com/delav/articles/7837975.html

    from wordcloud import WordCloud, STOPWORDS
    from matplotlib import pyplot as plt
    fig,ax=plt.subplots()
    
    with open(r'...vanity fair.txt') as f:
        text=f.read()
    
    mycloudword=WordCloud(width=800, 
                          height=600, 
                          scale=1, 
                          margin=2,
                          background_color='white',
                          max_words=200, 
                          min_font_size=40, 
                          max_font_size=140,
                          stopwords=STOPWORDS, 
                          random_state=50).generate(text)
    
    ax.imshow(mycloudword)
    ax.axis("off")
    plt.show()
    
    mycloudword.to_file(r"...vanityfair.png")

    输出:

     注:设置不同的random_state值会让字的分布不一样。

    上面演示的是用英文做的词云,那么如果我们要用中文生成词云呢?这时候就要用到jieba了。

    英文语料可以直接输入到wordcloud中,但是对于中文语料,仅仅用wordcloud不能直接生成中文词云图。这是因为英文单词以空格分隔,而中文的词与词之间一般没有字符分隔。因此,应用到中文语料上的时候,注意要先分好词,再用空格分隔连接成字符串,最后输入到wordcloud

    另外需要注意的是:需要下载中文字体到相应的文件夹,设置该字体路径为font_path。否则,如果设置的是英文字体,那么中文将显示为方框。

    让我们用翻译版的名利场小说来做演示:

    from wordcloud import WordCloud, STOPWORDS
    import jieba
    from matplotlib import pyplot as plt
    fig,ax=plt.subplots()
    
    with open(r'...名利场.txt','rb') as f:
        text=f.read()
    
    wsplit=jieba.cut(text)
    words="".join(wsplit)
    
    mycloudword=WordCloud(font_path=r'C:WindowsFontsmsyh.ttf',
                          width=800, 
                          height=600, 
                          scale=1, 
                          margin=2,
                          background_color='white',
                          max_words=200, 
                          min_font_size=40, 
                          max_font_size=140,
                          stopwords=STOPWORDS, 
                          random_state=50).generate(words)
    
    ax.imshow(mycloudword)
    ax.axis("off")
    plt.show()
    
    mycloudword.to_file(r"...vanityfair1.png")

    输出:

    接下来,我们把词云做成我们想要的形状。用pillow读取某张图片,转换成numpy array格式,并将其设置为mask(遮罩)。除图片全白的部分将不会被绘制,其余部分会用于绘制词云。

    from wordcloud import WordCloud, STOPWORDS
    import jieba
    from PIL import Image
    import numpy as np
    from matplotlib import pyplot as plt
    fig,ax=plt.subplots()
    
    with open(r'...名利场.txt','rb') as f:
        text=f.read()
    
    wsplit=jieba.cut(text)
    words="".join(wsplit)
    
    shape=np.array(Image.open(r'C:Usersccav	img.jpg'))
    
    mycloudword=WordCloud(font_path=r'C:WindowsFontsmsyh.ttf',
                          scale=1, 
                          margin=2,
                          background_color='white',
                          mask=shape,
                          max_words=200, 
                          min_font_size=14, 
                          max_font_size=50,
                          stopwords=STOPWORDS, 
                          random_state=50).generate(words)
    
    ax.imshow(mycloudword)
    ax.axis("off")
    plt.show()
    
    mycloudword.to_file(r"...vanityfair2.png")

    原图:

    输出的词云:

    此外,还可以让词按某个图片的颜色进行显示。用recolor([random_state, color_func, colormap])对现有输出重新着色。(重新上色比重新生成整个词云要快很多)

    添加以下这几句即可:

    from wordcloud import ImageColorGenerator
    color=ImageColorGenerator(np.array(Image.open(r'...	img2.jpg')))
    mycloudword.recolor(color_func=color)

    原图:

    输出:

  • 相关阅读:
    POJ 1321:棋盘问题
    POJ 2251:Dungeon Master
    POJ 3438:Look and Say
    POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
    杭电1285--确定比赛名次(拓扑排序)
    南阳67--三角形面积
    南阳38--布线问题
    杭电1050--Moving Tables(区间覆盖)
    杭电1217--Arbitrage(Spfa)
    杭电1719--Friend(找规律)
  • 原文地址:https://www.cnblogs.com/HuZihu/p/9675304.html
Copyright © 2011-2022 走看看