已知詞頻生成詞雲圖(數據庫到生成詞雲)–generate_from_frequencies(WordCloud)

  • 2019 年 10 月 3 日
  • 筆記

詞雲圖是根據詞出現的頻率生成詞雲,詞的字體大小表現了其頻率大小。

 

寫在前面:

用wc.generate(text)直接生成詞頻的方法使用很多,所以不再贅述。

但是對於根據generate_from_frequencies()給定詞頻如何畫詞雲圖的資料找了很久,下面只講這種方法。

generate_from_frequencies適用於我已知詞及其對應的詞頻是多少(已有數據庫),不需要分詞的情況下。

官方文檔說generate_from_frequencies函數的參數是array of tuple,但是我試了很久都不行,最後發現居然應該是dict 字典形式!

即形如:{ word1: fre1, word2: fre2,  word3: fre3,……,  wordn: fren }

 

注意:

詞雲wordcloud的中文顯示,需要特殊處理,在網上看了不少是說加字體路徑之類的方法我試了都不行,最後只好採用改變編碼的形式才解決好。

fp = pd.read_csv(read_name, encoding='gbk')  # 讀取詞頻csv文件, 編碼為gbk

 

還有,示例詞雲的輪廓背景圖由china_map.jpg給出,如下圖:

 

一、數據文件準備

support_institution.csv

數據庫字段分組查詢數量

select support_institution name,count(support_institution) value from nsfc GROUP BY name ORDER BY value DESC;  

查詢結果部分截圖:  

 

導出為csv文件:support_institution.csv

 

二、導入模塊包

可參考Windows下安裝Python、matplotlib包 及相關
https://blog.csdn.net/mikasa3/article/details/78942650 

1、numpy

2、pandas

3、wordcloud

4、matplotlib

 

三、完整代碼

import numpy as np  import pandas as pd  from wordcloud import WordCloud, ImageColorGenerator  import matplotlib.pyplot as plt  from PIL import Image      def draw_cloud(read_name):      image = Image.open('china_map.jpg')  # 作為背景輪廓圖      graph = np.array(image)      # 參數分別是指定字體、背景顏色、最大的詞的大小、使用給定圖作為背景形狀      wc = WordCloud(font_path='simkai.ttf', background_color='black', max_words=100, mask=graph)      fp = pd.read_csv(read_name, encoding='gbk')  # 讀取詞頻文件, 因為要顯示中文,故編碼為gbk      name = list(fp.name)  #      value = fp.val  # 詞的頻率      for i in range(len(name)):          name[i] = str(name[i])      dic = dict(zip(name, value))  # 詞頻以字典形式存儲      wc.generate_from_frequencies(dic)  # 根據給定詞頻生成詞雲      image_color = ImageColorGenerator(graph)      plt.imshow(wc)      plt.axis("off")  # 不顯示坐標軸      plt.show()      wc.to_file('nsfc依託單位詞雲.png')  # 圖片命名      if __name__ == '__main__':      draw_cloud("support_institution.csv")

 

四、運行結果

 詞雲圖:

 

五、補充:WordCloud的參數詳解

    WordCloud(font_path='',                width=400,                height=200,                margin=2,                ranks_only=None,                prefer_horizontal=0.9,                mask=None, scale=1,                color_func=None,                max_words=200,                min_font_size=4,                stopwords=None,                random_state=None,                background_color='black',                max_font_size=None,                font_step=1,                mode='RGB',                relative_scaling=0.5,                regexp=None,                collocations=True,                colormap=None,                normalize_plurals=True                )

wordcloud參數

 

