姜華林
摘要:文章基于PyQt5界面設(shè)計,python編程語言調(diào)用第三方庫WordCloud設(shè)計詞云制作軟件,通過文件選擇提取關(guān)鍵詞及詞云繪制,用QtWebEngineWidgets網(wǎng)頁組件展示詞云,把海量的數(shù)據(jù)以豐富的視覺效果呈現(xiàn)出來凸顯關(guān)鍵詞及其頻率或權(quán)重,能幫助閱讀者快速抓住信息的要點。
關(guān)鍵詞:PyQt5;窗體界面;WordCloud;詞云;關(guān)鍵詞權(quán)重
中圖分類號:TP311? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號: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)前信息大爆炸時代,人們在獲取信息時都希望快速了解信息文檔的概述,總想通過其關(guān)鍵詞來獲知信息文檔的大概內(nèi)容。而文本式關(guān)鍵詞及其頻率或權(quán)重數(shù)據(jù)讓人感覺平淡無奇、枯燥乏味,詞云是一種新的數(shù)據(jù)可視化[1]方式之一,能夠快速地篩選出重要文本信息,對文本中出現(xiàn)頻率較高的詞語或權(quán)重大的詞語予以視覺上的突出,這樣不僅可以形象化地呈現(xiàn)文本,把關(guān)鍵詞以豐富的圖片視覺效果的形式展現(xiàn)出來,使文本具有視覺沖擊力,突出關(guān)鍵的數(shù)據(jù),并能夠反映出數(shù)據(jù)的本質(zhì)問題,有效提升數(shù)據(jù)分析的效率,幫助廣大讀者快速地抓住信息的要點,進(jìn)行閱讀前的篩選。
1 PyQt5概述
PyQt5[2]是基于Digia公司強(qiáng)大圖形框架Qt5的python接口,由一組python模塊構(gòu)成。PyQt5擁有多個類和函數(shù)??梢栽赨nix、 Windows和 Mac OS等多個平臺運(yùn)行,常用界面設(shè)計有三大模塊:一是QtCore模塊,其涵蓋了核心的非GUI功能,此模塊主要用于程序處理中涉及的目錄、文件、數(shù)據(jù)類型、文本流、time、mime、進(jìn)程或線程等對象;二是QtGui模塊,該模塊包括多種處理基本圖形功能的類,涵蓋但不限于:界面設(shè)計、事件處理、基本圖像、2D圖形和文本字體等;三是QtWidgets模塊,該模塊包含了一整套UI元素組件,用于設(shè)計多種系統(tǒng)風(fēng)格的界面,操作方便。
2詞云制作基礎(chǔ)知識
詞云制作常用2種方法,一是利用wordcloud包[3]制作,python利用這個wordcloud包可以快速進(jìn)行詞云繪制,wordcloud包好學(xué)易懂、使用較為簡單、繪圖相對靈活、可自行設(shè)置背景圖片和指定使用字體。二是利用pyecharts[4]包制作,pyecharts是一款將python與echarts結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具,是一個用于生成 Echarts 圖表的類庫。Echarts 是百度開源的一個數(shù)據(jù)可視化 JS 庫。用 Echarts 生成的圖可視化效果非常好。本文應(yīng)用pyecharts包進(jìn)行詞云html文件生成,再用QtWebEngineWidgets網(wǎng)頁組件展示詞云,其優(yōu)點是形狀各異、漂亮美觀,同時用鼠標(biāo)放在關(guān)鍵詞上會顯示其頻率或權(quán)重。
2.1詞云繪制函數(shù)
add( ) 函數(shù)[5],這是pyecharts工具進(jìn)行詞云繪制的主要函數(shù),用于添加詞云的數(shù)據(jù)和設(shè)置各種配置,參數(shù)項較多,常用參數(shù)如下:
series_name:str,系列名稱(必選參數(shù)),用于 tooltip 的顯示,legend 的圖例篩選;
data_pair:Sequence,系列數(shù)據(jù)項(必選參數(shù)),參數(shù)類型為以二元素元組對象構(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ù)支持本地文件路徑(相對或者絕對路徑都支持);
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ū)域為[-90, 90]。
2.2詞云文件渲染函數(shù)
render( ) 函數(shù),該函數(shù)將會在默認(rèn)根目錄下生成一個*.html 的文件,支持存放詞云的文件路徑參數(shù),設(shè)置文件保存位置,如 render("e:\html\my_wordcloud.html"),保存的*.html文件默認(rèn)用瀏覽器打開,文章中設(shè)計的詞云制作軟件用QtWebEngineWidgets網(wǎng)頁組件展示。
3 詞云制作軟件功能流程圖設(shè)計
根據(jù)詞云制作需求,設(shè)計其功能流程圖如圖1:
4詞云制作軟件界面設(shè)計
界面分三部分,一是文本處理區(qū)域,由選擇文件和文本讀取相應(yīng)功能組件構(gòu)成;二是設(shè)置關(guān)鍵詞及詞云參數(shù)區(qū)域,由設(shè)置各項參數(shù)的相應(yīng)功能組件構(gòu)成;三是詞云展示區(qū)域,由瀏覽詞云網(wǎng)頁組件和相應(yīng)功能組件構(gòu)成。
5詞云制作軟件功能實現(xiàn)
5.1文本讀取
一是從文件讀取文本,通過文件瀏覽進(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)
# 過濾停用詞
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è)計的詞云制作軟件使用from pyecharts.charts import WordCloud導(dǎo)入詞云制作模塊。
5.3.2關(guān)鍵詞數(shù)據(jù)轉(zhuǎn)換
通過lda模型提取的關(guān)鍵詞數(shù)據(jù)如果直接作為詞云制作函數(shù)add的參數(shù),會出現(xiàn)如下錯誤:Uncaught TypeError:Failed to execute 'getImageData' on 'CanvasRenderingContext2D':Value is not of type 'long',由于對短文本使用gensim.models中的LdaModel函數(shù)進(jìn)行關(guān)鍵詞提取后返回的數(shù)據(jù)類型是list對象,其元素為二元素元組對象,該二元素元組對象的0元素為字符串類型,1元素為long類型,但wordcloud包的add函數(shù)不能接收二元素元組對象的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詞云制作對象實例化
關(guān)鍵詞權(quán)重數(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)) 實例化詞云制作對象。
5.3.4詞云文件渲染
#默認(rèn)用日期和時間生成不重復(fù)文件名稱(用戶也可根據(jù)自己的需要進(jìn)行命名修改)
file_name="images/"+time.strftime("%Y%m%d_%H%M%S")+".html"
#渲染詞云文件
worldcloud.render(file_name)
5.4詞云展示
本軟件使用PyQt5的QtWebEngineWidgets組件通過讀取詞云html文件進(jìn)行詞云展示。
5.4.1導(dǎo)入加載頁面功能模塊
不同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:
# 保存文件對話框
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條、科技信息和時尚信息的關(guān)鍵詞提取及詞云繪制應(yīng)用示例。
7結(jié)束語
基于Python語言的詞云生成[8]相對簡單,代碼簡潔高效,然而完整的詞云制作需要利用多個功能模塊,每個功能模塊均有各自的特定函數(shù),相對獨(dú)立的函數(shù)功能復(fù)雜,參數(shù)眾多并設(shè)置煩瑣,編寫和調(diào)試代碼難度較大,因此它需要特定的專業(yè)知識和編程能力,對于一般人員這是一個巨大的難題。文章研究在Python(3.7.1 )+PyQt5(5.15.2)+jieba (0.42.1 )+gensim(3.8.1)+pyecharts( 1.9.0)環(huán)境下設(shè)計的詞云制作軟件能快速提取關(guān)鍵詞并繪制詞云,相比一般的詞云制作,該軟件在可視化窗體下快速提取關(guān)鍵詞并用網(wǎng)頁組件展示詞云的html文件,既有動態(tài)效果,又能查看關(guān)鍵詞權(quán)重,實現(xiàn)了閱讀者要快速掌握信息概要及詞云展示的需求。
參考文獻(xiàn):
[1] 朱滌塵,夏換,楊秀璋,等.基于文本挖掘和決策樹分析的中國手游產(chǎn)業(yè)發(fā)展研究[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)物研究熱點分析[J].中國新藥雜志,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ī)(專業(yè)版),2018(34):86-89.
[7] 肖元君,吳國文.基于Gensim的摘要自動生成算法研究與實現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2019,36(12):131-136.
[8] 潘亞星.基于Python的詞云生成研究——以柴靜的《看見》為例[J].電腦知識與技術(shù),2019,15(24):8-10.
【通聯(lián)編輯:謝媛媛】