Python 的字串格式化功能允許開發者精確控制字串輸出樣式,提升程式碼可讀性。從基本的 % 運算元到更進階的 format 方法,Python 提供多種方式嵌入變數並設定格式。此外,利用正規表示式可以有效率地處理文字,例如驗證電子郵件格式或從檔案中提取特定資訊。NLTK 函式庫則提供更進階的文字分析工具,例如分詞、詞性標注和詞形還原,方便進行自然語言處理任務。實務上,經常需要從網頁中提取文字資訊,使用 BeautifulSoup 等工具可以簡化網頁解析和資料萃取的流程,並搭配正規表示式進行資料清理和格式轉換。

字串格式化與文書處理

在自然語言處理(NLP)中,字串格式化是一項基本且重要的技術。它允許我們將變數嵌入字串中,並控制輸出的格式。本章節將探討字串格式化的原理和應用。

格式化運算元:%

Python 中使用 % 運算元進行字串格式化。這種方法透過在字串中嵌入特殊符號(如 %s%d),然後使用 % 運算元將實際值插入這些位置。

基本用法

>>> '%s->' % 'cat'
'cat->'
>>> '%d' % 3
'3'
>>> 'I want a %s right now' % 'coffee'
'I want a coffee right now'

多個佔位符

當有多個佔位符時,需要提供一個元組(tuple)來對應這些佔位符。

>>> "%s wants a %s %s" % ("Lee", "sandwich", "for lunch")
'Lee wants a sandwich for lunch'

動態替換

可以使用迴圈動態替換佔位符。

>>> template = 'Lee wants a %s right now'
>>> menu = ['sandwich', 'spam fritter', 'pancake']
>>> for snack in menu:
...     print(template % snack)
...
Lee wants a sandwich right now
Lee wants a spam fritter right now
Lee wants a pancake right now

內容解密:

  1. %s%d 是轉換規範符,分別用於字串和十進位整數。
  2. 使用 % 運算元將格式字串與值元組結合,生成最終字串。
  3. 可以使用迴圈動態替換佔位符,提高程式的靈活性。

對齊與寬度控制

在格式化輸出時,可以指定欄位的寬度和對齊方式。

右對齊與左對齊

>>> '%6s' % 'dog'
'   dog'
>>> '%-6s' % 'dog'
'dog   '

動態寬度

可以使用 * 代替寬度值,然後透過變數指定。

>>> width = 6
>>> '%-*s' % (width, 'dog')
'dog   '

內容解密:

  1. %6s 指定欄位寬度為 6,並預設右對齊。
  2. %-6s 指定欄位寬度為 6,並左對齊。
  3. 使用 * 和變數動態控制欄位寬度,使程式更具靈活性。

浮點數與百分比格式化

對於浮點數和百分比,可以使用特定的格式化控制符號。

>>> count, total = 3205, 9375
>>> "accuracy for %d words: %2.4f%%" % (total, 100 * count / total)
'accuracy for 9375 words: 34.1867%'

內容解密:

  1. %d 用於整數格式化。
  2. %2.4f 用於浮點數格式化,指定小數點後四位。
  3. %% 用於輸出百分比符號。

製表與資料對齊

在處理資料時,經常需要將結果製成表格。以下是一個例子,展示如何使用格式化字串對齊資料。

示例程式碼

def tabulate(cfdist, words, categories):
    print('%-16s' % 'Category', end=' ')
    for word in words:
        print('%6s' % word, end=' ')
    print()
    for category in categories:
        print('%-16s' % category, end=' ')
        for word in words:
            print('%6d' % cfdist[category][word], end=' ')
        print()

# 使用 NLTK 的 Brown 語料函式庫進行示範
from nltk.corpus import brown
cfd = nltk.ConditionalFreqDist(
    (genre, word)
    for genre in brown.categories()
    for word in brown.words(categories=genre))
genres = ['news', 'religion', 'hobbies', 'science_fiction', 'romance', 'humor']
modals = ['can', 'could', 'may', 'might', 'must', 'will']
tabulate(cfd, modals, genres)

輸出結果

Category           can  could    may  might   must   will 
news                 93     86     66     38     50    389 
religion             82     59     78     12     54     71 
hobbies             268     58    131     22     83    264 
science_fiction      16     49      4     12      8     16 
romance              74    193     11     51     45     43 
humor                16     30      8      8      9     13 

資料製表流程圖

  graph LR;
    A[開始] --> B[定義製表函式];
    B --> C[列印欄位名稱];
    C --> D[遍歷類別並列印資料];
    D --> E[結束];

圖表翻譯: 此圖示展示了資料製表的流程。首先定義製表函式,然後列印欄位名稱,接著遍歷各個類別並列印相應的資料,最後結束製表過程。

內容解密:

  1. 使用 %-16s%6s 控制欄位寬度和對齊。
  2. cfdist[category][word] 取得特定類別和單詞的頻率。
  3. 製表函式實作了資料的有序排列和輸出。

將結果寫入檔案

除了在控制檯輸出結果,還可以將結果寫入檔案。

示例程式碼

