宋永生 黃蓉美 王軍
摘? 要:數(shù)據(jù)分析與可視化有助于人們從繁雜的數(shù)據(jù)中快速獲取有用的信息。利用Python中的Pandas對(duì)結(jié)構(gòu)化數(shù)據(jù)進(jìn)行分析,采用Matplotlib進(jìn)行圖表展示;從非結(jié)構(gòu)化數(shù)據(jù)中提取文本,利用Jieba對(duì)文本進(jìn)行分詞處理,利用Wordcloud進(jìn)行詞云展示。利用Flask對(duì)上述圖表及詞云進(jìn)行Web發(fā)布,構(gòu)建數(shù)據(jù)分析與可視化平臺(tái),成本較低,簡(jiǎn)便易用。
關(guān)鍵詞:可視化;Pandas;Matplotlib;Jieba;Wordcloud;
中圖分類號(hào):TP312.1? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2019)21-0007-03
Abstract:Data analysis and visualization can help people get useful information from complex data quickly. We use Pandas in Python to analyze the structured data,and use Matplotlib to display the charts;we extract the text from the unstructured data,use Jieba to segment the text,and use Wordcloud to display the word cloud. Flask is used to publish the above charts and word cloud on the Web and build a data analysis and visualization platform,which is low cost and easy to use.
Keywords:visualization;Pandas;Matplotlib;Jieba;Wordcloud
0? 引? 言
近年來(lái),隨著信息技術(shù)的飛速發(fā)展,各種應(yīng)用系統(tǒng)如雨后春筍般涌現(xiàn)。高校中的軟件系統(tǒng)主要有教務(wù)系統(tǒng)、辦公系統(tǒng)及學(xué)工系統(tǒng)等,這些系統(tǒng)的數(shù)據(jù)主要是存儲(chǔ)于數(shù)據(jù)庫(kù)中的結(jié)構(gòu)化數(shù)據(jù)。電腦或服務(wù)器上則存放著大量的視頻、PPT課件、PDF文檔、Word文檔等非結(jié)構(gòu)化數(shù)據(jù)。隨著時(shí)間的推移,各類非結(jié)構(gòu)化數(shù)據(jù)及結(jié)構(gòu)化數(shù)據(jù)越來(lái)越多。非結(jié)構(gòu)化數(shù)據(jù)以文件的形式進(jìn)行存儲(chǔ),比較零碎,不便于檢索。這些數(shù)據(jù)中蘊(yùn)含的有用信息得不到充分利用,數(shù)據(jù)分析的需求越來(lái)越大。數(shù)據(jù)分析是指采用一定的方法對(duì)收集到的數(shù)據(jù)進(jìn)行分析,提取其中有用信息的過(guò)程。數(shù)據(jù)可視化是采用圖表等方式對(duì)數(shù)據(jù)進(jìn)行展示,有助于人們進(jìn)行決策。
目前數(shù)據(jù)分析商用軟件有Matlab、SPSS和SAS,然而這些軟件費(fèi)用高昂,安裝包較大,安裝過(guò)程復(fù)雜[1]。Python是一種面向?qū)ο蟮目缙脚_(tái)解釋型高級(jí)程序設(shè)計(jì)語(yǔ)言,Python語(yǔ)言簡(jiǎn)潔明了、便于擴(kuò)展,具有龐大的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù),生態(tài)極為豐富。越來(lái)越多的研究人員開(kāi)始使用Python進(jìn)行數(shù)據(jù)分析,Python也逐漸成為數(shù)據(jù)分析領(lǐng)域的首選工具[2]。
本文嘗試采用Python中的數(shù)據(jù)分析及可視化庫(kù),以較小的成本構(gòu)建數(shù)據(jù)分析與可視化平臺(tái)。Pandas是一種基于NumPy的高效結(jié)構(gòu)化數(shù)據(jù)分析工具,它在NumPy的基礎(chǔ)上提供了DataFrame數(shù)據(jù)結(jié)構(gòu),并以此為核心提供了大量的數(shù)據(jù)的輸入輸出、清洗、處理和分析函數(shù)。結(jié)構(gòu)化數(shù)據(jù)的可視化可以借助Matplotlib實(shí)現(xiàn)。非結(jié)構(gòu)化數(shù)據(jù)主要有視頻、PPT課件、PDF文檔及Word文檔等。為了便于分析,本文嘗試對(duì)視頻、PPT課件、PDF文檔、Word文檔這些非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行轉(zhuǎn)換,提取其中的文本,借助Jieba對(duì)文本首先進(jìn)行分詞處理,然后借助Wordcloud以詞云的方式進(jìn)行展示。Matplotlib生成的圖表及Wordcloud生成的詞云都為本地文件,需要借助于Flask進(jìn)行發(fā)布,便于在瀏覽器上進(jìn)行展示。
1? 平臺(tái)總體架構(gòu)
數(shù)據(jù)分析與可視化平臺(tái)分為數(shù)據(jù)采集模塊、數(shù)據(jù)分析模塊及分析結(jié)果展示模塊三個(gè)部分。平臺(tái)采用Python 3.5進(jìn)行開(kāi)發(fā),Web開(kāi)發(fā)框架選用Flask,數(shù)據(jù)庫(kù)選用MySQL。結(jié)構(gòu)化數(shù)據(jù)的分析采用Pandas,可視化選用Matplotlib;非結(jié)構(gòu)化數(shù)據(jù)的分詞處理采用Jieba,詞云展示采用Wordcloud。集成開(kāi)發(fā)環(huán)境選用PyCharm 2018。
2? 數(shù)據(jù)處理流程
數(shù)據(jù)分析與可視化平臺(tái)中的數(shù)據(jù)處理流程如圖1所示。
3? 結(jié)構(gòu)化數(shù)據(jù)處理
3.1? 數(shù)據(jù)采集及預(yù)處理
在數(shù)據(jù)分析之前,首先需要采集數(shù)據(jù),可以使用Pandas中的read_sql函數(shù)從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。Pandas中的DataFrame有行索引和列索引,使用DataFrame來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)十分方便。常用的數(shù)據(jù)庫(kù)有Oracle、SQL Server及MySQL等,Pandas可以通過(guò)相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)直接連接這些數(shù)據(jù)庫(kù),將數(shù)據(jù)讀入DataFrame中。為了便于數(shù)據(jù)分析,可以將業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)的連接字符串存入數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中,并在業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的視圖。此外,Pandas可以通過(guò)read_excel函數(shù)讀取Excel文件中的數(shù)據(jù)。
采集來(lái)的數(shù)據(jù)經(jīng)常存在一些問(wèn)題,比如數(shù)據(jù)缺失、數(shù)據(jù)重復(fù)及數(shù)據(jù)異常。在正式的數(shù)據(jù)分析之前,需要對(duì)這些存在問(wèn)題的數(shù)據(jù)進(jìn)行預(yù)處理。對(duì)于數(shù)據(jù)缺失常采用刪除或填充操作,數(shù)據(jù)重復(fù)一般做刪除操作。分析數(shù)據(jù)異常值出現(xiàn)原因,然后對(duì)其刪除、填充或校正。
3.2? 數(shù)據(jù)分析
數(shù)據(jù)分析先要熟悉數(shù)據(jù),可以通過(guò)Pandas中的head預(yù)覽前幾行,利用shape獲取數(shù)據(jù)表大小,利用info獲取數(shù)據(jù)類型,利用describe獲取數(shù)值分布情況。把需要分析的數(shù)據(jù)篩選出來(lái),進(jìn)行數(shù)據(jù)運(yùn)算、數(shù)據(jù)分組及聯(lián)合查詢等操作。利用Pandas的to_sql函數(shù)可以將分析結(jié)果寫入數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中,便于在瀏覽器上展示。
3.3? 數(shù)據(jù)可視化
Matplotlib是Python中最著名的繪圖庫(kù),可以繪制各種精美的圖表,以硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。Matplotlib提供了一整套和Matlab相似的命令A(yù)PI,文檔相當(dāng)完備,十分適合交互式繪圖,可以快速生成柱狀圖、散點(diǎn)圖、餅狀圖、折線圖、等值線圖和三角網(wǎng)格等。Matplotlib可以將Pandas的分析結(jié)果直接可視化,也可以從數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)進(jìn)行可視化。
4? 非結(jié)構(gòu)化數(shù)據(jù)處理
4.1? 非結(jié)構(gòu)化數(shù)據(jù)的采集及預(yù)處理
視頻、PDF文檔、Word文檔、PPT文檔等非結(jié)構(gòu)化數(shù)據(jù)多以文件的形式存儲(chǔ),文件繁多瑣碎,檢索非常麻煩。對(duì)于非結(jié)構(gòu)化數(shù)據(jù),為了便于分析,可以提取其文本內(nèi)容,然后對(duì)文本內(nèi)容進(jìn)行分析處理。對(duì)視頻文件,可以利用Python中的MoviePy庫(kù),從視頻文件中抽取音頻,然后調(diào)用訊飛開(kāi)放平臺(tái)的語(yǔ)音轉(zhuǎn)寫功能,將語(yǔ)音轉(zhuǎn)為文本;對(duì)于PDF文件,可以利用Python中的pdfminer3k庫(kù),提取PDF文件中的文本內(nèi)容;對(duì)于Word文檔文件,可以利用Python中的python-docx庫(kù)提取Word文檔中的文本內(nèi)容;對(duì)于PPT課件,可以利用Python中的python-pptx庫(kù)提取PPT中的文本內(nèi)容。
4.2? 詞頻統(tǒng)計(jì)并進(jìn)行可視化
漢語(yǔ)以字為基本書寫單位,詞語(yǔ)之間沒(méi)有明顯的區(qū)分標(biāo)記。中文文本的詞頻統(tǒng)計(jì),首先需要進(jìn)行分詞處理,自動(dòng)地對(duì)中文文本進(jìn)行詞語(yǔ)的切分[3]。Jieba是Python中一個(gè)常用的中文分詞庫(kù),利用詞庫(kù)將需要分詞的內(nèi)容與詞庫(kù)進(jìn)行對(duì)比,找到最大概率的詞組。Jieba支持精確模式、全模式及搜索引擎模式等三種中文分詞模式,支持繁體分詞及自定義詞典,以便包含Jieba詞庫(kù)里沒(méi)有的詞。雖然Jieba有新詞識(shí)別能力,但自行添加新詞可以保證更高的正確率。
詞云,也叫文字云,以詞語(yǔ)為單位,對(duì)文本中出現(xiàn)頻率較高的關(guān)鍵詞予以視覺(jué)上的突出展現(xiàn),對(duì)關(guān)鍵詞進(jìn)行渲染,形成類似云的彩色圖片。詞云可以過(guò)濾掉大量低頻低質(zhì)的文本信息,使得瀏覽者只要一眼掃過(guò)就可領(lǐng)略文本的主旨。詞云已成為文本數(shù)據(jù)可視化的一種常用方式[4]。Wordcloud是Python中一個(gè)根據(jù)文本生成詞云的庫(kù)。通過(guò)詞云圖,一眼掃過(guò)便知道視頻、PDF、Word、PPT等非結(jié)構(gòu)化數(shù)據(jù)的主要內(nèi)容是什么。為了便于對(duì)非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行管理,將非結(jié)構(gòu)化數(shù)據(jù)文件、對(duì)應(yīng)文本、詞云圖等文件的路徑信息,出現(xiàn)頻率較高的關(guān)鍵詞存入數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中。
5? 將圖像進(jìn)行Web發(fā)布
由于Matplotlib生成的圖表及Wordcloud生成的詞云圖都是本地圖像,不便于用戶在遠(yuǎn)程通過(guò)瀏覽器查看,因此需要將已生成的圖表及詞云圖進(jìn)行Web發(fā)布。Flask是一個(gè)小而精的輕量級(jí)Web框架,其WSGI工具箱采用Werkzeug,模板引擎使用Jinja2。Flask不包含數(shù)據(jù)庫(kù)的抽象訪問(wèn)層。Flask-SQLAlchemy是一個(gè)Flask擴(kuò)展,在SQLAlchemy基礎(chǔ)上,簡(jiǎn)化了在Flask程序中使用SQLAlchemy的操作。通過(guò)Flask-SQLAlchemy,可以方便地對(duì)數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行操作。
對(duì)于結(jié)構(gòu)化數(shù)據(jù),為了便于客戶端瀏覽器的交互,客戶端選擇圖表類型、參數(shù)及待可視化的數(shù)據(jù),服務(wù)器端根據(jù)參數(shù)等生成相應(yīng)的圖表。由于圖表隨著客戶端的參數(shù)等的變化而變化,所以圖表不宜保存在服務(wù)器磁盤上,而是在內(nèi)存中直接將Matplotlib生成的圖表經(jīng)過(guò)Base64編碼,傳輸?shù)絎eb頁(yè)面中,減少服務(wù)器的IO操作,提高了系統(tǒng)的響應(yīng)速度。
# 寫入內(nèi)存,使用BytesIO對(duì)象將png圖像的內(nèi)容保存在內(nèi)存中
buf =BytesIO()
plt.savefig(buf , format='png')
# 內(nèi)存中的圖像buf轉(zhuǎn)換為base64編碼
save_file_base64 = base64.b64encode(buf.getvalue()).decode('utf8')
data = base64.encodebytes(buf.getvalue()).decode('utf-8')
plt.close()
buf.close()
return html.format(data)
對(duì)于非結(jié)構(gòu)化數(shù)據(jù),用戶可以通過(guò)瀏覽器上傳或指定服務(wù)器上待分析的非結(jié)構(gòu)化數(shù)據(jù)。服務(wù)器端首先從非結(jié)構(gòu)化數(shù)據(jù)中提取文本信息,然后對(duì)文本進(jìn)行詞頻統(tǒng)計(jì)并生成詞云。由于非結(jié)構(gòu)化數(shù)據(jù)對(duì)應(yīng)文本的詞云是固定的,所以將詞云圖保存在服務(wù)器端。瀏覽器端發(fā)起請(qǐng)求后,在Flask的Web頁(yè)面中直接加載這些生成好的詞云圖返回給瀏覽器。此外還需利用Flask實(shí)現(xiàn)服務(wù)器上的非結(jié)構(gòu)化數(shù)據(jù)的Web檢索功能。
6? 實(shí)驗(yàn)分析
本文服務(wù)器選用華為云服務(wù)器,配置為8核CPU,32GB內(nèi)存,1TB SSD磁盤,100Mbps帶寬,操作系統(tǒng)選用CentOS7.5 64位,安裝MySQL 5.6、Python 3.5、Pip9.0、Pandas 0.22、Matplotlib 2.2、Jieba 0.39、Wordcloud 1.5、Flask1.0、Flask-SQLAlchemy 2.0、各種非結(jié)構(gòu)化數(shù)據(jù)的文本提取庫(kù)及數(shù)據(jù)庫(kù)驅(qū)動(dòng)等,采用Gunicorn 19.8做WSGI容器來(lái)部署Flask程序,Web服務(wù)器選用Nginx 1.12。
在結(jié)構(gòu)化數(shù)據(jù)分析中,用戶可以選擇待可視化的數(shù)據(jù)及圖表類型,比如用柱狀圖展示招生數(shù)據(jù),然后選擇生源地、起始年份及結(jié)束年份,即可獲得不同年份的招生人數(shù)柱狀圖,如圖2所示。
在非結(jié)構(gòu)化數(shù)據(jù)分析中,用戶可以上傳非結(jié)構(gòu)化數(shù)據(jù)或選擇服務(wù)器上的非結(jié)構(gòu)化數(shù)據(jù),比如上傳《2019年政府工作報(bào)告》PDF文檔,服務(wù)器端提取該P(yáng)DF文檔的文本內(nèi)容,對(duì)文本內(nèi)容分詞處理之后進(jìn)行詞頻統(tǒng)計(jì),以詞云的方式對(duì)其展示,如圖3所示。用戶還可以通過(guò)關(guān)鍵詞檢索服務(wù)器上的非結(jié)構(gòu)化數(shù)據(jù)。
7? 結(jié)? 論
面對(duì)越來(lái)越多的結(jié)構(gòu)化數(shù)據(jù)及非結(jié)構(gòu)化數(shù)據(jù),數(shù)據(jù)分析和可視化變得非常必要。本文利用Python構(gòu)建了數(shù)據(jù)分析與可視化平臺(tái)??捎蓪I(yè)數(shù)據(jù)分析人員利用Pandas對(duì)結(jié)構(gòu)化數(shù)據(jù)進(jìn)行預(yù)處理并分析,分析結(jié)果存入數(shù)據(jù)分析與可視化平臺(tái)的數(shù)據(jù)庫(kù)中,利用Matplotlib進(jìn)行數(shù)據(jù)的可視化,并將圖表通過(guò)Flask發(fā)布。用戶在瀏覽器上選擇待可視化的結(jié)構(gòu)化數(shù)據(jù)、圖表類型及參數(shù),即可在瀏覽器中查看該結(jié)構(gòu)化數(shù)據(jù)的圖表。用戶上傳待分析的非結(jié)構(gòu)化數(shù)據(jù),服務(wù)器端自動(dòng)將其轉(zhuǎn)換文本,對(duì)文本進(jìn)行詞頻統(tǒng)計(jì),以詞云的方式對(duì)其進(jìn)行展示,在瀏覽器中可以查看詞云圖。為了便于對(duì)非結(jié)構(gòu)化數(shù)據(jù)的管理,將非結(jié)構(gòu)化數(shù)據(jù)、對(duì)應(yīng)的文本、詞云圖的路徑信息及出現(xiàn)頻率較高的關(guān)鍵詞存入數(shù)據(jù)庫(kù),利用Flask實(shí)現(xiàn)非結(jié)構(gòu)化數(shù)據(jù)檢索功能。
本文只提取視頻的音頻部分對(duì)應(yīng)的文本內(nèi)容,可能會(huì)丟棄很多有用的信息,未來(lái)可以利用深度學(xué)習(xí)技術(shù)對(duì)視頻等非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行深入的分析與挖掘。
參考文獻(xiàn):
[1] 宋永生,吳新華.基于Python的Moodle學(xué)習(xí)平臺(tái)日志分析 [J].計(jì)算機(jī)時(shí)代,2018(10):19-21+25.
[2] 張若愚.Python科學(xué)計(jì)算:第2版 [M].北京:清華大學(xué)出版社,2016.
[3] 祝永志,荊靜.基于Python語(yǔ)言的中文分詞技術(shù)的研究 [J].通信技術(shù),2019,52(7):1612-1619.
[4] 嚴(yán)明,鄭昌興.Python環(huán)境下的文本分詞與詞云制作 [J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2018(34):86-89.
作者簡(jiǎn)介:宋永生(1984-),男,漢族,江蘇徐州人,就職于圖文信息中心,教師,工程師,碩士,研究方向:機(jī)器學(xué)習(xí)及物聯(lián)網(wǎng)技術(shù)研究。