Python 提供了靈活的文字表示和處理方式,通常使用列表儲存詞元序列。利用索引、切片和 len()
函式等內建功能,可以有效操作文字資料。區分詞元和詞型的概念對於詞彙分析至關重要,使用 set()
可以輕鬆計算詞型數量並構建詞彙表。列表推導式是簡潔高效的文字處理工具,結合字串方法可以實作大小寫轉換、標點符號過濾等常用操作。NLTK 函式庫提供更進階的文字分析功能,例如計算頻率分佈和查詢搭配詞等,對於深入理解文字資料非常有幫助。
import nltk
from nltk.book import *
# 計算詞彙多樣性
def lexical_diversity(text):
return len(set(text)) / len(text)
Python 中的文字表示與處理
本章還介紹瞭如何在 Python 中表示和處理文字。以下是一些關鍵點:
- 文字在 Python 中以列表形式表示,例如:
['Monty', 'Python']
。 - 我們可以使用索引、切片和
len()
函式來操作列表。 - 詞元(token)是指某個詞在文字中的特定出現次數;詞型(type)則是指詞的唯一形式,即特定的字母序列。我們使用
len(text)
來計算詞元數量,使用len(set(text))
來計算詞型數量。 - 透過
sorted(set(t))
可以獲得文字t
的詞彙表。 - 使用列表推導式
[f(x) for x in text]
可以對文字中的每個專案進行操作。 - 要獲得不區分大小寫且忽略標點符號的詞彙表,可以使用
set([w.lower() for w in text if w.isalpha()])
。
Python 程式碼範例
# 定義一個文字
text = ['This', 'is', 'a', 'sample', 'text', '.']
# 取得文字長度(詞元數量)
print("詞元數量:", len(text))
# 取得不重複詞元數量(詞型數量)
print("詞型數量:", len(set(text)))
# 取得詞彙表(按字母順序排列)
vocabulary = sorted(set(text))
print("詞彙表:", vocabulary)
# 對文字中的每個詞進行操作,例如轉為小寫
lower_case_text = [word.lower() for word in text]
print("小寫文字:", lower_case_text)
# 取得不區分大小寫且忽略標點符號的詞彙表
clean_vocabulary = set([word.lower() for word in text if word.isalpha()])
print("清理後的詞彙表:", clean_vocabulary)
內容解密:
len(text)
用於計算文字中的詞元數量,即文字列表中的元素個數。len(set(text))
用於計算不重複的詞元數量,即詞型的數量。set(text)
去除了重複的詞元。sorted(set(text))
用於取得按字母順序排列的詞彙表。先用set(text)
去除重複詞元,再用sorted()
排序。- 列表推導式
[f(x) for x in text]
提供了一種簡潔的方式來對文字中的每個詞進行操作,例如轉換為小寫。 set([w.lower() for w in text if w.isalpha()])
用於取得不區分大小寫且忽略標點符號的詞彙表。其中,w.lower()
將詞轉為小寫,if w.isalpha()
過濾掉非字母字元。
控制結構與頻率分佈
本章還介紹了 Python 中的控制結構,如 for
迴圈和 if
陳述式,這些對於處理文字資料非常重要。例如,使用 for
迴圈可以遍歷文字中的每個詞,並執行特定的操作。
# 示例:遍歷文字並列印每個詞
for word in text:
print(word)
內容解密:
for word in text:
這是一個for
迴圈,用於遍歷text
列表中的每個元素,並將其指定給變數word
。print(word)
在每次迴圈中列印當前的word
。
此外,本章還介紹了頻率分佈的概念,即統計文字中每個詞出現的頻率。這可以使用 NLTK 函式庫中的 FreqDist
類別來實作。
import nltk
from nltk import FreqDist
# 示例:計算文字中每個詞的頻率
freq_dist = FreqDist(text)
print(freq_dist.most_common())
內容解密:
FreqDist(text)
用於建立一個頻率分佈物件,其中包含了文字中每個詞及其出現頻率的資訊。freq_dist.most_common()
傳回按頻率排序的最常見的詞及其頻率。
NLP 處理流程圖
graph LR; A[輸入文字] --> B[分詞]; B --> C[去除停用詞]; C --> D[詞形還原]; D --> E[句法分析]; E --> F[語義角色標註]; F --> G[輸出結果];
圖表翻譯: 此圖展示了一個典型的 NLP 處理流程。首先,輸入文字經過分詞處理,被拆分成單個的詞或標記。接著,去除停用詞(如「的」、「是」等常見但無實際意義的詞)。然後,進行詞形還原,將不同形式的詞還原為其基本形式。隨後,進行句法分析,以理解句子的結構。最後,透過語義角色標註來理解句子中各個成分之間的語義關係,並輸出最終結果。
Python自然語言處理練習題詳解
緒論
本章節將針對Python自然語言處理(NLP)的基礎練習題進行詳細解析。透過這些練習,不僅能鞏固Python程式設計基礎,更能深入理解NLP的核心概念與技術實作。
練習題1:Python直譯器計算功能測試
任務描述
使用Python直譯器進行基本數學運算,如計算12 / (4 + 1)。
程式碼實作
# 使用Python直譯器進行數學運算
result = 12 / (4 + 1)
print(f"計算結果:{result}")
內容解密:
- Python直譯器可直接作為計算器使用
- 運算式12 / (4 + 1)先計算括號內的值(4+1=5)
- 最終結果為12除以5,等於2.4
練習題2:字母組合計算
任務描述
計算由26個字母組成長度為100的字串的總數。
程式碼實作
# 計算可能的字串數量
alphabet_size = 26
string_length = 100
total_combinations = alphabet_size ** string_length
print(f"可能的字串數量:{total_combinations}")
內容解密:
- 使用指數運算
**
計算總組合數 - 結果為26的100次方,是一個龐大的數字
- 這種計算在密碼學和組合數學中十分常見
練習題3:列表乘法操作
任務描述
測試將列表['Monty', 'Python']
乘以20的效果。
程式碼實作
# 列表乘法示範
original_list = ['Monty', 'Python']
repeated_list = original_list * 20
print(f"重複後的列表長度:{len(repeated_list)}")
內容解密:
- 列表乘法會重複列表內容指定的次數
- 原列表長度為2,重複20次後變為40
- 這種操作在需要初始化重複資料時很有用
練習題4:文字分析基礎
任務描述
計算text2中的總詞數和不同詞數。
程式碼實作
import nltk
from nltk.book import text2
# 計算文字詞彙統計
total_words = len(text2)
unique_words = len(set(text2))
print(f"總詞數:{total_words}")
print(f"不同詞數:{unique_words}")
內容解密:
len(text2)
計算文字總詞數len(set(text2))
計算不同詞的數量- 這兩個指標是文字分析的基本資料
練習題5:詞彙多樣性比較
任務描述
比較幽默和浪漫小說的詞彙多樣性。
程式碼實作
# 詞彙多樣性計算函式
def lexical_diversity(text):
return len(set(text)) / len(text)
# 比較不同文字的詞彙多樣性(假設text_humor和text_romance已定義)
diversity_humor = lexical_diversity(text_humor)
diversity_romance = lexical_diversity(text_romance)
print(f"幽默文字多樣性:{diversity_humor:.4f}")
print(f"浪漫文字多樣性:{diversity_romance:.4f}")
內容解密:
- 詞彙多樣性是衡量文字豐富程度的指標
- 計算公式為不同詞數除以總詞數
- 值越高表示文字詞彙越豐富
練習題6:人物出現頻率分佈圖
任務描述
為《理智與情感》中的四個主要人物繪製出現頻率分佈圖。
程式碼實作
import nltk
from nltk.book import text2
# 主要人物名稱列表
characters = ['Elinor', 'Marianne', 'Edward', 'Willoughby']
# 繪製分佈圖
text2.dispersion_plot(characters)
內容解密:
dispersion_plot
用於展示詞語在文字中的分佈情況- 可以觀察人物在不同情節中的出現模式
- 有助於分析人物的戲份和敘事結構
練習題7:搭配詞分析
任務描述
找出text5中的搭配詞。
程式碼實作
import nltk
from nltk.book import text5
# 找出搭配詞
text5.collocations()
內容解密:
collocations()
方法用於找出常見的詞語搭配- 結果顯示具有特殊意義的片語組合
- 在語言研究中具有重要意義
練習題8:集合運算理解
任務描述
分析表示式len(set(text4))
的作用。
程式碼實作與解析
此表示式執行兩個主要步驟:
set(text4)
將文字轉換為一個包含唯一詞語的集合,去除重複詞語。len(...)
計算這個集合的大小,即不同詞語的數量。
import nltk
from nltk.book import text4
# 計算不同詞語數量
unique_word_count = len(set(text4))
print(f"不同詞語數量:{unique_word_count}")
練習題9:字串操作實踐
程式碼實作
# 定義字串變數
my_string = 'NLP基礎很有趣'
# 方法一:直接輸出
print("直接輸出:", my_string)
# 方法二:使用print()函式
print("使用print()輸出:", my_string)
# 字串相加
concatenated_string = my_string + my_string
print("字串相加結果:", concatenated_string)
# 字串乘法
repeated_string = my_string * 3
print("字串重複結果:", repeated_string)
# 修正常見問題
# 原本結果: 'NLP基礎很有趣NLP基礎很有趣'
# 改進方法
fixed_concatenation = my_string + ' ' + my_string
print("修正後的字串相加:", fixed_concatenation)
練習題10:列表與字串轉換
程式碼實作
my_sent = ["自然", "語言", "處理"]
# 將列表轉換為字串
string_form = ' '.join(my_sent)
print("轉換後的字串:", string_form)
# 將字串轉回列表
list_form = string_form.split()
print("轉回列表:", list_form)
練習題11:列表相加特性驗證
程式碼實作
phrase1 = ["今天", "天氣"]
phrase2 = ["很", "好"]
# 合併列表
combined_phrase = phrase1 + phrase2
print("合併後列表長度:", len(combined_phrase))
print("個別列表長度總和:", len(phrase1) + len(phrase2))
# 結果驗證
print("兩種長度計算是否相等:", len(combined_phrase) == len(phrase1) + len(phrase2))
練習題12:索引與切片比較
a. "Monty Python"[6:12]
→ 輸出 'Python'
b. ["Monty", "Python"][1]
→ 輸出 'Python'
在NLP中,a方法較為常見,因為它適用於字串處理。
練習題13:多維索引操作
import nltk
from nltk.book import sent1
# 存取特定字元
result = sent1[2][2]
print("存取結果:", result)
練習題14:特定詞索引查詢
import nltk
from nltk.book import sent3
# 查詢'the'的所有索引位置
indices = [i for i, word in enumerate(sent3) if word == 'the']
print("索引位置:", indices)