output_file = open('output.txt', 'w')
words = set(nltk.corpus.genesis.words('english-kjv.txt'))
for word in sorted(words):
    output_file.write(word + "\n")
output_file.write(str(len(words)) + "\n")
output_file.close()

注意事項

  1. 使用 open 函式開啟檔案,並指定寫入模式 'w'
  2. 使用 write 方法將字串寫入檔案。
  3. 使用 close 方法關閉檔案。
  4. 在寫入非文字資料前,需將其轉換為字串。

文字換行處理

當輸出的文字過長時,可以使用 textwrap 模組進行換行處理。

from textwrap import fill
saying = ['After', 'all', 'is', 'said', 'and', 'done', ',',
          'more', 'is', 'said', 'than', 'done', '.']
text = ', '.join(saying) + '.'
wrapped_text = fill(text, width=40)
print(wrapped_text)

Python中的文書處理與正規表示式應用

在Python程式設計中,文書處理是一項基本且重要的技能。透過適當的文書處理技術,我們可以有效地操作和分析文字資料,從而提取有用的資訊或進行進一步的運算。本文將探討Python中的文書處理方法,特別是正規表示式的應用,以及如何利用NLTK函式庫進行更進階的文書處理。

文字基本操作

Python提供了多種內建的方法來處理文字資料。以下是一些基本的文字操作:

  1. 字串索引與切片:可以使用索引來存取字串中的特定字元,並且可以透過切片來取得字串的子字串。

    text = 'Monty Python'
    print(text[0])  # 輸出:M
    print(text[1:5])  # 輸出:onty
    
  2. 字串分割與合併:可以使用split()方法將字串分割成列表,也可以使用join()方法將列表中的元素合併成一個字串。

    words = 'Monty Python'.split()
    print(words)  # 輸出:['Monty', 'Python']
    
    path = '/'.join(words)
    print(path)  # 輸出:Monty/Python
    

內容解密:

  • text[0]表示存取字串的第一個字元。
  • text[1:5]表示取得從索引1開始到索引5(不包含)的子字串。
  • split()方法預設根據空白字元進行分割。
  • join()方法將列表中的元素以指定的分隔符(此例為'/')進行合併。

正規表示式

正規表示式是一種強大且靈活的模式匹配工具,可以用來搜尋、驗證和提取文字資料中的特定模式。Python的re模組提供了對正規表示式的支援。

  1. 搜尋與匹配:可以使用re.findall()函式來找出字串中所有符合特定模式的子字串。

    import re
    
    text = 'Hello, my email is example@gmail.com.'
    emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
    print(emails)  # 輸出:['example@gmail.com']
    
  2. 特殊字元與轉義:在使用正規表示式時,需要注意某些字元具有特殊含義。如果需要匹配這些字元本身,需要使用反斜線(\)進行轉義。

    # 匹配點(.)字元
    pattern = r'\.'
    

內容解密:

  • re.findall()函式用於找出所有符合模式的子字串。
  • 正規表示式模式中的\b表示單詞邊界,[A-Za-z0-9._%+-]+匹配一個或多個字母、數字或特定字元,@匹配@符號,[A-Za-z0-9.-]+匹配一個或多個字母、數字、點或連字元,\.匹配點(.)字元,[A-Z|a-z]{2,}匹配兩個或以上的字母。
  • 在正規表示式中,反斜線(\)用於轉義特殊字元,使其被視為普通字元。

NLTK函式庫的應用

NLTK(Natural Language Toolkit)是一個用於自然語言處理的強大Python函式庫。它提供了豐富的功能和工具,可以幫助我們更有效地處理和分析文字資料。

  1. 分詞:NLTK提供了word_tokenize()函式,可以將文字分割成單個的詞或符號。

    import nltk
    from nltk.tokenize import word_tokenize
    
    text = 'This is an example sentence.'
    tokens = word_tokenize(text)
    print(tokens)  # 輸出:['This', 'is', 'an', 'example', 'sentence', '.']
    
  2. 詞形還原:NLTK的WordNetLemmatizer可以將詞的不同形式還原為其基本形式(詞元)。

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    word = 'running'
    lemma = lemmatizer.lemmatize(word, pos='v')  # pos='v' 表示動詞
    print(lemma)  # 輸出:run
    

內容解密:

  • word_tokenize()函式將輸入的文字分割成單個的詞或符號。
  • WordNetLemmatizer用於將詞的不同形式還原為其基本形式。
  • 在進行詞形還原時,需要指定詞性(pos),以確保正確的還原結果。

文書處理的最佳實踐

在進行文書處理時,以下是一些最佳實踐:

  1. 清理無關資料:在處理網頁文字時,可能需要移除無關的標頭、頁尾和標記。
  2. 使用適當的分詞方法:根據應用的需求,選擇適當的分詞方法,以確保正確的詞級處理。
  3. 利用正規表示式進行模式匹配:正規表示式是一種強大的工具,可以用來搜尋和提取特定的文字模式。
  4. 結合NLTK等函式庫進行進階處理:NLTK等函式庫提供了豐富的功能,可以幫助我們更有效地進行文書處理和分析。

