姜華林
摘要:文章基于PyQt5界面設(shè)計(jì),python編程語(yǔ)言調(diào)用第三方庫(kù)WordCloud設(shè)計(jì)詞云制作軟件,通過(guò)文件選擇提取關(guān)鍵詞及詞云繪制,用QtWebEngineWidgets網(wǎng)頁(yè)組件展示詞云,把海量的數(shù)據(jù)以豐富的視覺(jué)效果呈現(xiàn)出來(lái)凸顯關(guān)鍵詞及其頻率或權(quán)重,能幫助閱讀者快速抓住信息的要點(diǎn)。
關(guān)鍵詞:PyQt5;窗體界面;WordCloud;詞云;關(guān)鍵詞權(quán)重
中圖分類號(hào):TP311? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)13-0074-03
Abstract:Based on pyqt5 interface design, python programming language calls the third-party library wordcloud to design the wordcloud production software, extracts keywords and draws the wordcloud through file selection, displays the wordcloud with qtwebenginewidges web component, presents massive data with rich visual effects to highlight keywords and their frequency or weight, which can help readers quickly grasp the key points of information.
Key words:PyQt5;interface design;WordCloud; keywords weight
在當(dāng)前信息大爆炸時(shí)代,人們?cè)讷@取信息時(shí)都希望快速了解信息文檔的概述,總想通過(guò)其關(guān)鍵詞來(lái)獲知信息文檔的大概內(nèi)容。而文本式關(guān)鍵詞及其頻率或權(quán)重?cái)?shù)據(jù)讓人感覺(jué)平淡無(wú)奇、枯燥乏味,詞云是一種新的數(shù)據(jù)可視化[1]方式之一,能夠快速地篩選出重要文本信息,對(duì)文本中出現(xiàn)頻率較高的詞語(yǔ)或權(quán)重大的詞語(yǔ)予以視覺(jué)上的突出,這樣不僅可以形象化地呈現(xiàn)文本,把關(guān)鍵詞以豐富的圖片視覺(jué)效果的形式展現(xiàn)出來(lái),使文本具有視覺(jué)沖擊力,突出關(guān)鍵的數(shù)據(jù),并能夠反映出數(shù)據(jù)的本質(zhì)問(wèn)題,有效提升數(shù)據(jù)分析的效率,幫助廣大讀者快速地抓住信息的要點(diǎn),進(jìn)行閱讀前的篩選。
1 PyQt5概述
PyQt5[2]是基于Digia公司強(qiáng)大圖形框架Qt5的python接口,由一組python模塊構(gòu)成。PyQt5擁有多個(gè)類和函數(shù)??梢栽赨nix、 Windows和 Mac OS等多個(gè)平臺(tái)運(yùn)行,常用界面設(shè)計(jì)有三大模塊:一是QtCore模塊,其涵蓋了核心的非GUI功能,此模塊主要用于程序處理中涉及的目錄、文件、數(shù)據(jù)類型、文本流、time、mime、進(jìn)程或線程等對(duì)象;二是QtGui模塊,該模塊包括多種處理基本圖形功能的類,涵蓋但不限于:界面設(shè)計(jì)、事件處理、基本圖像、2D圖形和文本字體等;三是QtWidgets模塊,該模塊包含了一整套UI元素組件,用于設(shè)計(jì)多種系統(tǒng)風(fēng)格的界面,操作方便。
2詞云制作基礎(chǔ)知識(shí)
詞云制作常用2種方法,一是利用wordcloud包[3]制作,python利用這個(gè)wordcloud包可以快速進(jìn)行詞云繪制,wordcloud包好學(xué)易懂、使用較為簡(jiǎn)單、繪圖相對(duì)靈活、可自行設(shè)置背景圖片和指定使用字體。二是利用pyecharts[4]包制作,pyecharts是一款將python與echarts結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具,是一個(gè)用于生成 Echarts 圖表的類庫(kù)。Echarts 是百度開(kāi)源的一個(gè)數(shù)據(jù)可視化 JS 庫(kù)。用 Echarts 生成的圖可視化效果非常好。本文應(yīng)用pyecharts包進(jìn)行詞云html文件生成,再用QtWebEngineWidgets網(wǎng)頁(yè)組件展示詞云,其優(yōu)點(diǎn)是形狀各異、漂亮美觀,同時(shí)用鼠標(biāo)放在關(guān)鍵詞上會(huì)顯示其頻率或權(quán)重。
2.1詞云繪制函數(shù)
add( ) 函數(shù)[5],這是pyecharts工具進(jìn)行詞云繪制的主要函數(shù),用于添加詞云的數(shù)據(jù)和設(shè)置各種配置,參數(shù)項(xiàng)較多,常用參數(shù)如下:
series_name:str,系列名稱(必選參數(shù)),用于 tooltip 的顯示,legend 的圖例篩選;
data_pair:Sequence,系列數(shù)據(jù)項(xiàng)(必選參數(shù)),參數(shù)類型為以二元素元組對(duì)象構(gòu)成的列表;
shape:str = "circle",詞云輪廓(可選參數(shù),默認(rèn)為“circle”),有“circle”“cardioid”“diamond”“triangle-forward”“triangle”“pentagon”和“star”七種詞云輪廓可供選擇;
mask_image:types.Optional[str] = None,自定義的圖片(可選參數(shù),目前支持 jpg、 jpeg、png和 ico 的格式),該參數(shù)支持本地文件路徑(相對(duì)或者絕對(duì)路徑都支持);
word_gap:Numeric = 20,單詞間隔(可選參數(shù),默認(rèn)為20);
word_size_range=None,單詞字體大小范圍(可選參數(shù),默認(rèn)為[12, 60]);
rotate_step:Numeric = 45,單詞旋轉(zhuǎn)角度(可選參數(shù),默認(rèn)為45),單詞旋轉(zhuǎn)角度的設(shè)置區(qū)域?yàn)閇-90, 90]。
2.2詞云文件渲染函數(shù)
render( ) 函數(shù),該函數(shù)將會(huì)在默認(rèn)根目錄下生成一個(gè)*.html 的文件,支持存放詞云的文件路徑參數(shù),設(shè)置文件保存位置,如 render("e:\html\my_wordcloud.html"),保存的*.html文件默認(rèn)用瀏覽器打開(kāi),文章中設(shè)計(jì)的詞云制作軟件用QtWebEngineWidgets網(wǎng)頁(yè)組件展示。
3 詞云制作軟件功能流程圖設(shè)計(jì)
根據(jù)詞云制作需求,設(shè)計(jì)其功能流程圖如圖1:
4詞云制作軟件界面設(shè)計(jì)
界面分三部分,一是文本處理區(qū)域,由選擇文件和文本讀取相應(yīng)功能組件構(gòu)成;二是設(shè)置關(guān)鍵詞及詞云參數(shù)區(qū)域,由設(shè)置各項(xiàng)參數(shù)的相應(yīng)功能組件構(gòu)成;三是詞云展示區(qū)域,由瀏覽詞云網(wǎng)頁(yè)組件和相應(yīng)功能組件構(gòu)成。
5詞云制作軟件功能實(shí)現(xiàn)
5.1文本讀取
一是從文件讀取文本,通過(guò)文件瀏覽進(jìn)行文件選擇,可讀取*.txt、*.docx、*.doc和*.pdf四種文件的文本內(nèi)容;二是直接復(fù)制短文本到界面的文本內(nèi)容框中。其主要代碼如下:
def read_file(self):
file_name=self.textFile.toPlainText().strip()
if file_name=='':
QMessageBox.warning(self,"警告","文件名稱不能為空!")
return
if file_name.endswith('.txt'):
fi=io.open(file_name,'r',encoding='utf-8')
text=fi.read()
elif file_name.endswith('.pdf'):
pdf_file = open(file_name, 'rb')
text=self.readPdf(pdf_file)
elif file_name.endswith('.docx'):
text=self.readdocx(file_name)
elif file_name.endswith('.doc'):
file_name2=self.doc_to_docx(file_name)
text=self.readdocx(file_name2)
self.textBrowser.setText(text)
5.2文本數(shù)據(jù)處理及關(guān)鍵詞提取
將讀取的文本使用jieba[6]的精確模式分詞后再進(jìn)行停用詞處理,然后再用gensim[7]的 LdaModel模塊提取文本相應(yīng)的關(guān)鍵詞。其主要代碼如下:
# 使用jieba分詞
sentences=[]
segs=jieba.lcut(text)
# 過(guò)濾停用詞
segs = list(filter(lambda x:x not in stop_word, segs))
sentences.append(segs)
# 構(gòu)建詞袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# 用lda模型提取關(guān)鍵詞
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=1)
list_tmp=lda.show_topic(0, topn=self.wordnum)
5.3詞云制作
5.3.1 導(dǎo)入詞云模塊
不同版本導(dǎo)入模塊方式不同,文章中設(shè)計(jì)的詞云制作軟件使用from pyecharts.charts import WordCloud導(dǎo)入詞云制作模塊。
5.3.2關(guān)鍵詞數(shù)據(jù)轉(zhuǎn)換
通過(guò)lda模型提取的關(guān)鍵詞數(shù)據(jù)如果直接作為詞云制作函數(shù)add的參數(shù),會(huì)出現(xiàn)如下錯(cuò)誤:Uncaught TypeError:Failed to execute 'getImageData' on 'CanvasRenderingContext2D':Value is not of type 'long',由于對(duì)短文本使用gensim.models中的LdaModel函數(shù)進(jìn)行關(guān)鍵詞提取后返回的數(shù)據(jù)類型是list對(duì)象,其元素為二元素元組對(duì)象,該二元素元組對(duì)象的0元素為字符串類型,1元素為long類型,但wordcloud包的add函數(shù)不能接收二元素元組對(duì)象的long類型,因此要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,其代碼如下:
for i in range(len(list_tmp)):
list_tuple=[]
list_tuple.append(list_tmp[i][0])
float_tmp=float(list_tmp[i][1])
list_tuple.append(float_tmp)
self.key_words.append(tuple(list_tuple))? # 把二元素元組作為元素添加到列表中
5.3.3詞云制作對(duì)象實(shí)例化
關(guān)鍵詞權(quán)重?cái)?shù)據(jù)轉(zhuǎn)換后用代碼
worldcloud=(WordCloud().add("", self.key_words,word_gap=w_gap,word_size_range=[w_size_range1, w_size_range2],rotate_step=r_step, shape=w_shape)) 實(shí)例化詞云制作對(duì)象。
5.3.4詞云文件渲染
#默認(rèn)用日期和時(shí)間生成不重復(fù)文件名稱(用戶也可根據(jù)自己的需要進(jìn)行命名修改)
file_name="images/"+time.strftime("%Y%m%d_%H%M%S")+".html"
#渲染詞云文件
worldcloud.render(file_name)
5.4詞云展示
本軟件使用PyQt5的QtWebEngineWidgets組件通過(guò)讀取詞云html文件進(jìn)行詞云展示。
5.4.1導(dǎo)入加載頁(yè)面功能模塊
不同PyQt5版本的QtWebEngineWidgets模塊導(dǎo)入不相同,本軟件導(dǎo)入模塊代碼為:
from PyQt5 import QtWebEngineWidgets as qw
from PyQt5.QtCore import QUrl,Qt
5.4.2加載詞云文件
self.wcloud_widget.layout = QVBoxLayout(self.wcloud_widget)
self.browser=qw.QWebEngineView()
#加載web界面
self.browser.load(QUrl(self.url_path))
self.wcloud_widget.layout.addWidget(self.browser)
self.wcloud_widget.setVisible(True)
5.5詞云保存
# 導(dǎo)入輸出圖片工具
from pyecharts.render import make_snapshot
# 使用snapshot-selenium 渲染圖片
from snapshot_selenium import snapshot
try:
# 保存文件對(duì)話框
file_path =? QFileDialog.getSaveFileName(self,"save file",self.strfile,"png(*.png)")
if file_path[0]=='':
return
make_snapshot(snapshot, self.url_path, file_path[0])
except BaseException as e:
QMessageBox.warning(self,"異常: ",str(e))
6詞云應(yīng)用示例
應(yīng)用詞云制作軟件提取關(guān)鍵詞和繪制詞云方便快捷,如下圖2、圖3和圖4分別是職業(yè)教育20條、科技信息和時(shí)尚信息的關(guān)鍵詞提取及詞云繪制應(yīng)用示例。
7結(jié)束語(yǔ)
基于Python語(yǔ)言的詞云生成[8]相對(duì)簡(jiǎn)單,代碼簡(jiǎn)潔高效,然而完整的詞云制作需要利用多個(gè)功能模塊,每個(gè)功能模塊均有各自的特定函數(shù),相對(duì)獨(dú)立的函數(shù)功能復(fù)雜,參數(shù)眾多并設(shè)置煩瑣,編寫(xiě)和調(diào)試代碼難度較大,因此它需要特定的專業(yè)知識(shí)和編程能力,對(duì)于一般人員這是一個(gè)巨大的難題。文章研究在Python(3.7.1 )+PyQt5(5.15.2)+jieba (0.42.1 )+gensim(3.8.1)+pyecharts( 1.9.0)環(huán)境下設(shè)計(jì)的詞云制作軟件能快速提取關(guān)鍵詞并繪制詞云,相比一般的詞云制作,該軟件在可視化窗體下快速提取關(guān)鍵詞并用網(wǎng)頁(yè)組件展示詞云的html文件,既有動(dòng)態(tài)效果,又能查看關(guān)鍵詞權(quán)重,實(shí)現(xiàn)了閱讀者要快速掌握信息概要及詞云展示的需求。
參考文獻(xiàn):
[1] 朱滌塵,夏換,楊秀璋,等.基于文本挖掘和決策樹(shù)分析的中國(guó)手游產(chǎn)業(yè)發(fā)展研究[J].計(jì)算機(jī)科學(xué),2020,47(S1):530-534.
[2] PYQT5介紹[EB/OL].[2020-08-20].https://blog.csdn.net/cheng_5230/article/details/84065657.
[3] 倪冰葦,趙鴻萍,顧月清.基于詞云圖和層次聚類的天然產(chǎn)物研究熱點(diǎn)分析[J].中國(guó)新藥雜志,2020,29(12):1326-1333.
[4] pyecharts[EB/OL].[2020-08-20].http://pyecharts.herokuapp.com/.
[5] pyecharts[EB/OL].[2020-08-20].https://pyecharts.org/#/zh-cn/basic_charts?id=wordcloud.
[6] 嚴(yán)明,鄭昌興.Python環(huán)境下的文本分詞與詞云制作[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2018(34):86-89.
[7] 肖元君,吳國(guó)文.基于Gensim的摘要自動(dòng)生成算法研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2019,36(12):131-136.
[8] 潘亞星.基于Python的詞云生成研究——以柴靜的《看見(jiàn)》為例[J].電腦知識(shí)與技術(shù),2019,15(24):8-10.
【通聯(lián)編輯:謝媛媛】