1. 程式人生 > >《Python自然語言處理》學習筆記-第二章

《Python自然語言處理》學習筆記-第二章

第二章:獲得文字語料和詞彙資源

2.1 獲取文字語料庫

古滕堡語料庫
(1)首先載入nltk包。
(2)使用nltk.corpus.gutenberg.fileids方法能夠獲取古滕堡語料庫中所有的文字識別符號。
(3)使用nltk.corpus.gutenberg.words方法能夠獲取某個文字的所有單詞的列表。
(4)若要使用第一章第一節的方法,必須先將資料轉換成text物件,使用nltk.Text函式。
(5)為了方便,可以先匯入gutenberg物件,再使用與其相關的方法。
(6)常見文字統計量:平均詞長、平均句子長度、詞彙多樣性(每個詞出現的平均次數)。
(7)使用raw方法能夠獲取文字中出現的字元總個數,包括詞之間的空格。
(8)sents方法能夠獲取文字中所有的句子,其中每一個句子是一個詞連結串列。

網路和聊天文字
(1)Python的nltk語料庫中也包含了一些不正式的語言,如:①網路文字小集合webtext庫;②即時訊息聊天會話語料庫nps_chat。

布朗語料庫
(1)布朗語料庫是第一個百萬詞級的英語電子語料庫。
(2)我們可以使用words和sents方法將語料庫作為詞連結串列或者句子連結串列來訪問。在使用words和sents方法的時候可以使用categories引數指定特定的類別或檔案。
(3)categories方法用於檢視布朗語料庫中的文體類別。
(4)布朗語料庫用於研究文體之間系統性差異,也叫做文體學的研究。
(5)可以使用頻率分佈物件FreqDist和條件頻率分佈物件ConditionalFreqDist來實現一些文字統計,如不同文體中的情態動詞的用法。

路透社語料庫
(1)路透社語料庫中的文件分成了90個主題,按照‘訓練’和‘測試’分成兩組。
(2)路透社語料庫的類別是相互重疊的,是因為新聞報道往往涉及多個主題。
(3)使用categories方法剋有獲取文字列表的主題。
(4)使用fileids方法可以獲取涵蓋主題列表中任意主題的文字識別符號。
(5)使用words方法可以獲取文字列表或者是主題列表的所有單詞,主題列表需要指定categories引數。

就職演講語料庫
(1)語料庫實際上是55個文字的集合,每個文字都是一個總統的演說,且每個文字的年代都出現在它的檔名中。
(2)使用條件概率分佈物件ConditionalFreqDist可以統計隨年代變化演說用詞的變化。
(3)書中舉的例子,詞彙america和citizen隨時間推移的使用情況,其中的程式碼有個錯誤,就是在建立條件概率物件時,獲取年代的引數file[:4]應改為fileid[:4]。

標註文字語料庫
(1)許多文字語料庫都包含語言學標註,有詞性標註,命名實體,句法結構,語義角色等。

其它語言的的語料庫
(1)NLTK包含多國語言語料庫。某些情況下,使用這些語料庫之前需要學習如何在Python中處理字元編碼。

文字語料庫的結構
(1)最簡單的語料庫結構是簡單的文字集合。但是可以根據文字的文體、來源、作者、語言等屬性對文字進行分類。
(2)NLTK語料庫閱讀器支援高效的訪問大量語料庫,並且能用於處理新的語料庫。
(3)NLTK中定義了很多語料庫函式。

載入自己的語料庫
(1)在NLTK中,使用PlaintextCorpusReader物件來載入自己的語料庫或者文字集合。

2.2 條件頻率分佈

定義
(1)條件頻率分佈是頻率分佈的集合,每個頻率分佈對應一個條件。nltk中使用ConditionalFreqDist物件來表示。

條件和事件
(1)條件頻率分佈需要給每個事件關聯一個條件,因此處理的不是一個詞序列,而是一個配對序列。
(2)也就是說,建立條件頻率分佈物件需要的是元組的列表,這個元組列表一般通過列表解析的方法來得到。

