在自然語言處理中,tokenizer
是一個非常關鍵的元件,它將文字轉化為模型可以理解的格式。這個過程通常包括以下幾個步驟:
1. 文字標準化
- 小寫化:將所有文字轉換為小寫,以減少不同形式的單詞(如 "Apple" 和 "apple")被視為不同詞的情況。
- 去除標點符號:刪除或替換標點符號,不過在某些場景下,保留標點符號可能是有必要的,因為它們包含情感或語法資訊。
- 去除特殊字元:移除不必要的字元,比如 HTML 標籤或其他非語言符號。
2. 分詞(Tokenization)
- 按空格分詞:最簡單的方式是按空格分詞,將每個單詞視為一個 token。但這無法處理複雜情況,如多詞短語或連線符。
- 子詞分詞(Subword Tokenization):例如在 BERT 和 RoBERTa 中使用的 Byte-Pair Encoding (BPE) 或 WordPiece。這些演算法會將罕見詞拆分為更小的子詞,從而減少詞彙量,並提高模型處理新詞或罕見詞的能力。
- 字元級分詞:將每個字元視為一個 token,適用於處理拼寫錯誤頻繁或詞彙量特別大的情況。
3. 詞彙表對映
- 詞彙表構建:
tokenizer
會使用一個預定義的詞彙表(vocabulary)或在訓練過程中構建的詞彙表。詞彙表中每個 token 都對應一個唯一的 ID。 - 未知詞處理:對於詞彙表中沒有的詞,通常會用一個特殊的
<UNK>
token 或者將其拆分為已知的子詞來表示。
4. 附加特殊標記
- 起始標記和結束標記:例如
<CLS>
用於句子開頭,<SEP>
用於句子分隔。BERT 和 RoBERTa 等模型會在輸入句子時新增這些標記。 - 填充(Padding):為了使輸入批次中的所有序列具有相同長度,短於最大長度的序列會被填充,通常使用
<PAD>
token。
5. 編碼(Encoding)
- Token ID 轉換:將每個 token 轉換為詞彙表中的對應 ID。
- 生成注意力掩碼(Attention Mask):對於填充的部分生成一個掩碼,用於告知模型忽略這些部分。
- 位置編碼(Positional Encoding):有些模型需要為每個 token 提供位置編碼,以保持序列資訊(儘管這個步驟通常由模型內部處理)。
6. 返回編碼後的輸出
- 最終,
tokenizer
會輸出一個包含 token ID 的序列,注意力掩碼,以及可能的其他輔助資訊,如 token 型別 ID(用於區分句子 A 和句子 B)。
示例:Hugging Face 的 transformers
庫中的 tokenizer
from transformers import RobertaTokenizer
# 載入預訓練的 RoBERTa tokenizer
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
# 輸入文字
text = "Hello, how are you?"
# 執行tokenizer,包含分詞、詞彙表對映、新增特殊標記等步驟
tokens = tokenizer(text, padding=True, truncation=True, return_tensors="pt")
# 列印輸出
print(tokens)
在這個示例中,tokenizer
將文字 "Hello, how are you?" 轉換為 RoBERTa 模型可以接受的格式,包括 token ID、注意力掩碼等。
總結
tokenizer
是將自然語言文字轉化為模型輸入的關鍵元件。它包含文字標準化、分詞、詞彙表對映、新增特殊標記、編碼等多個步驟,使得模型能夠理解和處理輸入文字。