返回文章列表

NLTK語料函式庫與詞典資源應用

本文探討 NLTK 中豐富的語料函式庫與詞典資源,包含名字語料函式庫、CMU Pronouncing Dictionary 以及 Swadesh 對比詞表,並示範如何運用 Python 程式碼進行名字分析、發音比對、拼寫差異分析、重音模式辨識及最小對比集合萃取等 NLP 應用,同時也涵蓋文字轉語音的實作與

自然語言處理 Python

NLTK 提供多種語料函式庫,例如名字語料函式庫,可用於分析男性和女性名字的差異,以及找出共有的名字。CMU Pronouncing Dictionary 則提供了單詞的發音資訊,可以分析單詞的音標、重音模式,並找出發音與拼寫之間的關係。Swadesh 詞表則提供了不同語言之間的同源詞,方便進行跨語言的詞彙比較和翻譯。此外,NLTK 還支援 Toolbox 辭典,這是一種更具彈性的語言資料管理工具,可以儲存和處理更複雜的語言資訊。透過 Python 程式碼,可以有效地運用這些資源進行各種 NLP 任務,例如文字轉語音、詞彙分析、發音比對等,提升自然語言處理的效率和準確性。

探索NLTK語料函式庫與詞典資源

本章節將探討NLTK(Natural Language Toolkit)中的語料函式庫與詞典資源,並透過具體的程式碼範例來展示如何使用這些資源進行自然語言處理。

名字語料函式庫分析

首先,我們來分析NLTK中內建的名字語料函式庫。這個語料函式庫包含了男性和女性的名字,分別儲存在male.txtfemale.txt中。

import nltk

# 載入名字語料函式庫
names = nltk.corpus.names

# 檢視語料函式庫中的檔案
print(names.fileids())  # ['female.txt', 'male.txt']

# 分別載入男性和女性的名字
male_names = names.words('male.txt')
female_names = names.words('female.txt')

# 找出同時出現在男性和女性名字中的名字
common_names = [w for w in male_names if w in female_names]
print(common_names[:10])  # ['Abbey', 'Abbie', 'Abby', 'Addie', 'Adrian', 'Adrien', 'Ajay', 'Alex', 'Alexis', 'Alfie']

內容解密:

  1. nltk.corpus.names載入了NLTK內建的名字語料函式庫。
  2. names.fileids()傳回語料函式庫中的檔案列表,包含了female.txtmale.txt
  3. names.words('male.txt')names.words('female.txt')分別載入了男性和女性的名字列表。
  4. 列表推導式[w for w in male_names if w in female_names]用於找出同時出現在男性和女性名字列表中的名字。

分析名字的最後一個字母

我們可以進一步分析名字的最後一個字母,以瞭解男性和女性名字在拼寫上的差異。

# 建立條件頻率分佈,分析名字的最後一個字母
cfd = nltk.ConditionalFreqDist(
    (fileid, name[-1])
    for fileid in names.fileids()
    for name in names.words(fileid))

# 繪製條件頻率分佈圖
cfd.plot()

內容解密:

  1. nltk.ConditionalFreqDist用於建立條件頻率分佈,這裡的條件是名字的性別(男性或女性),而觀察值是名字的最後一個字母。
  2. (fileid, name[-1]) for fileid in names.fileids() for name in names.words(fileid)是一個生成器表示式,用於迭代所有名字並提取其性別和最後一個字母。
  3. cfd.plot()繪製了條件頻率分佈圖,可以直觀地看到男性和女性名字在最後一個字母上的差異。

CMU Pronouncing Dictionary

CMU Pronouncing Dictionary是一個用於美國英語的發音詞典,包含了單詞及其對應的音標。

# 載入CMU Pronouncing Dictionary
entries = nltk.corpus.cmudict.entries()

# 檢視詞典中的條目數量
print(len(entries))  # 127012

# 檢視部分條目
for entry in entries[39943:39951]:
    print(entry)

輸出範例:

('fir', ['F', 'ER1'])
('fire', ['F', 'AY1', 'ER0'])
('fire', ['F', 'AY1', 'R'])
('firearm', ['F', 'AY1', 'ER0', 'AA2', 'R', 'M'])
('firearm', ['F', 'AY1', 'R', 'AA2', 'R', 'M'])
('firearms', ['F', 'AY1', 'ER0', 'AA2', 'R', 'M', 'Z'])
('firearms', ['F', 'AY1', 'R', 'AA2', 'R', 'M', 'Z'])
('fireball', ['F', 'AY1', 'ER0', 'B', 'AO2', 'L'])

