分词器文档
组件
加入 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 模型。该模型使用特殊标识符 ## 来表示连续的子词,因此该解码器有助于解码这些标识符。 |