繪製分佈圖和分佈表
(1)條件頻率分佈物件含有一個plot方法來給內部的資料繪圖,也含有一個tabulate方法給內部資料繪製表格。通過圖和表格更容易表現出資料間的關係。
(2)plot方法和tabulate方法都含有conditions引數和samples引數。conditions引數控制圖和表格中條件的顯示,而samples引數控制樣本的顯示。
(3)一個特別的地方就是,在建立條件頻率分佈物件時,傳入的列表解析式可以不加方括號。

使用雙連詞生成隨機文字
(1)從第一章我們可以學習到,使用bigrams函式能夠獲取由一個詞連結串列構成的雙連詞連結串列。
(2)因為雙連詞連結串列是一個元組連結串列,所以我們可以用它來構造一個條件頻率物件。這個物件表示的是以每個詞為條件,統計它下一個詞的頻率分佈。
(3)使用條件頻率分佈,我們就可以以某個詞作為條件,找出它對應的頻率分佈中頻率最大的詞,把這個詞當作是生成文字的下一個詞。通過這樣的方法我們就能夠生成隨機文字了。

2.3 更多關於python:程式碼重用

Python模組
(1)在一個檔案中定義的變數和函式的集合稱為python的一個模組。
(2)相關模組的集合稱為一個包,而包的集合稱為庫。
(3)要注意的是檔案命名最好不要重複,不然會被當前目錄下的檔案覆蓋掉的。

2.4 詞典資源

基本定義
(1)詞典或者詞典資源是一個詞/短語以及一些相關資訊(如詞性和詞意定義等)相關資訊的集合。
(2)詞典資源附屬於文字,通常在文字的幫助下建立和豐富。
(3)一個詞項包含詞目(也叫做詞條)以及其他附加資訊(詞性和詞意定義)。
(4)如果兩個詞項拼寫相同,也就是詞條相同,但是附加資訊不同,叫做同音異義詞。

詞彙列表語料庫
(1)NLTK包含詞彙語料庫,需要匯入nltk.corpus.words。
(2)使用詞彙語料庫可以實現文字過濾,過濾掉罕見或者具有拼寫錯誤的詞。
(3)NLTK也包含停用詞語料庫stopwords,停用詞也就是那些特殊的高頻詞彙,如the,to等,可以通過停用詞語料庫將文字中的停用詞過濾掉。
(4)NLTK也包含了名字語料庫names。男性和女性的名字儲存在單獨的檔案中,通過fileids可以獲取相應的fileid。

發音詞典
(1)NLTK中包含了美國英語的CMU發音詞典cmudict,它是為語音合成器的使用而設計的。
(2)使用entries方法獲取元組元素,元組中第一項為詞,第二項為詞的發音列表。
(3)對於每一個詞,CMU發音詞典提供詞對應的語音程式碼,這些語音程式碼也叫做音素。
(4)CMU發音詞典包含了一個詞典資料結構,通過dict方法獲得。使用這個詞典資料結構我們可以使用[]操作符來獲取相應詞的發音程式碼。因為一個詞可能對應多個發音程式碼,因此返回的值是列表的列表。當詞典中沒有某個詞的發音程式碼時,可以通過賦值符號來新增。

詞典資源備註
(1)我們可以用任何詞典資源處理文字,如:過濾掉具有某些詞典屬性的詞(如名詞),或者是對映文字中每一個詞。

2.5 WordNet

背景
(1)WordNet是面向語義的英語詞典。
(2)NLTK庫中包含了英語WordNet,裡面共有155287個詞以及117659個同義詞集合。
(3)python中使用from nltk.corpus import wordnet as wn匯入wordnet。

意義與同義詞
(1)同義詞(synonym):當兩個詞在句中相互替換後能保持句子含義不變的話,這兩個詞就是同義詞。
(2)使用synsets方法可以獲取某個詞的所有同義詞集合。因為一個詞可能有多個意義,不同的意義對應不同的同義詞集合,因此一個詞可能含有多個同義詞集合。
(3)使用synset方法獲取某個同義詞集合物件。這個物件包含很多方法用於描述該物件的一些屬性。
(4)synset物件含有幾個常用的方法:①definition方法,用於獲取該同義詞集合的定義描述;②examples方法,用於獲取該同義詞集合的例句。
(5)詞條(lemma):同義詞集中的詞叫做詞條。對於每一個同義詞集物件都包含了很多方法來獲取詞條資訊,例如:①lemmas方法獲取所有詞條,以列表形式返回;②lemma方法可以獲取某個詞條物件;③使用lemma物件的synset方法能夠獲取該詞條所屬的同義詞集合;④使用lemma物件的name方法能夠獲取該詞條的名字,也就是這個詞的表示式。