內容解密:

  1. nltk.corpus.cmudict.entries()載入了CMU Pronouncing Dictionary中的所有條目。
  2. 每個條目是一個元組,第一個元素是單詞,第二個元素是該單詞的音標列表。
  3. 音標使用Arpabet符號表示,這是一種用於表示英語發音的音標系統。

分析發音

我們可以進一步分析單詞的發音,例如找出以特定音標結尾的單詞。

# 找出發音以['N', 'IH0', 'K', 'S']結尾的單詞
syllable = ['N', 'IH0', 'K', 'S']
result = [word for word, pron in entries if pron[-4:] == syllable]
print(result[:10])  # ["atlantic's", 'audiotronics', 'avionics', 'beatniks', 'calisthenics', ...]

內容解密:

  1. word for word, pron in entries迭代了CMU Pronouncing Dictionary中的所有條目。
  2. if pron[-4:] == syllable篩選出了發音以syllable([‘N’, ‘IH0’, ‘K’, ‘S’])結尾的單詞。
  3. 結果列表包含了所有匹配的單詞。

發音與拼寫的差異

我們還可以分析發音與拼寫之間的差異,例如找出發音與拼寫不符的單詞。

# 找出發音最後一個音標為'M'但拼寫最後一個字母不是'm'的單詞
result = [w for w, pron in entries if pron[-1] == 'M' and w[-1] == 'n']
print(result)  # ['autumn', 'column', ...]

# 找出第一個音標為'N'但拼寫第一個字母不是'n'的單詞的前兩個字母
result = sorted(set(w[:2] for w, pron in entries if pron[0] == 'N' and w[0] != 'n'))
print(result)  # ['gn', 'kn', ...]

內容解密:

  1. [w for w, pron in entries if pron[-1] == 'M' and w[-1] == 'n']找出了發音最後一個音標為’M’但拼寫最後一個字母是’n’的單詞。
  2. sorted(set(w[:2] for w, pron in entries if pron[0] == 'N' and w[0] != 'n'))找出了第一個音標為’N’但拼寫第一個字母不是’n’的單詞的前兩個字母,並進行了排序和去重。

重音模式分析

我們可以定義一個函式來提取單詞發音中的重音模式,並據此篩選單詞。

def stress(pron):
    return [char for phone in pron for char in phone if char.isdigit()]

# 找出具有特定重音模式的單詞
result = [w for w, pron in entries if stress(pron) == ['0', '1', '0', '2', '0']]
print(result[:10])  # ['abbreviated', 'abbreviating', ...]

內容解密:

  1. stress(pron)函式提取了發音中的重音數字。
  2. [w for w, pron in entries if stress(pron) == ['0', '1', '0', '2', '0']]根據特定的重音模式篩選出了符合條件的單詞。

最小對比集合

我們可以使用條件頻率分佈來找出最小對比集合,即在某些方面相似但在其他方面有所不同的單詞集合。

# 建立條件頻率分佈,分析以'P'開頭且有三個音標的單詞
p3 = [(pron[0]+'-'+pron[2], word) for (word, pron) in entries if pron[0] == 'P' and len(pron) == 3]
cfd = nltk.ConditionalFreqDist(p3)

# 列印條件頻率分佈中條件值大於10的範本及其對應的單詞
for template in cfd.conditions():
    if len(cfd[template]) > 10:
        words = cfd[template].keys()
        wordlist = ' '.join(words)
        print(template, wordlist[:70] + "...")

內容解密:

  1. [(pron[0]+'-'+pron[2], word) for (word, pron) in entries if pron[0] == 'P' and len(pron) == 3]建立了一個列表,包含了以’P’開頭且有三個音標的單詞的範本(第一個和第三個音標的組合)及其對應的單詞。
  2. nltk.ConditionalFreqDist(p3)根據範本對單詞進行了分組,並計算了每個範本下的單詞頻率。
  3. 程式碼列印出了條件頻率分佈中條件值大於10的範本及其對應的單詞列表。

詞典資源與文書處理

在自然語言處理(NLP)中,詞典資源是一種重要的工具,用於儲存和管理單詞的各種屬性,如發音、詞性、翻譯等。本章節將介紹如何使用Python的NLTK函式庫來存取和操作這些詞典資源。

發音詞典

發音詞典是一種特殊的詞典資源,用於儲存單詞的發音資訊。NLTK提供了一個名為CMU Pronouncing Dictionary的發音詞典,其中包含了大量的英文單詞及其對應的發音。

