前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于Demo大師,作者wellenwoo
概述
Python 實作的、帶GUI界面的詞云生成器, 選擇檔案(中文、英文均可)即可生成詞云,支持自定義 停用詞詞典,支持自定義遮罩形狀,
詳細說明:
“詞云”就是資料可視化的一種形式,給出一段文本,根據文本中詞語的出現頻率而生成的一幅影像,從而過濾掉大量的文本資訊,人們只要掃一眼就能夠明白文章主旨,使得資料分析的結果更加直觀,
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
準備作業:
1.安裝必要的第三方庫:
pip install wordcloud
pip install jieba
pip install numpy
pip install wxPython
安裝PIL,在以下地址下載PIL庫進行安裝:
http://effbot.org/media/downloads/PIL-1.1.7.win32-py2.7.exe
(或在http://effbot.org/downloads/ 中找到與你作業系統及python版本相對應
版本的PIL)
需要注意一點,因為wordcloud自帶的字體檔案不支持中文,為了讓wordcloud支持中文詞云的生成,安裝完wordcloud庫后需要hack一下,具體做法如下:
復制一個中文字體檔案(在本專案中為方正姚體 FZYTK.TTF)到wordcloud安裝路徑下(如\Python27\Lib\site-packages\wordcloud),然后打開wordcloud庫中的wordcloud.py檔案,將其中的
“FONT_PATH = os.environ.get(‘FONT_PATH’, os.path.join(FILE, ‘DroidSansMono.ttf’))”
(本專案的附件中將附帶 FZYTK.TTF 字體檔案)
改寫為
“FONT_PATH = os.environ.get(‘FONT_PATH’, os.path.join(FILE, ‘FZYTK.TTF’))”.
這樣wordcloud將會以”FZYTK.TTF”作為字體檔案.
專案結構:
整體的專案結構十分簡單,一共三個腳本檔案,一個是GUI界面腳本(draw_gui.py),
一個是GUI選單的輔助性腳本(utility_template.py),
一個是詞云生成器腳本(wordcloud_gen.py),
如下:
程式實作
以下是程式的實作思路,以及步驟,實作步驟里,附上了關鍵代碼,全部的代碼,請下載代碼后閱讀
在wordcloud_gen.py中匯入相關的庫:
from os import path from PIL import Image import numpy as np import timefrom wordcloud import WordCloud, STOPWORDS import jieba
撰寫wordcloud_gen.py中的相關函式,
讀取傳入檔案:
def get_text(fn): text = open(fn).read() return text
中文分詞:
def get_text_cn(fn): t0 = get_text(fn) t0 = jieba.cut(t0,cut_all = False) text = " ".join(t0) return text
生成詞云:
def draw_wc(text,mask_path,stopwords): mask = np.array(Image.open(mask_path)) wc = WordCloud(max_words = 1000,mask = mask,stopwords = stopwords, margin = 0,random_state=1).generate(text) im = wc.to_image() im.show() fn = str(int(time.time()))+'.jpg' im.save(fn) return im
3.在draw_gui.py中撰寫用戶界面:
匯入相關的庫:
import wx import osfrom os import path from collections import namedtuple import wx.lib.rcsizer as rcs from wordcloud import STOPWORDS from utility_template import layout_template #自定義的庫 import wordcloud_gen as wcg #自定義的庫
撰寫界面:
class MainWindow(wx.Frame): def __init__(self,parent,title): wx.Frame.__init__(self,parent,title=title,size=(600,-1)) Size = namedtuple("Size",['x','y']) s = Size(100,50) self.cn_text = None self.en_text = None cwd = os.getcwd() self.mask_path = path.join(path.abspath(cwd),'alice_mask.png') self.user_sw = STOPWORDS self.lt = layout_template() self.name = 'WordCloud draw' self.version = '0.2' self.des = '''Draw the word cloud.\n''' self.git_website = "https://github.com/WellenWoo/WordCloud_draw" self.copyright = "(C) 2018 All Right Reserved" """創建選單欄""" filemenu = wx.Menu() menuExit = filemenu.Append(wx.ID_EXIT,"E&xit\tCtrl+Q","Tenminate the program") confmenu = wx.Menu() menuSw = confmenu.Append(wx.ID_ANY,"StopWords","Add user StopWrods dict") menuMask = confmenu.Append(wx.ID_ANY,"Mask","Set mask") helpmenu = wx.Menu () menuAbout = helpmenu.Append(wx.ID_ABOUT ,"&About","Information about this program") menuBar = wx.MenuBar () menuBar.Append(filemenu,"&File") menuBar.Append(confmenu,"&Configure") menuBar.Append(helpmenu,"&Help") self.SetMenuBar(menuBar) """創建輸入框""" self.in1 = wx.TextCtrl(self,-1,size = (2*s.x,s.y)) """創建按鈕""" b1 = wx.Button(self,-1,'text') b2 = wx.Button(self, -1, "run") """設定輸入框的提示資訊""" self.in1.SetToolTipString('choose a text file') """界面布局""" self.sizer0 = rcs.RowColSizer() self.sizer0.Add(b1,row = 1,col = 1) self.sizer0.Add(self.in1,row = 1,col = 2) self.sizer0.Add(b2,row = 1,col = 3) """系結回呼函式""" self.Bind(wx.EVT_BUTTON, self.choose_cn, b1) self.Bind(wx.EVT_BUTTON, self.draw_cn, b2) '''選單系結函式''' self.Bind(wx.EVT_MENU,self.OnExit,menuExit) self.Bind(wx.EVT_MENU,self.OnAbout,menuAbout) self.Bind(wx.EVT_MENU,self.get_stopwords,menuSw) self.Bind(wx.EVT_MENU,self.get_mask,menuMask) self.SetSizer(self.sizer0) self.SetAutoLayout(1) self.sizer0.Fit(self) self.CreateStatusBar() self.Show(True)
界面如下:
撰寫控制元件的回呼函式:
def choose_cn(self,evt): """Choose a Chinses text file""" self.cn_text = None self.cn_text = self.choose_file(txtformat) if self.cn_text is None: pass else: self.in1.Clear() self.in1.write(self.cn_text) def choose_file(self,wildcard): '''choose img''' dlg = wx.FileDialog( self, message="Choose a file", defaultDir=os.getcwd(), defaultFile="", wildcard=wildcard, style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR ) if dlg.ShowModal() == wx.ID_OK: paths = dlg.GetPaths() dlg.Destroy() return paths[0] else: return None def draw_cn(self,evt): if self.cn_text is None: self.raise_msg(u'plaese Choose a Chinses text file first.') return None else: text = wcg.get_text_cn(self.cn_text) wcg.draw_wc(text,self.mask_path,self.user_sw)
運行效果如下:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1956.html
標籤:Python