font_path : string  # 字體路徑,需要展現什麼字體就把該字體路徑+後綴名寫上,如:font_path = '黑體.ttf'      width : int (default=400)  # 輸出的畫布寬度,默認為400像素      height : int (default=200)  # 輸出的畫布高度,默認為200像素      prefer_horizontal : float (default=0.90)  # 詞語水平方向排版出現的頻率,默認 0.9 (所以詞語垂直方向排版出現頻率為 0.1 )      mask : nd-array or None (default=None)  # 如果參數為空,則使用二維遮罩繪製詞雲。如果 mask 非空,設置的寬高值將被忽略,遮罩形狀被 mask 取代。除全白(#FFFFFF)的部分將不會繪製,其餘部分會用於繪製詞雲。  # 如:bg_pic = imread('讀取一張圖片.png'),背景圖片的畫布一定要設置為白色(#FFFFFF),然後顯示的形狀為不是白色的其他顏色。可以用ps工具將自己要顯示的形狀複製到一個純白色的畫布上再保存,就ok了。      scale : float (default=1)  # 按照比例進行放大畫布,如設置為1.5,則長和寬都是原來畫布的1.5倍。      min_font_size : int (default=4)  # 顯示的最小的字體大小      font_step : int (default=1)  # 字體步長,如果步長大於1,會加快運算但是可能導致結果出現較大的誤差。      max_words : number (default=200)  # 要顯示的詞的最大個數      stopwords : set of strings or None  # 設置需要屏蔽的詞,如果為空,則使用內置的STOPWORDS      background_color : color value (default=”black”)  # 背景顏色,如background_color='white',背景顏色為白色。      max_font_size : int or None (default=None)  # 顯示的最大的字體大小      mode : string (default=”RGB”)  # 當參數為“RGBA”並且background_color不為空時,背景為透明。      relative_scaling : float (default=.5)  # 詞頻和字體大小的關聯性      color_func : callable, default=None  # 生成新顏色的函數,如果為空,則使用 self.color_func      regexp : string or None (optional)  # 使用正則表達式分隔輸入的文本      collocations : bool, default=True  # 是否包括兩個詞的搭配      colormap : string or matplotlib colormap, default=”viridis”  # 給每個單詞隨機分配顏色,若指定color_func,則忽略該方法。

wordcloud參數詳解

 

 

PS:以下內容可以不看,當然,看我也攔不住 ○( ^皿^)っHiahiahia…

 

上面的中國地圖顯示的詞雲並不好看(可能因為詞語過長),所以補充一個好看的作品(*^▽^*)

2019國務院政府工作報告詞雲。

文本地址:

http://www.gov.cn/guowuyuan/baogao.htm

全文代碼:

 

# coding:utf-8  import jieba  # 分詞  import matplotlib.pyplot as plt  # 數據可視化  from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS  # 詞雲  import numpy as np  # 科學計算  from PIL import Image  # 處理圖片      def draw_cloud(text, graph, save_name):      textfile = open(text).read()  # 讀取文本內容      wordlist = jieba.cut(textfile, cut_all=False)  # 中文分詞      space_list = " ".join(wordlist)  # 連接詞語      backgroud = np.array(Image.open(graph))  # 背景輪廓圖      mywordcloud = WordCloud(background_color="white",  # 背景顏色                              mask=backgroud,  # 寫字用的背景圖,從背景圖取顏色                              max_words=100,  # 最大詞語數量                              stopwords=STOPWORDS,  # 停用詞                              font_path="simkai.ttf",  # 字體                              max_font_size=200,  # 最大字體尺寸                              random_state=50,  # 隨機角度                              scale=2,                              collocations=False,  # 避免重複單詞                              )      mywordcloud = mywordcloud.generate(space_list)  # 生成詞雲      ImageColorGenerator(backgroud)  # 生成詞雲的顏色      plt.imsave(save_name, mywordcloud)  # 保存圖片      plt.imshow(mywordcloud)  # 顯示詞雲      plt.axis("off")  # 關閉保存      plt.show()      if __name__ == '__main__':      draw_cloud(text="government.txt", graph="china_map.jpg", save_name='2019政府工作報告詞雲.png')

 

 詞雲圖: