分詞器文件
元件
加入 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 的實現。可以設定的選項有
| |
Sequence | 組合多個歸一化器,它們將按提供的順序執行 | Sequence([NFKC(), Lowercase()]) |
預分詞器
PreTokenizer
負責根據一組規則拆分輸入。這種預處理可以確保底層的 Model
不會跨越多個“拆分”來構建詞符。例如,如果您不希望詞符內包含空格,那麼您可以使用一個 PreTokenizer
在這些空格處進行拆分。
您可以輕鬆地使用 Sequence
(見下文)將多個 PreTokenizer
組合在一起。PreTokenizer
也允許修改字串,就像 Normalizer
一樣。這對於允許一些需要在歸一化之前進行拆分的複雜演算法(例如 ByteLevel)是必要的。
Python
Rust
Node
名稱 | 描述 | 示例 |
---|---|---|
ByteLevel | 在空格處進行拆分,同時將所有位元組重新對映到一組可見字元。這種技術由 OpenAI 與 GPT-2 一同引入,並具有一些或多或少不錯的特性
| 輸入:"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 = "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 。模板需要提供兩個字串,分別代表單個序列和序列對,以及一組要使用的特殊詞符。 | 例如,當使用以下值指定模板時
輸入: ("I like this", "but not this") 輸出: "[CLS] I like this [SEP] but not this [SEP]" |
解碼器
解碼器知道如何將分詞器使用的 ID 轉換回可讀的文字片段。例如,某些 Normalizer
和 PreTokenizer
使用的特殊字元或識別符號需要被還原。
名稱 | 描述 |
---|---|
ByteLevel | 反轉 ByteLevel 預分詞器。該預分詞器在位元組級別進行編碼,使用一組可見的 Unicode 字元來表示每個位元組,因此我們需要一個解碼器來反轉此過程以獲得可讀的內容。 |
Metaspace | 反轉 Metaspace 預分詞器。該預分詞器使用特殊識別符號 來識別空格,因此該解碼器有助於解碼這些識別符號。 |
WordPiece | 反轉 WordPiece 模型。該模型使用特殊識別符號 ## 來表示連續的子詞,因此該解碼器有助於解碼這些識別符號。 |