隨著自然語言處理技術的不斷進步,未來我們可以期待更多高效、準確的文書處理工具和方法的出現。同時,結合機器學習和深度學習技術,將進一步提升文書處理和分析的能力。因此,持續學習和掌握最新的技術和方法,將是保持競爭力的關鍵。

  graph LR;
    A[開始] --> B[清理無關資料];
    B --> C[選擇適當分詞方法];
    C --> D[利用正規表示式];
    D --> E[結合NLTK進行進階處理];
    E --> F[持續學習與改進];

圖表翻譯: 此圖示展示了文書處理的基本流程。首先,從原始資料中清理無關的資訊,接著選擇適當的分詞方法,然後利用正規表示式進行模式匹配,最後結合NLTK等函式庫進行進階的文書處理。透過這樣的流程,可以有效地提升文書處理的效率和準確性。持續學習與改進是保持競爭力的關鍵。

深入理解Python文字處理:從基礎到進階

Python在自然語言處理(NLP)領域有著廣泛的應用,而文字處理是NLP的基礎。本文將探討Python中的文字處理技術,從基本的字串操作到進階的正規表示式和文字分析。

字串基礎操作

Python中的字串是不可變的序列,可以透過索引和切片進行存取和操作。

索引和切片

索引允許我們存取字串中的單個字元。例如:

s = 'colorless'
print(s[0])  # 輸出:c

切片則允許我們提取字串的子串:

print(s[1:5])  # 輸出:olor

字串連線和替換

我們可以使用+運算子來連線字串:

s1 = 'color'
s2 = 'less'
print(s1 + s2)  # 輸出:colorless

要將’colorless’轉換為’colourless’,可以使用切片和連線操作:

s = 'colorless'
new_s = s[:4] + 'u' + s[4:]
print(new_s)  # 輸出:colourless

內容解密:

  1. s = 'colorless':定義一個字串變數s,內容為’colorless’。
  2. s[:4]:取得字串s的前4個字元,即’color’。
  3. 'u':要插入的字元’u’。
  4. s[4:]:取得字串s從第5個字元開始到結束的子串,即’less’。
  5. 將上述三部分連線起來,形成新的字串’colourless’。

正規表示式

正規表示式是一種強大的文字匹配工具,可以用於搜尋、替換和驗證文字模式。

基本匹配

例如,要匹配一個或多個字母,可以使用:

import re
pattern = r'[a-zA-Z]+'
text = 'Hello, World!'
matches = re.findall(pattern, text)
print(matches)  # 輸出:['Hello', 'World']

內容解密:

  1. import re:匯入Python的正規表示式模組。
  2. pattern = r'[a-zA-Z]+':定義一個正規表示式模式,匹配一個或多個字母。
    • [a-zA-Z]:匹配任何一個大小寫字母。
    • +:表示前面的元素至少出現一次。
  3. text = 'Hello, World!':定義要搜尋的文字。
  4. re.findall(pattern, text):在text中查詢所有匹配pattern的子串。
  5. 輸出結果為所有匹配的子串列表。

文字標記化

標記化是將文字分割成單詞或詞素的過程。Python的NLTK函式庫提供了強大的標記化功能。

使用NLTK進行標記化

import nltk
from nltk.tokenize import word_tokenize

text = "This is an example sentence."
tokens = word_tokenize(text)
print(tokens)  # 輸出:['This', 'is', 'an', 'example', 'sentence', '.']

內容解密:

  1. import nltk:匯入NLTK函式庫。
  2. from nltk.tokenize import word_tokenize:從NLTK的tokenize模組匯入word_tokenize函式。
  3. text = "This is an example sentence.":定義要標記化的文字。
  4. word_tokenize(text):對文字進行標記化處理,將其分割成單詞和標點符號。
  5. 輸出結果為標記化後的單詞列表。

網頁文字提取

在實際應用中,我們經常需要從網頁中提取文字。可以使用Python的urllib和BeautifulSoup函式庫來實作。

示例程式碼

import urllib.request
from bs4 import BeautifulSoup

url = 'http://www.nltk.org/'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
soup = BeautifulSoup(html, 'html.parser')
text = soup.get_text()
print(text)

內容解密:

  1. import urllib.request:匯入urllib.request模組,用於傳送HTTP請求。
  2. from bs4 import BeautifulSoup:從bs4函式庫匯入BeautifulSoup類別,用於解析HTML。
  3. url = 'http://www.nltk.org/':定義要存取的網頁URL。
  4. urllib.request.urlopen(url):傳送HTTP請求,開啟指定的URL。
  5. response.read().decode('utf-8'):讀取網頁內容並解碼為UTF-8格式的字串。
  6. BeautifulSoup(html, 'html.parser'):使用HTML解析器解析網頁內容。
  7. soup.get_text():從解析後的HTML中提取純文字內容。

練習與挑戰

  1. 編寫一個函式,從給定的文字中提取所有的網址。
  2. 使用正規表示式匹配和提取電子郵件地址。
  3. 對比不同的標記化方法對同一文字的處理結果。

隨著NLP技術的不斷發展,未來將會有更多高效、準確的文字處理工具和方法出現。持續學習和關注最新的研究成果,將有助於在NLP領域保持領先地位。