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)

內容解密:

  1. len(text) 用於計算文字中的詞元數量,即文字列表中的元素個數。
  2. len(set(text)) 用於計算不重複的詞元數量,即詞型的數量。set(text) 去除了重複的詞元。
  3. sorted(set(text)) 用於取得按字母順序排列的詞彙表。先用 set(text) 去除重複詞元,再用 sorted() 排序。
  4. 列表推導式 [f(x) for x in text] 提供了一種簡潔的方式來對文字中的每個詞進行操作,例如轉換為小寫。
  5. 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}")

內容解密:

  1. Python直譯器可直接作為計算器使用
  2. 運算式12 / (4 + 1)先計算括號內的值(4+1=5)
  3. 最終結果為12除以5,等於2.4

練習題2:字母組合計算

任務描述

計算由26個字母組成長度為100的字串的總數。

程式碼實作

# 計算可能的字串數量
alphabet_size = 26
string_length = 100
total_combinations = alphabet_size ** string_length
print(f"可能的字串數量:{total_combinations}")

內容解密:

  1. 使用指數運算**計算總組合數
  2. 結果為26的100次方,是一個龐大的數字
  3. 這種計算在密碼學和組合數學中十分常見

練習題3:列表乘法操作

任務描述

測試將列表['Monty', 'Python']乘以20的效果。

程式碼實作

# 列表乘法示範
original_list = ['Monty', 'Python']
repeated_list = original_list * 20
print(f"重複後的列表長度:{len(repeated_list)}")

內容解密:

  1. 列表乘法會重複列表內容指定的次數
  2. 原列表長度為2,重複20次後變為40
  3. 這種操作在需要初始化重複資料時很有用

練習題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}")

內容解密:

  1. len(text2)計算文字總詞數
  2. len(set(text2))計算不同詞的數量
  3. 這兩個指標是文字分析的基本資料

練習題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}")

內容解密:

  1. 詞彙多樣性是衡量文字豐富程度的指標
  2. 計算公式為不同詞數除以總詞數
  3. 值越高表示文字詞彙越豐富

練習題6:人物出現頻率分佈圖

任務描述

為《理智與情感》中的四個主要人物繪製出現頻率分佈圖。

程式碼實作

import nltk
from nltk.book import text2

# 主要人物名稱列表
characters = ['Elinor', 'Marianne', 'Edward', 'Willoughby']

# 繪製分佈圖
text2.dispersion_plot(characters)

內容解密:

  1. dispersion_plot用於展示詞語在文字中的分佈情況
  2. 可以觀察人物在不同情節中的出現模式
  3. 有助於分析人物的戲份和敘事結構

練習題7:搭配詞分析

任務描述

找出text5中的搭配詞。

程式碼實作

import nltk
from nltk.book import text5

# 找出搭配詞
text5.collocations()

內容解密:

  1. collocations()方法用於找出常見的詞語搭配
  2. 結果顯示具有特殊意義的片語組合
  3. 在語言研究中具有重要意義

練習題8:集合運算理解

任務描述

分析表示式len(set(text4))的作用。

程式碼實作與解析

此表示式執行兩個主要步驟:

  1. set(text4)將文字轉換為一個包含唯一詞語的集合,去除重複詞語。
  2. 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)