使用發音詞典

import nltk
from nltk.corpus import cmudict

# 載入CMU Pronouncing Dictionary
prondict = cmudict.dict()

# 查詢單詞'fire'的發音
print(prondict['fire'])
# 輸出: [['F', 'AY1', 'ER0'], ['F', 'AY1', 'R']]

# 查詢單詞'blog'的發音(不存在於詞典中)
try:
    print(prondict['blog'])
except KeyError:
    print("單詞'blog'不存在於發音詞典中")

# 手動新增單詞'blog'的發音
prondict['blog'] = [['B', 'L', 'AA1', 'G']]
print(prondict['blog'])
# 輸出: [['B', 'L', 'AA1', 'G']]

內容解密:

  1. 載入CMU Pronouncing Dictionary:使用cmudict.dict()函式載入發音詞典,並將其儲存在prondict變數中。
  2. 查詢單詞發音:使用單詞作為鍵來查詢其發音資訊。例如,prondict['fire']傳回單詞’fire’的發音。
  3. 處理不存在的單詞:如果查詢的單詞不存在於詞典中,將引發KeyError。可以透過例外處理來捕捉並處理這種情況。
  4. 手動新增單詞發音:可以手動為不存在的單詞新增發音資訊,但這不會影響原始的NLTK語料函式庫。

文字轉語音

可以使用發音詞典來實作簡單的文字轉語音功能。下面的例子展示瞭如何將一個文字中的單詞轉換為其對應的發音。

text = ['natural', 'language', 'processing']
phonemes = [ph for w in text for ph in prondict[w][0]]
print(phonemes)
# 輸出: ['N', 'AE1', 'CH', 'ER0', 'AH0', 'L', 'L', 'AE1', 'NG', 'G', 'W', 'AH0', 'JH', 'P', 'R', 'AA1', 'S', 'EH0', 'S', 'IH0', 'NG']

內容解密:

  1. 文字處理:定義一個包含單詞的列表text
  2. 轉換為發音:使用列表推導式遍歷text中的每個單詞,並查詢其在prondict中的發音。將結果儲存在phonemes列表中。
  3. 輸出發音:列印預出phonemes列表,其中包含了文字中每個單詞的發音。

對比詞表

NLTK提供了Swadesh詞表,這是一種包含多種語言中常見詞彙的對比詞表。可以使用這些詞表來比較不同語言中的同源詞。

from nltk.corpus import swadesh

# 取得Swadesh詞表的語言列表
print(swadesh.fileids())

# 取得英文Swadesh詞表中的詞彙
print(swadesh.words('en'))

# 取得法語和英文的同源詞
fr2en = swadesh.entries(['fr', 'en'])
translate = dict(fr2en)
print(translate['chien'])
# 輸出: dog

# 新增德語和西班牙語的同源詞到翻譯字典中
de2en = swadesh.entries(['de', 'en'])
es2en = swadesh.entries(['es', 'en'])
translate.update(dict(de2en))
translate.update(dict(es2en))
print(translate['Hund'])
# 輸出: dog
print(translate['perro'])
# 輸出: dog

內容解密:

  1. 取得語言列表:使用swadesh.fileids()取得支援的語言列表。
  2. 取得同源詞:使用swadesh.entries(['fr', 'en'])取得法語和英文的同源詞,並將其轉換為字典。
  3. 翻譯:使用翻譯字典來查詢單詞的翻譯。
  4. 擴充套件翻譯字典:透過新增其他語言的同源詞來擴充套件翻譯字典。

Shoebox和Toolbox辭典

Shoebox(現稱為Toolbox)是一種由語言學家用於管理語言資料的工具。它儲存資料的方式是根據條目和欄位,這使得它比表格或試算表更具彈性。

使用Toolbox辭典

# Toolbox檔案範例
# 第一個條目表示單詞"kaa",意思是"to gag"

內容解密:

  1. Toolbox檔案結構:Toolbox檔案由多個條目組成,每個條目包含一個或多個欄位。
  2. 欄位的彈性:大多數欄位是可選或可重複的,這使得Toolbox辭典能夠處理複雜的語言資料。

本章節介紹瞭如何使用NLTK函式庫來存取和操作各種詞典資源,包括發音詞典、對比詞表和Shoebox/Toolbox辭典。這些資源對於自然語言處理任務至關重要,可以用於實作文字轉語音、翻譯等多種功能。