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