WordNet的層次結構
(1)WordNet的同義詞集對應於抽象概念,並不總是有對應的英語詞彙,這些概念以層次結構的方式相互聯絡著。
(2)有一些同義詞集對應的抽象概念是具有相當程度的一般性的,例如“實體“,”狀態“,”事件“等概念對應的同義詞集,它們涵蓋的範圍非常的廣泛,這些同義詞集被稱為初始概念,或者叫做根同義詞集(因為幾乎所有的同義詞集都能來源於這個同義詞集)。
(3)通過這樣的層次結構,WordNet能夠非常方便地遍歷相關的同義詞集。
(4)下位詞(hyponym):指概念上內涵更窄的主題詞。也就是所指代的內容更加具體的同義詞集。
(5)所有的synset物件都包含了一個hyponyms方法,用於獲取在層次結構中與當前同義詞集相關聯的下一層的所有同義詞集。這些同義詞集指代的內容比當前的同義詞集更加具體。
(6)上位詞(hypernym):是指概念上外延更廣的主題詞。
(7)所有的synset物件都包含了一個hypernyms方法,用於獲取層次結構中與當前同義詞集相關聯的上一層的所有同義詞集。這些同義詞集所涵蓋的範圍更廣。
(8)synset物件包含了一個hypernym_paths方法,使用者獲取當前同義詞集到根同義詞集的所有路徑。每一條路徑以一個synset物件列表表示。
(9)synset物件也包含了一個root_hypernyms方法,用於獲取當前同義詞集的根同義詞集。
(10)上位詞,下位詞更多的表現的是同義詞集間的相互包含關係。

更多的詞彙關係
(1)上位詞和下位詞是詞彙關係的一種,表示的是同義詞集間的關係。
(2)WordNet還能通過部件和整體的關係遍歷相關的同義詞集。
(3)synset物件包含了一個part_meronyms方法,用於獲取在結構意義上構成當前同義詞集的所有”部件“同義詞集。
(4)synset物件也包含了一個substance_meronyms方法,用於獲取在本質意義上構成當前同義詞集的所有”材質“同義詞集。
(5)synset物件包含了一個member_holonyms方法,用於獲取組合意義上通過當前同義詞集組成的”整體“同義詞集。
(6)動詞間具有蘊涵關係(entailment),相當於動作的拆解。
(7)synset物件包含一個entailments方法獲取與動詞的同義詞集存在蘊涵關係的所有同義詞集。
(8)除了同義詞集外,詞條lemma間也存在關係。獲取詞條的反義詞使用lemma物件的antonyms方法,返回一個反義詞列表。
(9)對於其它方法可以用dir函式來檢視。

語義相似度
(1)語義相似度可以通過查詢同義詞集間的聯絡來實現。
(2)如果兩個同義詞集共用一個非常具體的上位詞,而且這個上位詞在層次結構中處於較低層的位置的話,那麼我們說這兩個同義詞集一定有密切的聯絡。因為具有相同的上位詞意味著它們從屬於同一概念;而在層次結構中,層次越低,概念就越具體,所以這兩個同義詞集的定義就越相近。
(3)可以使用synset物件的lowest_common_hypernyms方法,把另一個物件作為引數傳給這個方法就可以找出兩個同義詞集的最低共有上位詞。
(4)可以使用synset物件的min_depth方法來測量物件一般性的程度,原理上其實在測量物件在層次結構所在的層次。
(5)使用synset物件的path_similarity方法可以測量兩個同義詞集間的路徑長短,值得範圍是0到1。路徑越長,值越小;路徑越短,值越大。當沒有路徑時返回-1,當於自身比較時返回1。