祝永志,荊 靜
(曲阜師范大學 信息科學與工程學院,山東 日照 276826)
Python是當今最熱門的編程語言之一,僅次于Java語言、C語言。國內(nèi)的知名互聯(lián)網(wǎng)企業(yè)也有很多使用python語言搭建的,比如網(wǎng)易、豆瓣等。由于很多公司使用Python進行開發(fā)和其他工作,導致Python招聘相關工作崗位的范圍很廣,涉及到從后臺維護到前端開發(fā)。Python適用于數(shù)據(jù)科學方面,比如數(shù)據(jù)采集、數(shù)據(jù)分析和數(shù)據(jù)可視化等,社會發(fā)展的需求也是Python熱門的原因之一。
用高級語言編程可以大大提高生產(chǎn)力的想法并不新鮮,當今社會各個領域都離不開數(shù)據(jù)的支持,獲取和充分利用數(shù)據(jù)是一個巨大的問題,而Python就是一門可以解決這種問題的高級編程語言。Python爬蟲是眾多數(shù)據(jù)來源渠道中重要的一條,運用它可以提供優(yōu)質(zhì)和價值豐富的數(shù)據(jù)集[1]。除了獲取數(shù)據(jù),Python在后續(xù)的數(shù)據(jù)處理等過程中也展現(xiàn)出了巨大的優(yōu)勢,它的應用范圍十分廣泛,幾乎覆蓋了整個程序設計的領域[2]。在本文中首先運用Python爬蟲爬取新聞網(wǎng)頁數(shù)據(jù),為后續(xù)實驗提供文本數(shù)據(jù),然后對文本進行切分,對切分結(jié)果進行去除停用詞處理后對分詞進行了加權處理篩選出關鍵詞,在加權時采用了TF-IDF算法和TextRank算法對分詞的重要性進行計算,根據(jù)加權結(jié)果提取出關鍵詞,最后運用WordCloud庫采用詞云的方式對關鍵詞進行展現(xiàn)。數(shù)據(jù)的獲取和分析處理過程都程序化,不僅可以節(jié)省時間,使得閱讀過程更加方便快捷,而且可以迅速地從中文文本中提取到高價值的信息。
Python作為當今最熱門的編程語言之一,它的應用場景很多,比如科學計算,軟件的開發(fā)與維護等等,Python已經(jīng)是當前熱門領域中不可或缺的編程語言,比如云計算、網(wǎng)絡爬蟲、人工智能等等。在當今熱門的語言中,Python的優(yōu)勢主要體現(xiàn)在以下兩點:
(1)易于學習,開源,高級語言,可移植性,可解釋性,面向?qū)ο?,可擴展性,豐富的庫和規(guī)范的代碼。
(2)具有一個強大的標準庫和許多功能豐富的第三方庫,這些使得開發(fā)過程更簡單,這些庫可以應用于學計算、數(shù)據(jù)分析等多個領域[3],對這些庫的熟練使用會使開發(fā)過程變得更簡便和高效。標準庫包含的功能有很多,比如文本處理和操作系統(tǒng)功能調(diào)用等。
結(jié)巴分詞(Jieba)作為一個強大的分詞庫,它的開發(fā)者通過大量的訓練后,向其錄入了有兩萬多條詞組成了基本的庫,不僅如此,jieba的實現(xiàn)原理也比較完善,設計的算法有基于前綴詞典的有向無環(huán)圖、動態(tài)規(guī)劃、HMM模型等[4]。jieba分詞支持三種分詞模式:
(1)精確模式,此模式試圖以最高精度來對句子進行劃分,適用于文本分析;
(2)全模式,此模式可以掃描出句中全部可成詞的詞語,并且速度很快,但它并不可以解決歧義問題;
(3)搜索引擎模式,此模式基于精確模式對長詞在進行切分,可以將此模式用于搜索引擎分詞[5]。
Jieba分詞的jieba.cut()方法有三個參數(shù):字符串,cut_all,HMM(Hidden Markov Model,隱馬爾可夫模型)參數(shù)。其中字符串是待分詞的實驗文本,第二個參數(shù)cut_all=True時使用全模式,當指定cut_all=False時為精確模式。圖1展示了不同模式的使用方法和分詞結(jié)果。
圖1 jieba分詞模式
Python爬蟲就是用Python編程實現(xiàn)的網(wǎng)絡爬蟲,Python擁有很多可用于爬蟲的第三方包和框架,可以輕松地實現(xiàn)爬蟲功能[6]。用Python來寫爬蟲程序不僅爬取速度快,處理各種爬蟲問題也很方便。Python爬蟲的用處有很多,比如各種數(shù)據(jù)聚合的網(wǎng)站像搜索引擎和信息對比的網(wǎng)站等都運用了爬蟲技術。
Python有兩個十分強大的第三方庫常用于寫爬蟲程序,一個是requests,另一個是BeautifulSoup。Requests是一個簡單易用的HTTP庫,包含了大多數(shù)HTTP功能。BeautifulSoup是一個網(wǎng)頁解析庫,最主要的功能就是在網(wǎng)頁上抓取數(shù)據(jù),它能夠很容易的提取出HTML或者XML標簽中的內(nèi)容。Python爬蟲的架構(gòu)主要是由URL管理器,網(wǎng)頁下載器和網(wǎng)頁解析器這三個部分組成。其中URL管理器負責管理將要抓取和已經(jīng)抓取網(wǎng)頁的url集合。網(wǎng)頁下載器用于爬取相應的網(wǎng)頁,并將抓得的數(shù)據(jù)以字符串的形式存儲,然后傳輸給網(wǎng)頁解析器。網(wǎng)頁解析器用于解析出有用的數(shù)據(jù)存儲下來,并且給URL管理器補充url。除此之外還有調(diào)度器主要負責調(diào)度各部分間協(xié)調(diào)工作。
Python爬蟲的流程主要分為四個步驟:發(fā)起請求,獲取響應內(nèi)容,解析內(nèi)容和保存數(shù)據(jù)。
(1)發(fā)起請求
對目標發(fā)送一個Request,Request中主要包含有請求方式、請求URL和請求頭三個部分,這個Request可以還包括headers等,然后等待響應。
(2)獲取響應內(nèi)容
若正常,會得到一個Response,Response中包含響應狀態(tài)、響應頭和響應體。其中最重要的就是響應體,它包含所請求資源的內(nèi)容,這個內(nèi)容可能是HTML,二進制等
(3)解析內(nèi)容
對響應的內(nèi)容進行解析,根據(jù)獲取內(nèi)容類型的不同采用不同的解析方式,解析方式有正則表達式、網(wǎng)頁解析庫、BeautifulSoup解析處理、轉(zhuǎn)為Json對象等。
(4)保存數(shù)據(jù)
對解析過后的內(nèi)容進行保存,保存形式有多種,可以根據(jù)需要保存為不同的格式。
分詞是指將完整的一句話根據(jù)其語義分揀成一個詞語項集[7],該詞語項集作為參與關聯(lián)規(guī)則挖掘的基本單元[8]。中文分詞是指以詞作為基本單元,運用計算機自動地對中文文本進行詞語的切分,即變成英文文本中用空格將句中的詞分開的形式,這樣方便計算機識別出各語句中的重點內(nèi)容。
許多情況下,我們需要對特定的場景來進行分詞,這時會有一些特定領域內(nèi)的專用詞匯,這些詞匯往往是詞庫里沒有的,解決這個問題的方法是創(chuàng)建自定義詞典,自定義詞典的有兩個重要方法:載入詞典,往詞庫里添加單詞。
Jieba中載入詞典:jieba.load_userdict(file_name),其中file_name是文件類對象或自定義詞典的路徑,載入詞典的格式需與 dict.txt 相同,每詞占一行;每行需要分成三個部分為:詞語、詞頻、詞性,詞頻和詞性可省略不寫,它們之間要使用空格來分開,并且其順序不可改變。其中file_name 若采用路徑或二進制來打開文件,則文件必須采用UTF-8編碼。當詞頻被省略的時候,Jieba會采用自動計算的方式來確保詞頻被分出。
自定義詞典的方式可以被用來添加jieba詞庫中不存在的詞。雖然jieba具有對新的詞匯進行辨別的能力,但單獨添加這些詞可以確保更高的正確率,還能夠解決未登錄詞的問題,然而人們對分詞技術和漢語結(jié)構(gòu)的理解程度也會影響著自定義詞典的準確度[9]。示例中在自定義詞典中添加了‘探測器造訪’和‘火星探測衛(wèi)星’兩個新詞,從實驗結(jié)果可以看出,兩個詞語在分詞結(jié)果中被準確的切分出來,使得分詞結(jié)果更加精確。添加新詞示例:
test_sent='2020年我們將發(fā)射一個火星探測衛(wèi)星'jieba.add_word('火星探測衛(wèi)星')
在自定義詞典中添加了“火星探測衛(wèi)星”這個詞,圖2展示了是否添加分詞后的不同運行結(jié)果。
圖2 是否添詞不同結(jié)果對比
從結(jié)果可以看出添加分詞使得火星探測器被準確的切分出來,分詞結(jié)果更加準確。
對中文文本關鍵詞提取的方法是采用不同方法對文本分割后的分詞進行計算權重,進行加權的方法有TF-IDF算法和TextRank算法。
3.2.1 TF-ID算法
TF-IDF(Term Frequency-inverse Document Frequency)是一種統(tǒng)計方法,其中TF(Term Frequency)的意思是詞頻,IDF(Inverse Document Frequency)的意思是逆文本頻率指數(shù),TF-IDF算法所求實際上就是這兩者相乘所得的乘積。該算法的主要思想為:若某詞在一類指定的文本中出現(xiàn)的頻率很高,而這個詞在其他類文本中出現(xiàn)的頻率很低,那么認為該詞具有此類文本某些代表性的特征,可用詞對此類文本進行分類[10]。因此使用TF-IDF算法計算分詞重要性可對某一文本提取關鍵詞。
詞頻指的是一個詞在指定的文件中出現(xiàn)的次數(shù)。在特定文件dj中詞語ti的TF公式如下:
其中,ni,j表示詞ti在文件dj中出現(xiàn)的次數(shù),分母表示dj中包含的所有詞出現(xiàn)的次數(shù)的總和。
逆向文件頻率是用來衡量詞普遍性的一個定義,對于某詞t的IDF的計算公式如下:
其中,|D|是語料庫中的文件總數(shù),分母表示dj中包含有ti的文件的數(shù)目。TF-IDF的計算公式如下:
在指定的文本中出現(xiàn)次數(shù)多而在文件集合中其他文件中出現(xiàn)頻率低的詞計算出來的TF-IDF值更高,所以使用TF-IDF算法可以過濾掉一些常用詞。
3.2.2 TextRank算法
TextRank算法是一種基于圖的算法,它是一種排序算法,用于處理文本,可用于提取關鍵詞[11]。
TextRank可由一個有向有權圖G=(V,E)表示,圖中任兩點vi,vj之間的邊的權重為Wji,對于給頂點vi,點vi的TextRank計算公式如下:
其中,In(vi)為指向該點的點集合,Out(vi)為該點所指向的集合,d為阻尼系數(shù),取值在0到1之間,表示某點指向其他任意點的概率。
TextRank算法基于PageRank算法[12],步驟為:
(1)分割文本,過濾。
(2)采用分割單位建立圖模型。
(3)根據(jù)式(4)在節(jié)點進行權重迭代,收斂時結(jié)束。
(4)根據(jù)權重的大小對節(jié)點進行排序,排序時采用的是倒序的方式,排序后根據(jù)重要性假設得到了T個候選關鍵詞。
(5)在原始文本中對候選詞檢測它們之間是否相鄰,相鄰的時候?qū)⑺麄兘M合成多詞關鍵詞。
詞云是一種使用語言分析技術對文本進行分析統(tǒng)計后生成可視圖像的技術[13]。詞云圖[14],也稱為文字云,是用圖像的方式對文本中頻繁出現(xiàn)的詞語進行展現(xiàn),形成“關鍵詞渲染”或者“關鍵詞云層”的效果。詞云圖可以過濾掉大量的低頻和低質(zhì)量的文本,讓瀏覽者只需匆匆一瞥就能夠通過關鍵詞來領會文本的核心內(nèi)容。WordCloud庫用于生成詞云,是python的第三方庫,這個庫的功能十分強大,在統(tǒng)計分析方面有著很好地應用。
本文編程語言為Python,編程環(huán)境是pycharm,第三方包有wordcloud、jieba等,直接使用pip安裝即可,安裝命令為:pip install wordcloud,pip install jieba。
本文采用介紹嫦娥四號相關資訊的新聞網(wǎng)頁作為爬蟲目標網(wǎng)頁。這一事件標志著人類首次將探測器成功發(fā)射到月球背面,對月球背面進行了近距離的拍攝,并傳回了世界第一張月球背面圖像,這是一次偉大的創(chuàng)舉。原網(wǎng)頁如圖3所示。
圖3 新聞網(wǎng)頁
編寫程序?qū)W(wǎng)頁數(shù)據(jù)進行抓取,并將抓取到的數(shù)據(jù)保存到指定的文本文件中。第一步要導入的相關庫:
然后要獲得網(wǎng)頁的Html,這時要用到Requests庫中的requests.get()方法,使用方式如下:
其中r.raise_for_status()在不成功的時候時拋出異常。然后要用BeautifulSoup庫進行解析,首先分析一下網(wǎng)頁的HTML結(jié)構(gòu),在Chrome中打開目標網(wǎng)頁,右鍵查看源碼可以看到如圖4所示。
圖4 網(wǎng)頁源碼
對網(wǎng)頁源碼進行分析,結(jié)合html相關知識,可以看出title為
因為select()方法返回的是一個列表,對于paras要采用循環(huán)的方式實現(xiàn)。最后將數(shù)據(jù)寫入文件并且保存,這里將爬取到的文章以字典的格式來保存:
爬取的數(shù)據(jù)被保存到指定路徑和文件名的文本文檔中,圖5是對爬取內(nèi)容進行展示。
圖5 爬取的數(shù)據(jù)
因為實驗要用到panda里面的value_count()等方法,所以要導入panda和jieba等相關包,然后讀取文本獲取文本數(shù)據(jù):
對文本進行分詞,因為分詞結(jié)果較長這里只打印一部分進行展示。而cut()方法返回的是可迭代的generator,若要打印指定某幾行時需要寫循環(huán),這里運用列表的形式打印出前五個分詞結(jié)果,簡化了代碼過程,關鍵代碼為:
分詞結(jié)果如圖6所示。
圖6 分詞前五個結(jié)果
從分詞結(jié)果中可以看出分詞不僅分出了詞語,還將標點也當做一個詞切分出來,像標點這樣的數(shù)據(jù)不僅無用,而且會占據(jù)存儲空間,影響分詞結(jié)果的準確度。所以要先對文本進行數(shù)據(jù)預處理,然后再進行后續(xù)實驗。
在處理文本的前后,Jieba會自動地篩除掉有些字或詞,篩除掉的字或詞被稱為Stop Words(停用詞)。停用詞大致被分類兩類:一種是被普遍包含的功能詞,比如“是”、“在”等等,這種詞一般沒有什么實際含義,基本上不會單獨表達文本的重要內(nèi)容,若要記錄這些詞會占據(jù)很大的磁盤空間;另一種包含詞匯詞,這種詞的特征是被普遍應用,但是卻不能保證準確的搜索結(jié)果,也不能夠降低搜索范圍,并且會影響搜索效率。從運行結(jié)果可以看到,在去除停用詞后,一些無用的符號和詞語被去除,使得分詞結(jié)果更清晰準確。首先創(chuàng)建停用詞詞典:
打印前十個結(jié)果如圖7所示。
圖7 去除停用詞前后對比
在去除停用詞后對剩下的分詞文本進行處理,首先運用統(tǒng)計詞頻的方法,觀察一下運行結(jié)果,統(tǒng)計詞頻時采用的是value_count()方法,這個函數(shù)能夠?qū)eries里面的每個值進行計數(shù)并排序。函數(shù)為:word_fre = pd.Series(word).value_counts()排序后的實驗結(jié)果前二十行如圖8所示。
圖8 統(tǒng)計詞頻結(jié)果
在統(tǒng)計詞頻后發(fā)現(xiàn)最后結(jié)果依然有噪聲數(shù)據(jù)存在,比如“成于”這種詞還沒有被劃分出去,因此基于詞頻的中文分詞算法是不可靠的。
分別使用TF-IDF算法和TextRank算法對分詞結(jié)果進行權重計算,其中TF-IDF算法得到的結(jié)果前二十個如圖9所示。
圖9 TF-IDF算法運行結(jié)果
對分詞結(jié)果執(zhí)行TextRank算法,計算分詞的權重并進行排序,計算結(jié)果前二十個如圖10所示。
圖10 TextRank算法結(jié)果
對比三種算法的運行結(jié)果,TF-IDF算法和TextRank算法的運行結(jié)果中基本上沒有常用詞這種帶有噪聲的分詞,這兩種算法的運行結(jié)果的差異性也不大,與基于詞頻的算法相比較分詞效果明顯的增強。
最后采用TF-IDF算法對篩選的結(jié)果進行詞云的繪制,根據(jù)計算的權重大小選取了前一百個結(jié)果進行繪圖,實現(xiàn)可視化。
詞云不僅用于展示標簽,也多用于呈現(xiàn)文本的關鍵詞語,以便幫助人們簡明扼要地了解文本的大體內(nèi)容。最后根據(jù)詞的重要性來繪制詞云,詞云可以從不同維度展現(xiàn)數(shù)據(jù):詞匯本 身、頻率(詞匯大?。?、以及詞匯的顏色,使得分詞結(jié)果簡單清晰。
每個詞云在wordcloud中被當作一個對象,生成一個美觀的詞云需要三步:配置對象參數(shù),加載詞云文本,輸出詞云文件。在Wordcloud中,w.generate(txt)用于向w中加載文本,w.tofile(filename)輸出為圖像格式保存。常用的參數(shù)列表如表1所示。
表1 wordcloud對象參數(shù)
最后采用云效果圖進行展示,詞云效果圖的文字的不同大小以及顏色的不同展示了文本內(nèi)容的關鍵程度。月球在詞云圖中占據(jù)了顯眼的位置,其次就是嫦娥、夢想等,通過對詞云圖的簡單瀏覽就可以大致了解文本的主要內(nèi)容,詞云圖如圖11所示。
圖11 詞云效果圖
本文首先運用python的第三方庫對新聞網(wǎng)頁進行了爬蟲操作,將爬取的數(shù)據(jù)保存為文本文檔作為后續(xù)分詞實驗的數(shù)據(jù),然后對文本進行分詞處理,在分詞的過程中先進行了數(shù)據(jù)預處理,采用自定義詞典的方式對新詞進行識別劃分,然后又進行了去除停用詞操作來提高分詞結(jié)果的準確度,然后根據(jù)TF-IDF算法和TextRank算法計算分詞的權重來提取關鍵詞的結(jié)果較理想,成功篩選掉了噪聲數(shù)據(jù),最后根據(jù)TF-IDF的結(jié)果對關鍵詞采用了詞云的方式實現(xiàn)了數(shù)據(jù)的可視化。
本文通過實驗對文本數(shù)據(jù)提取出了有價值的信息,并且用一種清晰的方式對重要內(nèi)容進行了展示。但是本文爬蟲只是抓取了單個網(wǎng)頁,數(shù)據(jù)量比較小,后續(xù)可以將抓取數(shù)據(jù)量加大,實驗結(jié)果可能會更加明顯。