姜华林
摘要:文章基于PyQt5界面设计,python编程语言调用第三方库WordCloud设计词云制作软件,通过文件选择提取关键词及词云绘制,用QtWebEngineWidgets网页组件展示词云,把海量的数据以丰富的视觉效果呈现出来凸显关键词及其频率或权重,能帮助阅读者快速抓住信息的要点。
关键词:PyQt5;窗体界面;WordCloud;词云;关键词权重
中图分类号:TP311 文献标识码: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
在当前信息大爆炸时代,人们在获取信息时都希望快速了解信息文档的概述,总想通过其关键词来获知信息文档的大概内容。而文本式关键词及其频率或权重数据让人感觉平淡无奇、枯燥乏味,词云是一种新的数据可视化[1]方式之一,能够快速地筛选出重要文本信息,对文本中出现频率较高的词语或权重大的词语予以视觉上的突出,这样不仅可以形象化地呈现文本,把关键词以丰富的图片视觉效果的形式展现出来,使文本具有视觉冲击力,突出关键的数据,并能够反映出数据的本质问题,有效提升数据分析的效率,帮助广大读者快速地抓住信息的要点,进行阅读前的筛选。
1 PyQt5概述
PyQt5[2]是基于Digia公司强大图形框架Qt5的python接口,由一组python模块构成。PyQt5拥有多个类和函数。可以在Unix、 Windows和 Mac OS等多个平台运行,常用界面设计有三大模块:一是QtCore模块,其涵盖了核心的非GUI功能,此模块主要用于程序处理中涉及的目录、文件、数据类型、文本流、time、mime、进程或线程等对象;二是QtGui模块,该模块包括多种处理基本图形功能的类,涵盖但不限于:界面设计、事件处理、基本图像、2D图形和文本字体等;三是QtWidgets模块,该模块包含了一整套UI元素组件,用于设计多种系统风格的界面,操作方便。
2词云制作基础知识
词云制作常用2种方法,一是利用wordcloud包[3]制作,python利用这个wordcloud包可以快速进行词云绘制,wordcloud包好学易懂、使用较为简单、绘图相对灵活、可自行设置背景图片和指定使用字体。二是利用pyecharts[4]包制作,pyecharts是一款将python与echarts结合的强大的数据可视化工具,是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的圖可视化效果非常好。本文应用pyecharts包进行词云html文件生成,再用QtWebEngineWidgets网页组件展示词云,其优点是形状各异、漂亮美观,同时用鼠标放在关键词上会显示其频率或权重。
2.1词云绘制函数
add( ) 函数[5],这是pyecharts工具进行词云绘制的主要函数,用于添加词云的数据和设置各种配置,参数项较多,常用参数如下:
series_name:str,系列名称(必选参数),用于 tooltip 的显示,legend 的图例筛选;
data_pair:Sequence,系列数据项(必选参数),参数类型为以二元素元组对象构成的列表;
shape:str = "circle",词云轮廓(可选参数,默认为“circle”),有“circle”“cardioid”“diamond”“triangle-forward”“triangle”“pentagon”和“star”七种词云轮廓可供选择;
mask_image:types.Optional[str] = None,自定义的图片(可选参数,目前支持 jpg、 jpeg、png和 ico 的格式),该参数支持本地文件路径(相对或者绝对路径都支持);
word_gap:Numeric = 20,单词间隔(可选参数,默认为20);
word_size_range=None,单词字体大小范围(可选参数,默认为[12, 60]);
rotate_step:Numeric = 45,单词旋转角度(可选参数,默认为45),单词旋转角度的设置区域为[-90, 90]。
2.2词云文件渲染函数
render( ) 函数,该函数将会在默认根目录下生成一个*.html 的文件,支持存放词云的文件路径参数,设置文件保存位置,如 render("e:\html\my_wordcloud.html"),保存的*.html文件默认用浏览器打开,文章中设计的词云制作软件用QtWebEngineWidgets网页组件展示。
3 词云制作软件功能流程图设计
根据词云制作需求,设计其功能流程图如图1:
4词云制作软件界面设计
界面分三部分,一是文本处理区域,由选择文件和文本读取相应功能组件构成;二是设置关键词及词云参数区域,由设置各项参数的相应功能组件构成;三是词云展示区域,由浏览词云网页组件和相应功能组件构成。
5词云制作软件功能实现
5.1文本读取
一是从文件读取文本,通过文件浏览进行文件选择,可读取*.txt、*.docx、*.doc和*.pdf四种文件的文本内容;二是直接复制短文本到界面的文本内容框中。其主要代码如下:
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文本数据处理及关键词提取
将读取的文本使用jieba[6]的精确模式分词后再进行停用词处理,然后再用gensim[7]的 LdaModel模块提取文本相应的关键词。其主要代码如下:
# 使用jieba分词
sentences=[]
segs=jieba.lcut(text)
# 过滤停用词
segs = list(filter(lambda x:x not in stop_word, segs))
sentences.append(segs)
# 构建词袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# 用lda模型提取关键词
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=1)
list_tmp=lda.show_topic(0, topn=self.wordnum)
5.3词云制作
5.3.1 导入词云模块
不同版本导入模块方式不同,文章中设计的词云制作软件使用from pyecharts.charts import WordCloud导入词云制作模块。
5.3.2关键词数据转换
通过lda模型提取的关键词数据如果直接作为词云制作函数add的参数,会出现如下错误:Uncaught TypeError:Failed to execute 'getImageData' on 'CanvasRenderingContext2D':Value is not of type 'long',由于对短文本使用gensim.models中的LdaModel函数进行关键词提取后返回的数据类型是list对象,其元素为二元素元组对象,该二元素元组对象的0元素为字符串类型,1元素为long类型,但wordcloud包的add函数不能接收二元素元组对象的long类型,因此要进行数据转换,其代码如下:
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词云制作对象实例化
关键词权重数据转换后用代码
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词云文件渲染
#默认用日期和时间生成不重复文件名稱(用户也可根据自己的需要进行命名修改)
file_name="images/"+time.strftime("%Y%m%d_%H%M%S")+".html"
#渲染词云文件
worldcloud.render(file_name)
5.4词云展示
本软件使用PyQt5的QtWebEngineWidgets组件通过读取词云html文件进行词云展示。
5.4.1导入加载页面功能模块
不同PyQt5版本的QtWebEngineWidgets模块导入不相同,本软件导入模块代码为:
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词云保存
# 导入输出图片工具
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词云应用示例
应用词云制作软件提取关键词和绘制词云方便快捷,如下图2、图3和图4分别是职业教育20条、科技信息和时尚信息的关键词提取及词云绘制应用示例。
7结束语
基于Python语言的词云生成[8]相对简单,代码简洁高效,然而完整的词云制作需要利用多个功能模块,每个功能模块均有各自的特定函数,相对独立的函数功能复杂,参数众多并设置烦琐,编写和调试代码难度较大,因此它需要特定的专业知识和编程能力,对于一般人员这是一个巨大的难题。文章研究在Python(3.7.1 )+PyQt5(5.15.2)+jieba (0.42.1 )+gensim(3.8.1)+pyecharts( 1.9.0)环境下设计的词云制作软件能快速提取关键词并绘制词云,相比一般的词云制作,该软件在可视化窗体下快速提取关键词并用网页组件展示词云的html文件,既有动态效果,又能查看关键词权重,实现了阅读者要快速掌握信息概要及词云展示的需求。
参考文献:
[1] 朱涤尘,夏换,杨秀璋,等.基于文本挖掘和决策树分析的中国手游产业发展研究[J].计算机科学,2020,47(S1):530-534.
[2] PYQT5介绍[EB/OL].[2020-08-20].https://blog.csdn.net/cheng_5230/article/details/84065657.
[3] 倪冰苇,赵鸿萍,顾月清.基于词云图和层次聚类的天然产物研究热点分析[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] 严明,郑昌兴.Python环境下的文本分词与词云制作[J].现代计算机(专业版),2018(34):86-89.
[7] 肖元君,吴国文.基于Gensim的摘要自动生成算法研究与实现[J].计算机应用与软件,2019,36(12):131-136.
[8] 潘亚星.基于Python的词云生成研究——以柴静的《看见》为例[J].电脑知识与技术,2019,15(24):8-10.
【通聯编辑:谢媛媛】