HuggingFace的transformers 庫中的tokenizer介紹

海_纳百川發表於2024-08-11

在自然語言處理中,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 是將自然語言文字轉化為模型輸入的關鍵元件。它包含文字標準化、分詞、詞彙表對映、新增特殊標記、編碼等多個步驟,使得模型能夠理解和處理輸入文字。

相關文章