劉衛國,李 晨
(中南大學 信息科學與工程學院,湖南 長沙 410083)
Python語言不僅語法優雅、清晰、簡潔,而且具有大量的第三方函數模塊庫,很適合作為程序設計入門語言,對學科交叉應用也很有幫助[1-2]。
NLTK模塊是Python常用的自然語言處理(Natural Language Process,NLP)工具,能方便快捷地處理自然語言文本。NLTK模塊中有用于處理自然語言任務的函數,與Python其他第三方模塊庫進行協同操作,能對處理結果進行二次處理。此外,NLTK包含豐富的語料庫,這些語料資源在教育學、文學、史學等領域均有應用[3]。
在管理、英語、法學等文科類專業程序設計教學中,利用NLTK模塊并結合其他第三方模塊,可以設計適合教學需要的應用案例[4]。在Python程序設計教學中,結合專業應用案例進行教學,能培養學生的學習興趣,引導學生將Python應用到專業領域中。
筆者以就職演說語料庫(Inaugural Address Corpus)作為英文研究對象進行分析,從中挖掘詞句結果及高頻詞,以此論證挖掘出來的結果與語料庫主題的相關性。就職演說語料庫包含1789—2009年美國歷任總統就職演講,共55個文本,總詞匯數為145 735個。語料庫以演說年代作為標準區分,演說年代對應獨立的子文本。本案例使用到的NLTK知識點包括語料庫的調用、分詞分塊處理、停用詞的信息過濾、頻率統計類函數的應用[5]以及NLTK與Matplotlib模塊的協同作用。案例流程見圖1。

圖1 就職演說語料庫案例流程圖
本案例使用的語料庫來源于NLTK的語料庫,導入NLTK模塊即可調用。使用NLTK計算文本長度的內置函數len()計算詞匯豐富度T值。詞匯豐富度是用于分析文本中詞匯出現的多寡,反映文本詞匯的總體使用情況。就職演說語料庫的詞匯豐富度為6.692%,T值越大說明文本詞匯豐富度越大,對文本詞匯的使用情況得到數字上直觀的展示。
文本預處理是對文本進行簡單處理的過程,本案例的預處理過程包括清洗過濾與詞形還原。首先過濾文本中無實際含義的停用詞、符號,英文詞匯有單復數、時態等不同形態,如果不進行詞形還原,統計結果會存在很大的偏差。
清洗過濾通過調用停用詞語料庫完成,首先將文本中詞匯使用lower()方法統一歸并為小寫,導入NLTK的英文停用詞語料庫,提取就職演說語料庫包含且停用詞語料庫不包含的詞匯。詞形還原通過編寫函數實現將復數單詞轉化為單數,根據預先定義好單詞的單復數轉換規則,對輸入單詞的末尾字母作選擇判斷,將輸入的單詞末尾字母轉換為單數形式的后綴。使用到的知識點有判斷結構if-else語句、詞匯運算符word.endswith()。具體代碼如下:


分析階段是抽取過程的核心,涉及文本的一系列處理操作。使用的方法有同語境詞提取、雙連詞提取、上下文提取、詞性標注以及統計分析,其中統計分析是最常使用的工具。
NLTK中使用函數similar()查找與目標詞匯出現在相似上下文位置的詞,即在文本中可用作替換的詞匯。在美國作家梅爾維爾所寫的《白鯨記》中尋找名詞的同語境詞,小說講述的是主人公亞哈船長與一頭白鯨的故事,使用text.similar("captain")找到以下同語境詞:whale ship sea boat deck world other devil wind body mate crew air head,可以發現得到的詞匯與目標詞匯詞性均為名詞。
雙連詞搭配提取是在文本中檢索得到頻繁出現的雙連詞以及文本中的固定搭配。例如在古騰堡語料庫中調用《哈姆雷特》提取雙連詞搭配,具體代碼如下:

NLTK有兩個方法可以實現目標詞匯的上下文輸出,使用concordance()對目標詞匯所在的句子進行檢索輸出,common_text查找詞匯集合的相同臨近詞匯,例如text2.common_contexts(["monstrous","very"])得到結果“a_pretty am_glad a_lucky is_pretty be_glad”,其中a_lucky表示a monstrous lucky與a very lucky。
詞性標注(Part-of-Speech Tagging, POS tagging)將分詞處理后的詞匯按詞性(POS)分類并標注的過程。在詞性分析階段使用NLTK內置的詞性標注器(POS tagger),處理一個詞序列,為每個詞附加一個詞性標記。詞性標注可以幫助分析句子成分,劃分句子結構。
概率統計作為NLTK中最常用的數學分析手段,用于文本中數據的處理分析。在Python中借助NLTK頻率分布類中定義的計算頻率的函數,對文本出現的單詞、搭配、常用表達或符號進行統計詞頻、詞長等相關操作。代碼如下:

利用停用詞語料庫得到的高頻詞集,部分統計結果為[('government',593),('people', 563),('state s',329),('world',329)],括號內數字為高頻詞在文本中出現的次數。
對語料庫雙連詞搭配提取:
nltk.Text(nltk.corpus.inaugural.words()).collocations()
部分結果如下:
United States; fellow citizens; American people。
對出現詞頻最高的詞匯“government”的同語境詞進行提取:
nltk.Text(nltk.corpus.inaugural.words()).similar("government")
部分結果如下:
people country union nation constitution power peace。
對高頻詞數據可視化,將結果轉化為詞頻折線統計圖、離散圖以及關鍵詞對比折線圖,分別見圖2—圖4。

圖2 頻率折線圖

圖3 離散圖
圖2折線圖是以高頻詞集作為數據來源進行可視化,橫軸為詞匯,縱軸為出現的次數。
圖3離散圖是用于展示詞匯在文本中出現的位置,發現“people”一詞在文本中出現密集而“democracy”則較稀疏,僅在后半部分出現較多。結合就職演說語料庫文本按時間順序排列的結構,可以看出不同演講用詞隨時間在使用頻率上顯著的差異。
圖4關鍵詞頻率折線圖是對不同年代美國總統在就職演講中使用“economy”“politics”兩個詞的頻率結果進行可視化輸出。可以看到“economy”一詞在“1925”“1958”兩個文本中達到峰值。
NLTK的主要適用場景是英文,在處理中文文本時需要安裝中文分詞工具包并進行字符轉換。本文選擇十九大報告作為中文分析素材,使用Jieba作為分詞處理工具[6]。本案例采用Beautiful Soup模塊對網頁上的案例文本進行爬取,Beautiful Soup是Python中用于網絡爬蟲的第三方模塊,它可以提供一些簡單的函數提取網頁中的內容。
本案例將爬取后的文本內容保存在TXT文件中,首先對爬取得到的素材文件過濾標點符號、數字與停用詞等,對全文內容進行詞性標注。分析過程中使用同語境詞查找、關鍵詞所在句子輸出等方法,使用概率統計對高頻出現的詞匯進行查找輸出,最后導入Wordcloud模塊實現詞云可視化,展示統計分析結果。案例實現具體代碼如下:



將案例運行結果打印并可視化,得到十九大報告高頻詞折線圖、名詞高頻詞折線圖、離散圖、詞云展示結果見圖5—圖8。

圖5 十九大報告高頻詞折線圖

圖6 名詞高頻詞折線圖

圖7 離散圖

圖8 高頻詞詞云展示
從圖5中可以發現“發展”“中國”“人民”是報告中頻率最高的3個詞。在高頻詞中利用詞性標注結果篩選出名詞高頻詞,得到圖6名詞高頻詞折線圖,圖7離散圖用于展示目標詞匯在文本中所處位置,每一個豎線代表一個詞匯在十九大報告中出現的位置,從圖7中可以發現“人民”在報告中的各個位置均有分布,與其他詞匯相比出現位置最為密集。圖8選擇部分高頻詞匯以詞云的形式展示統計結果,增強了結果可視化的藝術性。
本文選擇中文、英文兩篇素材的分析進行教學案例設計,利用NLTK模塊和其他第三方模塊的一系列方法,從素材中提取詞句結果,完成有效信息查找與提取、統計分析以及詞頻可視化展示。教學案例結合文科類專業的特點,綜合運用Python程序設計方法和第三方模塊的功能,既體現了Python程序設計的特點和規律,又能更好地促進計算機在不同學科的交叉應用。文科類專業程序設計教學更需要直觀、具體的教學展示,利用案例組織教學,讓學生在邊學邊做中建立學習興趣,培養學習熱情,能獲得更好的教學效果。