索引 / 001 ZH-TW
Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit(Python 自然語言處理) cover

語言學

語言學

Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit(Python 自然語言處理)

Steven Bird; Ewan Klein; Edward Loper

英文原名: Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit

一本透過開源自然語言工具包(NLTK)進行 Python 程式設計,來學習計算語言學與自然語言處理的實作導論。史蒂芬・柏德、尤恩・克萊恩與愛德華・羅珀教讀者撰寫處理大量文本的程式、使用標記語料庫與詞彙資源,並實作分析語言結構與意義的主要演算法。免費線上版已針對 Python 3 與 NLTK 3 更新,而 2009 年的印刷版使用的是 Python 2。

需要的基礎: 不需要程式設計經驗,但需要一些語言學背景與動手寫程式的意願。

難度等級
中級
學術層次
大學部
computational linguisticsnatural language processingpythoncorporanltk教科書

01 / 導讀

導讀

引用

Bird, S., Klein, E., & Loper, E. (2009). Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit. O'Reilly Media. Free official edition (online version updated for Python 3 and NLTK 3): https://www.nltk.org/book/

章節概要

第0章:前言

前言從廣義的角度界定自然語言處理——從計算詞頻到「理解」話語,並把本書定位為一本以 Python 與開源自然語言工具包(NLTK)為基礎、難度從入門到中級的實用教程。它分別向程式新手、Python 新手與熟悉 Python 的讀者說明閱讀方式,解釋各章在以語言為主軸與以程式為主軸的講解之間交替進行,介紹分級練習(☼ 容易、◑ 中等、★ 困難),並提出兩套課程規劃:一套為人文學科學生設計,一套為理工科學生設計。

第1章:語言處理與 Python

第一章讓讀者立刻開始以電腦處理文本:載入 NLTK 的範例文本、以索引(concordance)檢索、計算詞彙,並把文本當作 Python 串列來處理。本章介紹頻率分布、搭配詞與二元組、條件判斷與迴圈,最後以非技術性的方式概述「理解」語言需要哪些能力——詞義消歧、代名詞消解、語言生成、機器翻譯、對話系統與文本蘊涵——以及自然語言處理的限制。

第2章:存取文本語料庫與詞彙資源

本章概覽 NLTK 內附的語料庫(古騰堡語料庫、網路與聊天文本、布朗語料庫、路透社語料庫、總統就職演說語料庫、標記語料庫與多語語料庫),並說明如何載入自己的語料庫。條件頻率分布被用來比較文體,並以二元組產生隨機文本。在 Python 方面,本章介紹文字編輯器、函式與模組。接著討論詞彙資源——詞表、CMU 發音詞典、對照詞表、Toolbox 詞典,以及 WordNet 的同義詞集、階層、詞彙關係與語意相似度。

第3章:處理原始文本

讀者在此學習如何處理來自網路與磁碟的文本:字串、Unicode、用來找出詞語模式的正規表示式、正規化(詞幹提取與詞形還原)、以正規表示式斷詞、句子與詞語切分,以及輸出格式化。本章完成了從現成語料庫到雜亂真實文本的過渡。

第4章:撰寫結構化程式

本章把散見於第 1—3 章的 Python 知識加以系統化:指派與物件參照、序列、程式風格、函式(參數、作用範圍、說明字串)、程式開發與除錯、包含遞迴與動態規劃在內的演算法設計,以及若干 Python 函式庫的介紹(繪圖、NetworkX、CSV、NumPy)。

第5章:詞語分類與標記

本章透過標記語料庫與通用詞性標記集引入詞性標記,並以 Python 字典作為把詞語對應到屬性的資料結構。本章建構並評估自動標記器——預設標記器、正規表示式標記器、查表標記器、一元標記器,以及透過退回(backoff)組合起來的 n 元標記器,討論資料稀疏問題與效能限制,介紹以轉換為基礎的(Brill)標記,並探討語言學家如何依據構詞、句法與語意線索判定詞的類別。

第6章:學習文本分類

本章透過姓名性別判定、文件分類、詞性標記、句子切分、對話行為類型辨識與文本蘊涵辨識等例子引入監督式分類,並留意特徵選擇與序列分類。它討論評估方法(測試集、正確率、精確率與召回率、混淆矩陣、交叉驗證),說明決策樹、單純貝氏與最大熵分類器,最後探討這類模型能告訴我們關於語言的哪些事。

第7章:從文本中擷取資訊

資訊擷取被描述為一條從切分與標記到實體偵測再到關係擷取的處理流程。本章的核心是詞組切分(chunking):運用標記樣式與正規表示式進行名詞片語切分、「去塊」(chinking)、IOB 表示法與 CoNLL-2000 語料庫、以分類器為基礎之切分器的訓練與評估,以及建構巢狀樹狀結構的串接式切分器。最後討論命名實體辨識與關係擷取。

