分詞器文件

元件

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

元件

構建分詞器時,您可以為其附加各種型別的元件以自定義其行為。本頁列出了大多數提供的元件。

歸一化器

Normalizer 負責對輸入字串進行預處理,以便根據特定用例對其進行歸一化。一些常見的歸一化示例包括 Unicode 歸一化演算法(NFD、NFKD、NFC 和 NFKC)、小寫轉換等。tokenizers 的特點是在歸一化時會跟蹤對齊資訊。這對於允許從生成的詞符映射回輸入文字至關重要。

Normalizer 是可選的。

Python
Rust
Node
名稱 描述 示例
NFD NFD unicode 歸一化
NFKD NFKD unicode 歸一化
NFC NFC unicode 歸一化
NFKC NFKC unicode 歸一化
Lowercase 將所有大寫字母替換為小寫字母 輸入:HELLO ὈΔΥΣΣΕΎΣ
輸出:helloὀδυσσεύς`
Strip 移除輸入字串指定側(左側、右側或兩側)的所有空白字元 輸入:"hi"
輸出:"hi"
StripAccents 移除 unicode 中的所有重音符號(為保持一致性,應與 NFD 一起使用) 輸入:é
輸出:e
Replace 替換自定義字串或正則表示式,並用給定內容更改它 Replace("a", "e") 的行為如下
輸入:"banana"
輸出:"benene"
BertNormalizer 提供了原始 BERT 中使用的 Normalizer 的實現。可以設定的選項有
  • clean_text
  • handle_chinese_chars
  • strip_accents
  • lowercase
Sequence 組合多個歸一化器,它們將按提供的順序執行 Sequence([NFKC(), Lowercase()])

預分詞器

PreTokenizer 負責根據一組規則拆分輸入。這種預處理可以確保底層的 Model 不會跨越多個“拆分”來構建詞符。例如,如果您不希望詞符內包含空格,那麼您可以使用一個 PreTokenizer 在這些空格處進行拆分。

您可以輕鬆地使用 Sequence(見下文)將多個 PreTokenizer 組合在一起。PreTokenizer 也允許修改字串,就像 Normalizer 一樣。這對於允許一些需要在歸一化之前進行拆分的複雜演算法(例如 ByteLevel)是必要的。

Python
Rust
Node
名稱 描述 示例
ByteLevel 在空格處進行拆分,同時將所有位元組重新對映到一組可見字元。這種技術由 OpenAI 與 GPT-2 一同引入,並具有一些或多或少不錯的特性
  • 由於它基於位元組進行對映,使用此方法的分詞器只需要 256 個字元作為初始字母表(位元組可以具有的值的數量),而不是 130,000 多個 Unicode 字元。
  • 上一點的一個結果是,使用這種方法完全不需要未知詞符,因為我們可以用 256 個詞符表示任何內容(太棒了!🎉🎉)
  • 對於非 ASCII 字元,它變得完全不可讀,但仍然可以工作!
輸入:"Hello my friend, how are you?"
輸出:"Hello", "Ġmy", Ġfriend", ",", "Ġhow", "Ġare", "Ġyou", "?"
Whitespace 在單詞邊界處進行拆分(使用以下正則表示式:\w+|[^\w\s]+ 輸入:"Hello there!"
輸出:"Hello", "there", "!"
WhitespaceSplit 在任何空白字元處進行拆分 輸入:"Hello there!"
輸出:"Hello", "there!"
標點符號 將隔離所有標點符號 輸入:"Hello?"
輸出:"Hello", "?"
Metaspace 在空格處進行拆分,並用特殊字元“ ”(U+2581)替換它們 輸入:"Hello there"
輸出:"Hello", " there"
CharDelimiterSplit 在給定的字元處進行拆分 x 為例
輸入:"Helloxthere"
輸出:"Hello", "there"
Digits 將數字與任何其他字元分開。 輸入:"Hello123there"
輸出:"Hello", "123", "there"
Split 多功能的預分詞器,可根據提供的模式和行為進行拆分。如有必要,可以反轉模式。
  • pattern 應為自定義字串或正則表示式。
  • behavior 應為以下之一
    • removed
    • isolated
    • merged_with_previous
    • merged_with_next
    • contiguous
  • invert 應為一個布林標誌。
示例:pattern = , behavior = "isolated", invert = False
輸入:"Hello, how are you?"
輸出:"Hello,", " ", "how", " ", "are", " ", "you?"
Sequence 允許您組合多個 PreTokenizer,它們將按給定順序執行 Sequence([Punctuation(), WhitespaceSplit()])

模型

模型是用於實際分詞的核心演算法,因此,它們是分詞器唯一必需的元件。

名稱 描述
WordLevel 這是“經典”的分詞演算法。它讓您簡單地將單詞對映到 ID,沒有任何花哨的操作。這具有使用和理解起來非常簡單的優點,但它需要非常大的詞彙表才能有好的覆蓋率。使用此 Model 需要使用 PreTokenizer。此模型不會直接做出任何選擇,它只是將輸入詞符對映到 ID。
BPE 最流行的子詞分詞演算法之一。位元組對編碼(Byte-Pair-Encoding)的工作原理是從字元開始,將最常一起出現的字元對合並,從而建立新的詞符。然後它迭代地工作,從語料庫中看到的最頻繁的詞對構建新的詞符。BPE 能夠透過使用多個子詞詞符來構建它從未見過的單詞,因此需要較小的詞彙表,出現“unk”(未知)詞符的機會也較小。
WordPiece 這是一種與 BPE 非常相似的子詞分詞演算法,主要由 Google 在 BERT 等模型中使用。它使用一種貪心演算法,首先嚐試構建長單詞,當整個單詞在詞彙表中不存在時,再將其拆分為多個詞符。這與 BPE 不同,BPE 是從字元開始,儘可能地構建更大的詞符。它使用著名的 ## 字首來標識作為單詞一部分(即不以單詞開頭)的詞符。
Unigram Unigram 也是一種子詞分詞演算法,其工作原理是嘗試識別最佳的子詞詞符集,以最大化給定句子的機率。這與 BPE 的不同之處在於,它不是基於一系列順序應用的規則來確定的。相反,Unigram 將能夠計算多種分詞方式,並選擇最可能的一種。

後處理器

在整個流水線之後,我們有時希望在將分詞後的字串送入模型之前插入一些特殊詞符,例如“[CLS] My horse is amazing [SEP]”。PostProcessor 就是完成這項工作的元件。

名稱 描述 示例
TemplateProcessing 讓您可以輕鬆地對後處理進行模板化,新增特殊詞符,併為每個序列/特殊詞符指定 type_id。模板需要提供兩個字串,分別代表單個序列和序列對,以及一組要使用的特殊詞符。 例如,當使用以下值指定模板時
  • 單個序列:"[CLS] $A [SEP]"
  • 序列對:"[CLS] $A [SEP] $B [SEP]"
  • 特殊詞符
    • "[CLS]"
    • "[SEP]"

輸入:("I like this", "but not this")
輸出:"[CLS] I like this [SEP] but not this [SEP]"

解碼器

解碼器知道如何將分詞器使用的 ID 轉換回可讀的文字片段。例如,某些 NormalizerPreTokenizer 使用的特殊字元或識別符號需要被還原。

名稱 描述
ByteLevel 反轉 ByteLevel 預分詞器。該預分詞器在位元組級別進行編碼,使用一組可見的 Unicode 字元來表示每個位元組,因此我們需要一個解碼器來反轉此過程以獲得可讀的內容。
Metaspace 反轉 Metaspace 預分詞器。該預分詞器使用特殊識別符號 來識別空格,因此該解碼器有助於解碼這些識別符號。
WordPiece 反轉 WordPiece 模型。該模型使用特殊識別符號 ## 來表示連續的子詞,因此該解碼器有助於解碼這些識別符號。
< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.