NLTK 提供了多元的語料函式庫資源,方便進行各種型別的自然語言處理研究。從新聞文字到總統演說,從詞性標註到語義網路,NLTK 的語料函式庫涵蓋了廣泛的語言資料。利用 NLTK,我們可以輕鬆地取得特定類別的文字、分析詞彙使用模式,甚至比較不同語言的特性。這些功能使得 NLTK 成為自然語言處理領域不可或缺的工具。
存取文字語料函式庫與詞彙資源
在自然語言處理(NLP)中,存取文字語料函式庫(Text Corpora)是基礎且重要的任務。語料函式庫是一種結構化的文字集合,用於訓練、測試和評估各種NLP模型與演算法。NLTK(Natural Language Toolkit)是一個強大的Python函式庫,提供了豐富的語料函式庫和詞彙資源存取功能。
Reuters 語料函式庫:新聞文字的範例
Reuters 語料函式庫是一個經典的文字集合,包含超過10,000篇新聞文章,這些文章被分類別到不同的類別中。這個語料函式庫常用於文字分類別、資訊檢索等任務。
>>> from nltk.corpus import reuters
>>> reuters.categories('training/9865')
['barley', 'corn', 'grain', 'wheat']
>>> reuters.fileids('barley')
['test/15618', 'test/15649', 'test/15676', ...]
>>> reuters.words('training/9865')[:14]
['FRENCH', 'FREE', 'MARKET', 'CEREAL', 'EXPORT', 'BIDS',
'DETAILED', 'French', 'operators', 'have', 'requested', 'licences', 'to', 'export']
內容解密:
reuters.categories('training/9865')
:傳回檔案training/9865
所屬的類別,包括barley
、corn
、grain
和wheat
。reuters.fileids('barley')
:列出屬於barley
類別的所有檔案ID。reuters.words('training/9865')[:14]
:傳回檔案training/9865
中的前14個單詞,通常用於檢視檔案的標題或開頭內容。
Inaugural Address 語料函式庫:歷屆美國總統就職演說
Inaugural Address 語料函式庫包含了歷屆美國總統的就職演說文字,這些演說跨越了兩個多世紀,是研究語言變遷和政治語篇的寶貴資料。
>>> from nltk.corpus import inaugural
>>> inaugural.fileids()
['1789-Washington.txt', '1793-Washington.txt', '1797-Adams.txt', ...]
>>> [fileid[:4] for fileid in inaugural.fileids()]
['1789', '1793', '1797', '1801', ...]
內容解密:
inaugural.fileids()
:傳回所有就職演說的檔案ID,每個ID包含了演說年份和總統的名字。[fileid[:4] for fileid in inaugural.fileids()]
:提取每個檔案ID的前四個字元,即演說的年份,用於進一步的時間序列分析。
語言特徵的變化趨勢分析
透過對Inaugural Address 語料函式庫的分析,可以觀察到某些詞彙使用頻率隨時間的變化。例如,觀察 america
和 citizen
相關詞彙的使用頻率。
>>> cfd = nltk.ConditionalFreqDist(
... (target, fileid[:4])
... for fileid in inaugural.fileids()
... for w in inaugural.words(fileid)
... for target in ['america', 'citizen']
... if w.lower().startswith(target))
>>> cfd.plot()
內容解密:
nltk.ConditionalFreqDist
:建立一個條件頻率分佈,用於統計在不同就職演說中,以america
或citizen
開頭的詞彙出現的頻率。cfd.plot()
:繪製條件頻率分佈圖,直觀展示這些詞彙使用頻率隨時間的變化趨勢。
帶註解的文字語料函式庫
許多語料函式庫包含語言學註解,如詞性標註(POS tags)、命名實體識別(Named Entities)、句法結構等。NLTK提供了多種帶註解的語料函式庫,用於支援更深入的NLP研究。
部分NLTK提供的語料函式庫範例
語料函式庫名稱 | 編譯者 | 內容描述 |
---|---|---|
Brown Corpus | Francis, Kucera | 包含15種文體,共1.15M詞彙,帶有詞性標註和分類別 |
Penn Treebank | LDC | 包含40k詞彙,帶有詞性標註和句法結構分析 |
Reuters Corpus | Reuters | 包含1.3M詞彙,10k篇新聞檔案,帶有分類別標籤 |
WordNet 3.0 | Miller, Fellbaum | 包含145k同義詞集,用於詞彙語義分析 |
內容解密:
- Brown Corpus:一個經典的多文體語料函式庫,用於語言學研究和統計分析。
- Penn Treebank:提供了詳細的句法結構分析,是句法分析和語義角色標註的重要資源。
- Reuters Corpus:用於文字分類別和資訊檢索研究的新聞語料函式庫。
- WordNet 3.0:一個大型的英語詞彙語義網路,用於衡量詞彙間的語義相似度。
詳細分析文字語料函式庫結構
在前面的章節中,我們已經瞭解瞭如何使用NLTK存取不同的文字語料函式庫。在本文中,我們將更深入地探討這些語料函式庫的內部結構和使用方法,並透過具體的程式碼範例來展示如何有效地利用它們進行自然語言處理(NLP)研究。
Reuters 語料函式庫的詳細結構
Reuters 語料函式庫是一個龐大的新聞文字集合,包含了超過10,000篇新聞文章,這些文章被分類別到不同的主題類別中。這個語料函式庫不僅可以用於文字分類別,還可以用於資訊檢索和其他相關研究。
from nltk.corpus import reuters
# 取得特設定檔案的類別
print(reuters.categories('training/9865'))
# 取得屬於特定類別的所有檔案ID
print(reuters.fileids('barley'))
# 取得特設定檔案的詞彙
print(reuters.words('training/9865')[:14])
程式碼解析:
reuters.categories('training/9865')
:此函式呼叫傳回了檔案training/9865
所屬的主題類別,例如barley
、corn
等。reuters.fileids('barley')
:此函式傳回屬於barley
主題類別的所有檔案ID列表。reuters.words('training/9865')[:14]
:此函式取得檔案training/9865
中的前14個單詞,通常這些單詞代表了新聞文章的標題部分。
Inaugural Address 語料函式庫的時間維度分析
Inaugural Address 語料函式庫包含了歷屆美國總統的就職演說,這些演說跨越了兩個多世紀。透過分析這個語料函式庫,可以觀察到語言使用隨時間變化的趨勢。
from nltk.corpus import inaugural
# 取得所有就職演說的檔案ID
print(inaugural.fileids())
# 從檔案ID中提取年份資訊
years = [fileid[:4] for fileid in inaugural.fileids()]
print(years)
程式碼解析:
inaugural.fileids()
:傳回所有就職演說的檔案ID,每個ID包含了演說年份和總統的名字。[fileid[:4] for fileid in inaugural.fileids()]
:透過列表推導式提取每個檔案ID的前四個字元,即演說的年份,這對於進一步的時間序列分析非常有用。
使用條件頻率分佈分析詞彙使用趨勢
我們可以利用條件頻率分佈(Conditional Frequency Distribution)來觀察某些特定詞彙在不同就職演說中的使用頻率變化。
import nltk
from nltk.corpus import inaugural
# 定義目標詞彙
targets = ['america', 'citizen']
# 建立條件頻率分佈物件
cfd = nltk.ConditionalFreqDist(
(target, fileid[:4])
for fileid in inaugural.fileids()
for w in inaugural.words(fileid)
for target in targets
if w.lower().startswith(target)
)
# 繪製條件頻率分佈圖
cfd.plot()
程式碼解析:
nltk.ConditionalFreqDist
:建立一個條件頻率分佈物件,用於統計在不同就職演說中,以america
或citizen
開頭的詞彙出現的頻率。cfd.plot()
:繪製條件頻率分佈圖,直觀展示這些目標詞彙在歷屆總統就職演說中的使用趨勢。
NLTK 語料函式庫資源詳解
NLTK(Natural Language Toolkit)提供了豐富的語料函式庫資源,這些資源對於自然語言處理(NLP)研究至關重要。在本文中,我們將詳細介紹NLTK中部分重要的語料函式庫,並探討如何有效地利用它們進行NLP任務。
Brown 語料函式庫
Brown 語料函式庫是一個經典的多文體英語語料函式庫,包含了超過50萬個單詞,按文體分為15個類別。它是語言學研究和統計分析的重要資源。
from nltk.corpus import brown
# 取得Brown語料函式庫中的文體類別
print(brown.categories())
# 取得特定文體中的單詞
print(brown.words(categories='news')[:10])
程式碼解析:
brown.categories()
:傳回Brown語料函式庫中的所有文體類別,例如news
、fiction
等。brown.words(categories='news')[:10]
:取得news
文體類別中的前10個單詞。
Penn Treebank 語料函式庫
Penn Treebank 語料函式庫是一個帶有句法結構註解的大型語料函式庫,主要用於句法分析和語義角色標註等任務。
from nltk.corpus import treebank
# 取得Treebank語料函式庫中的檔案ID
print(treebank.fileids()[:5])
# 取得特設定檔案的詞性標註資訊
print(treebank.tagged_words('wsj_0001.mrg')[:5])
程式碼解析:
treebank.fileids()[:5]
:傳回Treebank語料函式庫中的前5個檔案ID。treebank.tagged_words('wsj_0001.mrg')[:5]
:取得檔案wsj_0001.mrg
中的前5個帶有詞性標註的單詞。
WordNet 語義網路
WordNet 是一個大型的英語詞彙語義網路,將單片語織成同義詞集,並提供詞彙間的語義關係,如同義、反義、上下位關係等。
from nltk.corpus import wordnet as wn
# 取得單詞"bank"的同義詞集
synsets = wn.synsets('bank')
for synset in synsets:
print(synset, synset.definition())
程式碼解析:
wn.synsets('bank')
:傳回單詞 “bank” 的所有同義詞集。synset.definition()
:取得每個同義詞集的定義,用於理解該詞彙在不同上下文中的含義。
其他語言的語料函式庫
NLTK內建了許多語言的語料函式庫,但在某些情況下,使用這些語料函式庫之前,你需要學習如何在Python中操作字元編碼(參見第3.3節)。
>>> nltk.corpus.cess_esp.words()
['El', 'grupo', 'estatal', 'Electricit\xe9_de_France', ...]
>>> nltk.corpus.floresta.words()
['Um', 'revivalismo', 'refrescante', 'O', '7_e_Meio', ...]
>>> nltk.corpus.indian.words('hindi.pos')
['\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xac\xe0\xa4\x82\xe0\xa4\xa7', ...]
>>> nltk.corpus.udhr.fileids()
['Abkhaz-Cyrillic+Abkh', 'Abkhaz-UTF8', 'Achehnese-Latin1', 'Achuar-Shiwiar-Latin1', ...]
>>> nltk.corpus.udhr.words('Javanese-Latin1')[11:]
[u'Saben', u'umat', u'manungsa', u'lair', u'kanthi', ...]
內容解密:
上述程式碼展示瞭如何使用NLTK存取不同語言的語料函式庫。首先,我們看到cess_esp、floresta和indian等語料函式庫的範例。udhr語料函式庫包含了超過300種語言的世界人權宣言。fileids()函式傳回語料函式庫中的檔案ID列表,這些ID通常包含了有關字元編碼的資訊,如UTF8或Latin1。
使用條件頻率分佈比較不同語言的詞長
讓我們使用條件頻率分佈來比較udhr語料函式庫中不同語言的詞長。下面的程式碼繪製了六種語言的累積詞長分佈圖。
>>> from nltk.corpus import udhr
>>> languages = ['Chickasaw', 'English', 'German_Deutsch',
... 'Greenlandic_Inuktikut', 'Hungarian_Magyar', 'Ibibio_Efik']
>>> cfd = nltk.ConditionalFreqDist(
... (lang, len(word))
... for lang in languages
... for word in udhr.words(lang + '-Latin1'))
>>> cfd.plot(cumulative=True)
內容解密:
這段程式碼首先從nltk.corpus匯入udhr語料函式庫。然後,定義了一個包含六種語言名稱的列表languages。接著,使用nltk.ConditionalFreqDist()建立了一個條件頻率分佈物件cfd,該物件統計了不同語言中詞語的長度分佈。最後,呼叫cfd.plot(cumulative=True)繪製了累積詞長分佈圖,展示了不同語言中詞長的分佈情況。
你可以進一步探索:
- 選擇udhr.fileids()中的一種語言,並定義一個變數
raw_text = udhr.raw(Language-Latin1)
。 - 然後,使用
nltk.FreqDist(raw_text).plot()
繪製該文字中字母的頻率分佈圖。
語料函式庫結構
到目前為止,我們已經看到了多種語料函式庫結構,這些結構總結在圖2-3中。最簡單的語料函式庫缺乏任何結構,只是文字的集合。通常,文字會根據型別、來源、作者、語言等進行分類別。有時,這些分類別會重疊,特別是在主題分類別的情況下,因為一個文字可能與多個主題相關。偶爾,文字集合具有時間結構,新聞集合是最常見的例子。
NLTK的語料函式庫讀取器
NLTK的語料函式庫讀取器支援對各種語料函式庫的高效存取,並且可以用於處理新的語料函式庫。表2-3列出了語料函式庫讀取器提供的功能。
>>> raw = gutenberg.raw("burgess-busterbrown.txt")
>>> raw[1:20]
'The Adventures of B'
>>> words = gutenberg.words("burgess-busterbrown.txt")
>>> words[1:20]
['The', 'Adventures', 'of', 'Buster', 'Bear', 'by', 'Thornton', 'W', '.', ...]
內容解密:
這段程式碼展示瞭如何使用gutenberg語料函式庫讀取器存取古騰堡計畫中的文字。首先,使用gutenberg.raw()
函式讀取指定文字的原始內容;然後,使用gutenberg.words()
函式讀取文字中的單詞列表。這兩個函式都傳回指定文字的子集,分別對應原始內容和單詞列表。
常見的語料函式庫結構
圖2-3展示了常見的語料函式庫結構,包括簡單的文字集合、按型別分類別的語料函式庫(如布朗語料函式庫)、具有重疊分類別的語料函式庫(如路透社語料函式庫)以及具有時間結構的語料函式庫(如就職演說語料函式庫)。
NLTK語料函式庫功能
表2-3列出了NLTK提供的基礎語料函式庫功能,包括檔案ID、類別、原始內容、單詞和句子等。這些功能可以幫助你高效地存取和處理語料函式庫中的資料。