第8章:分析句子結構

本章從句子的無限可能與無所不在的歧義出發,說明句法的必要性,接著介紹上下文無關文法、自行撰寫文法以及遞迴。它比較各種剖析演算法(遞迴下降、移入—歸約、左角剖析、合式子字串表/圖表剖析),介紹依存語法與配價,並討論運用樹庫進行文法開發、「惡性」歧義以及加權(機率)文法。

第9章:建構以特徵為基礎的文法

本章引入特徵結構,以便在不增加範疇數量的情況下處理一致等細微區別。它說明屬性—值矩陣、重入、涵蓋與合一,並把以特徵為基礎的文法延伸到次範疇化、中心語、助動詞倒裝、無界依存結構,以及德語的格與性。

第10章:分析句子的意義

本章從以英文查詢資料庫談起,介紹命題邏輯與一階邏輯、定理證明、模型中的真、變項指派、量化與量詞範圍歧義,以及模型建構。接著說明如何運用以特徵為基礎的文法與 λ 演算,組合式地建構意義表徵(量化名詞片語、及物動詞),最後討論言談表徵理論與言談處理。

第11章:管理語言資料

最後一個技術性章節把語料庫視為經過設計的對象:以 TIMIT 語料庫為個案,討論語料庫的生命週期(建立情境、品質控管、維護)、從網路、文書處理檔案、試算表與資料庫取得並轉換資料、選擇標記層與標準、處理瀕危語言時的特殊考量、使用 XML 與 ElementTree、處理 Toolbox 詞典,以及以 OLAC 後設資料描述資源。

第12章:後記:語言的挑戰

後記對這個領域加以反思:語言處理與符號處理的對比,理性主義與經驗主義、實在論與觀念論之間的當代分歧,語言學知識與統計方法各自的角色,以及 NLTK 未來發展的路線圖。

核心概念

第0章:前言

  • NLTK:一個開源 Python 函式庫,提供自然語言處理教學與研究所需的軟體、語料庫與文件。
  • 分級練習:每章末尾分為容易、中等與困難三級的練習。

第1章:語言處理與 Python

  • 詞例與詞型:某個詞的一次具體出現,與不同的詞形本身。
  • 頻率分布:計算每個項目(如每個詞)出現的次數。
  • 搭配詞:異常頻繁共同出現的詞語序列。

第2章:存取文本語料庫與詞彙資源

  • 語料庫:大型、結構化的文本集合,通常依文體或主題分類。
  • 條件頻率分布:一組頻率分布,每個條件(如文體)各對應一個。
  • WordNet 同義詞集:代表一個詞義的同義詞集合,並連結成語意階層。

第3章:處理原始文本

  • 斷詞:把文本切分為詞語、標點等單位。
  • 正規表示式:用於搜尋與處理字串的樣式語言。
  • 詞幹提取與詞形還原:把詞形化約為詞幹或辭典形式。

第4章:撰寫結構化程式

  • 物件參照:Python 中的指派是共享物件而非複製物件。
  • 動態規劃:儲存子問題的結果以避免重複計算,在自然語言處理中應用廣泛。

第5章:詞語分類與標記

  • 詞性標記:為詞例指定名詞、動詞等詞類。
  • 退回(backoff):必要時從專門模型(二元標記器)退回到較一般的模型(一元標記器)。
  • 資料稀疏問題:即使訓練資料很多,大多數可能的上下文仍未曾出現。

第6章:學習文本分類

  • 監督式分類:利用帶標籤的訓練資料,學習依據特徵預測標籤。
  • 訓練集、開發測試集與測試集:分別用於建構、調整與最終評估模型的資料。
  • 精確率與召回率:衡量預測結果中有多少是正確的,以及正確項目中有多少被找出。

第7章:從文本中擷取資訊

  • 詞組切分:切分並標記名詞片語等多詞例序列。
  • IOB 標記:用來表示詞組的 Inside/Outside/Begin 標籤。
  • 命名實體辨識:辨識對人名、機構、地點等實體的提及。

第8章:分析句子結構

  • 上下文無關文法:說明各範疇片語如何分解為組成部分的產生規則。
  • 剖析演算法:遞迴下降(由上而下)、移入—歸約(由下而上)與圖表方法。
  • 依存語法:把結構分析為中心語與依存成分之間的關係。

第9章:建構以特徵為基礎的文法

  • 特徵結構:描述文法性質的屬性—值配對集合。
  • 合一:在相容的情況下,把兩個特徵結構合併成包含兩者資訊的單一結構。

第10章:分析句子的意義

  • 模型中的真:依據論域與賦值評估邏輯公式。
  • λ 演算與 β 化約:組合式建構意義表徵的工具。
  • 言談表徵理論:表徵跨句意義(包括照應)的理論。

