在這做一個詞雲圖生成器來送給大家(附代碼),建議收藏

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

作者:雁陎

如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?說不定你學了可能是兩年前人家就學過的內容,在這小編分享一波2020最新的Python教程。獲取方式,私信小編 “ 資料 ”,即可免費獲取哦!

前幾天做ppt,要展示的內容有很多關鍵詞,就想到了雲字圖這種玩意,沒想到網上一搜,在線生成的網站要麼需要付費,要麼不支持指定形狀生成,一氣之下乾脆自己寫了一個。幸好python有這個庫wordcloud,所以很快就實現了這個功能。後續優化了一下(渣優化),覺得基本能用了。

做好後的成果如下圖:

在這做一個詞雲圖生成器來送給大家(附代碼),建議收藏

 

環境

所使用的版本爲python3.6.5(Anaconda)

  • wordcloud 雲字圖生成庫
  • matplotlib 繪圖庫,常和numpy一起使用
  • numpy 數組函數庫,矩陣運算必用
  • PIL 圖像操作模塊
  • random 隨機數模塊
  • jieba 中文分詞模塊

代碼

# -*- coding: utf-8 -*-
"""
Created on Fri Sep 29 13:14:22 2019
        self.
@author: 雁陎
"""

from wordcloud import (WordCloud, ImageColorGenerator)
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
from random import randint
import jieba

lines=[]
with open('config.txt','r') as handler:
    lines = handler.readlines()

a,b = map(int,lines[3].split(','))  # 顏色h的範圍
bgcolor = lines[7].strip('\n').lower()  # 背景顏色
if bgcolor == 'none':
    bgcolor = None
w,h = map(int,lines[9].split(',')) # 雲字圖尺寸

def font_select():
    font_input = lines[5].strip('\n')
    font_dict = {'微軟雅黑':r'\msyh.ttc','楷體':r'\simkai.ttf','宋體':r'\simsun.ttc',
             '仿宋':r'\simfang.ttf','隸書':r'\SIMLI.TTF','Times New Roman':r'times.ttf'}
    return r'C:\Windows\Fonts' + font_dict[font_input]   # 字體


def shape_judge():  # 判斷用戶選擇的形狀
    cloud_shape = lines[11].strip('\n').lower()  # 雲字圖形狀
    if cloud_shape == 'rectangle':
        mask = None
    elif cloud_shape == 'round':
        x,y = np.ogrid[:w,:w]
        mask = 255*((x-w/2) ** 2 + (y-w/2) ** 2 > 4.2*w ** 2).astype(int) 
        # 以(w/2,w/2)爲圓心,半徑爲4.2*w的圓,255不知道幹什麼的,但是必須有
    else:
        mask = np.array(Image.open(r"shape.jpg"))
    return mask


def color_judge():   
    font_color_input = int(lines[1].strip('\n'))
    if font_color_input == 1:
        random_color = np.array(Image.open(r"shape.jpg")) 
        return ImageColorGenerator(random_color)
        #字體顏色爲背景圖片的顏色
    else:
        def random_color_func(word=None, font_size=None, position=None, 
                              orientation=None, font_path=None, random_state=None):
            h,s,l = randint(a,b),randint(80,100),randint(25,50)
                # h即表示顏色的取值範圍,我們可以谷歌colour picker 查看各顏色的取值範圍對應的h值
                # 然後在參數中設置 color_func = random_color_func即可令字按照該範圍設定顏色
            return "hsl({}, {}%, {}%)".format(h, s, l)

def segment_words(text):
    article_contents = ""
    #使用jieba進行分詞
    words = jieba.cut(text,cut_all=False)
    for word in words:
        #使用空格來分割詞,否則詞組仍是一起的
        article_contents += word+" "
    return article_contents
        
def segment_judge():  # 判斷分詞模式
    segment_mode = int(lines[13].strip('\n'))
    text=open(u'word.txt','r').read().lower()
    if segment_mode == 1:
        return text
    else:
        return segment_words(text)

stopwords = {'.',',','"',':','(',')','.','。','(',')','[',']','”','“','\n','\t',' '}

wordcloud= WordCloud(font_path=font_select(), background_color=bgcolor, mode="RGBA", 
                     color_func = color_judge(),mask= shape_judge(),width=w, 
                     height=h,stopwords = stopwords,margin=2).generate(segment_judge())

# 你可以通過font path參數來設置字體集
# width, height, margin可以設置圖片屬性
# backgroud_color = "black",可以設定背景顏色,默認黑色,如果想要設定透明的可以按照上面代碼做
# stopwords 停用詞,即雲字圖中不展示的詞組,如各種標點、換行。
 
plt.axis("off")  # 是否繪製座標軸
plt.show()
wordcloud.to_file('wordcloud.png')

配置文件

爲了方便用戶(也就是我)使用,所以配置了一個config.txt文件(不要吐槽txt,純小白~),代碼中所有的輸入均來自congfig。

# 1、字體顏色模式,可選:圖片顏色(1,按照即選項6中picture模式的圖片顏色進行繪製,選擇模式1就無需改動選項2,同時需保持選項6爲picture),自定義顏色(2,即自定義顏色的範圍,需要設定選項2)
2
# 2、字體顏色H的取值範圍,參見https://www.webfx.com/web-design/color-picker/
40,80
# 3、字體,可選:微軟雅黑,楷體,宋體,仿宋,隸書,Times New Roman
微軟雅黑
# 4、背景顏色,英文書寫如white,默認爲透明(None)
None
# 5、雲字圖尺寸,寬,高
1000,800
# 6、雲字圖形狀,可選:方形(rectangle,尺寸爲寬,高),圓形(round,尺寸爲寬,寬),或圖片形狀(picture,按照同目錄下shape.jpg的形狀繪製,尺寸爲圖片尺寸)
picture
# 7、分詞模式,可選:自定義模式(1,即按照你所給的詞組進行繪製,詞組之間用空格分隔),自動分詞模式(2,即給定一段話,程序自動進行分詞並按照頻率進行繪製)
1

使用

你的項目目錄中應該有以下文件:

雲字圖生成

config.txt

shape.jpg

word.txt

雲字圖生成.py

其中,shape.jpg是所選定的圖片形狀,在config中設定選項6爲picture後會按照這個圖片的形狀來生成雲字圖。

shape最好背景爲白色,這樣效果最好。

說到這裏,你能看出來文章開頭的效果圖是誰嗎?

猜猜他是誰

常見問題

有個很常見的問題就是我的字體該如何配置,如果你實際操作起來就會發現,“誒我明明指向了Font文件夾中的微軟雅黑.ttf”,爲什麼報錯說沒有這個字體呢?

很簡單,因爲你在font中看到的字體名並不是它真正的字體名,比如“微軟雅黑”實際上是“msyh”。那麼我該如何查看它真實的文件名?一個方便的做法是把它複製到桌面上,它就會自動顯示真正的名字了。

哦對了font文件夾的地址是C:\Windows\Fonts

地址欄拼接的時候報錯

大家可以看到在拼接字體文件字符串的時候用的是r'C:\Windows\Fonts'+r'\SIMLI.TTF'而非r'C:\Windows\Fonts\' & r'SIMLI.TTF',因爲當字符串最後一位是\時,無法對字符串進行拼接等操作,即使用r'轉義也不行,會報錯SyntaxError: EOL while scanning string literal。這貌似是python的一個bug,解決方法如上,\放到第二個字符串開頭即可。

如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?說不定你學了可能是兩年前人家就學過的內容,在這小編分享一波2020最新的Python教程。獲取方式,私信小編 “ 資料 ”,即可免費獲取哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章