第11章:管理語言資料

  • 語料庫生命週期:蒐集、標記、品質控管、發布以及後續的擴充。
  • 後設資料(OLAC):讓他人能夠找到語言資源的標準化描述。

第12章:後記

  • 理性主義與經驗主義:關於語言處理中先天知識與資料各自角色的對立觀點。

評析

優點

  • 從做中學。 正如前言所承諾,幾乎每個概念都附有使用 NLTK 內附語料庫的可執行程式碼,讀者可以立即檢驗書中的說法;各章包含數百個範例與分級練習。
  • 人文學科學生也容易上手。 前幾章透過語言實例從零開始教授 Python,第 4 章再系統整理程式知識,前言也為人文學科學生另外提供課程規劃。
  • 植基於語言學。 與許多以程式為先的自然語言處理書籍不同,本書分別以整章篇幅討論標記集設計與詞類、句法與剖析、以特徵為基礎的文法、形式語意學,以及語料庫管理(包括瀕危語言紀錄與 Toolbox 資料)。
  • 清楚講解評估。 第 5—7 章一再強調區分訓練資料與測試資料,介紹基準、正確率、精確率、召回率與交叉驗證,並討論結果為何可能過度樂觀。

局限

  • 屬於神經網路之前的內容。 內容反映的是大約 2009 年以前的自然語言處理:分類器是決策樹、單純貝氏與最大熵模型,完全未涉及當今實務中占主導地位的詞向量、神經網路與大型語言模型。
  • 線上版部分尚未完成。 本書目次頁標示第 5、10、11 章「仍需小幅修正」;線上文本已針對 Python 3 與 NLTK 3.0 更新(假定使用 Python 3.2 或更新版本),部分程式碼在目前的 NLTK 版本中可能仍需調整。
  • 綁定單一工具包。 書中許多篇幅在講 NLTK 本身的類別與語料庫,因此這些技能轉移到當今業界與研究所用的其他函式庫時不夠直接。
  • 難度不均。 前言指出第 4 章之後節奏加快;第 9、10 章(特徵文法、λ 演算)比開頭各章難得多。

在課程中的定位

在「計算語言學與語料庫語言學」書單中,本書介於不涉及程式設計的入門讀物與更偏技術的讀物之間。Language and Computers 在不涉及程式設計的情況下說明語言科技能做什麼,Doing Corpus Linguistics 介紹語料庫方法;兩者都是很好的第一步,之後再讀本書,學生就能用 Python 親手完成這類分析。McEnery 與 Hardie 的 Corpus Linguistics: Method, Theory and Practice 一般被認為是對語料庫語言學方法與理論的系統論述,可補充本書第 1—3 章與第 11 章;Gries 的 Quantitative Corpus Linguistics with R 則以 R 對類似資料進行統計分析。

Jurafsky 與 Martin 的 Speech and Language Processing 是讀完本書後自然的下一步:它更深入地講解演算法與模型,其目前的草稿也涵蓋本書未處理的神經網路方法。學生可以先以 Bird、Klein 與 Loper 的書掌握詞性標記、剖析與分類的實作技能,再轉向 Jurafsky 與 Martin 學習理論與現代方法。

如何使用本書

本書同時以沒有程式背景的讀者與有經驗的程式設計師為對象,可用於自然語言處理、計算語言學、語料庫語言學或文字探勘課程。請安裝 Python 3 與 NLTK,下載 NLTK 資料,邊讀邊輸入範例程式碼。前言中的建議課時表為人文學科課程在第 1—5 章以及第 8、9 章各安排 2—4 堂課,第 6 章幾乎不占課時;理工科課程則較快講完第 1—4 章,把更多時間用在第 6—11 章。前言提出的另一種方案,是先講第 1—5 章,再專攻分類(第 6—7 章)、句法(第 8—9 章)、語意(第 10 章)或資料管理(第 11 章)其中一個方向。

每章至少完成容易(☼)與中等(◑)難度的練習,並利用「延伸閱讀」部分把程式碼與研究文獻連結起來。由於這個領域已有長足發展,若課程涵蓋當前方法,宜把第 5—7 章與關於自然語言處理中機器學習的現代論述搭配學習。

版本與來源

本導讀依據 https://www.nltk.org/book/ 上的 Natural Language Processing with Python 線上版,作者已將其更新為適用於 Python 3 與 NLTK 3(第一版於 2009 年由 O'Reilly 出版;網站說明目前沒有推出第二版的計畫)。本導讀參考了前言(讀者對象、重點、架構、練習、Python 3 說明與課程規劃)、完整目次、第 1—11 章及後記的所有小節標題,以及各章開頭提出的問題與章末摘要。