Tokenizers 文档
组件
加入 Hugging Face 社区
并获得增强的文档体验
开始
组件
当构建 Tokenizer 时,您可以将各种类型的组件附加到此 Tokenizer,以自定义其行为。此页面列出了大多数提供的组件。
规范化器
规范化器
负责预处理输入字符串,以便根据给定的用例对其进行规范化。规范化的一些常见示例包括 Unicode 规范化算法(NFD、NFKD、NFC 和 NFKC)、小写等... tokenizers
的特殊性在于我们在规范化时跟踪对齐。这对于允许从生成的 tokens 映射回输入文本至关重要。
规范化器
是可选的。
Python
Rust
Node
名称 | 描述 | 示例 |
---|---|---|
NFD | NFD unicode 规范化 | |
NFKD | NFKD unicode 规范化 | |
NFC | NFC unicode 规范化 | |
NFKC | NFKC unicode 规范化 | |
小写 | 将所有大写字母替换为小写字母 | 输入: HELLO ὈΔΥΣΣΕΎΣ 输出: hello ὀδυσσεύς` |
去除空格 | 删除输入指定侧面(左侧、右侧或两侧)的所有空格字符 | 输入: " hi" 输出: "hi" |
去除重音符号 | 删除 unicode 中的所有重音符号(为保持一致性,应与 NFD 一起使用) | 输入: é 输出: e |
替换 | 替换自定义字符串或正则表达式,并使用给定的内容进行更改 | Replace("a", "e") 将表现如下输入: "banana" 输出: "benene" |
BertNormalizer | 提供了原始 BERT 中使用的 Normalizer 的实现。可以设置的选项包括:
| |
序列 | 组合多个规范化器,这些规范化器将按提供的顺序运行 | Sequence([NFKC(), Lowercase()]) |
预分词器
预分词器
负责根据一组规则拆分输入。这种预处理使您可以确保底层 模型
不会在多个“拆分”中构建 tokens。例如,如果您不希望 tokens 内有空格,则可以使用 预分词器
在这些空格上进行拆分。
您可以使用 序列
轻松地将多个 预分词器
组合在一起(请参见下文)。预分词器
也被允许修改字符串,就像 规范化器
所做的那样。这对于允许一些复杂的算法是必要的,这些算法需要在规范化之前进行拆分(例如 ByteLevel)。
Python
Rust
Node
名称 | 描述 | 示例 |
---|---|---|
ByteLevel | 在空格上拆分,同时将所有字节重新映射到一组可见字符。这项技术由 OpenAI 随 GPT-2 引入,具有一些或多或少不错的特性。
| 输入: "Hello my friend, how are you?" 输出: "Hello", "Ġmy", Ġfriend", ",", "Ġhow", "Ġare", "Ġyou", "?" |
空格 | 在单词边界上拆分(使用以下正则表达式:\w+|[^\w\s]+ ) | 输入: "Hello there!" 输出: "Hello", "there", "!" |
空格拆分 | 在任何空格字符上拆分 | 输入: "Hello there!" 输出: "Hello", "there!" |
标点符号 | 将隔离所有标点符号字符 | 输入: "Hello?" 输出: "Hello", "?" |
Metaspace | 在空格上拆分,并将它们替换为特殊字符“ ” (U+2581) | 输入: "Hello there" 输出: "Hello", " there" |
字符分隔符拆分 | 在给定的字符上拆分 | 示例 with x 输入: "Helloxthere" 输出: "Hello", "there" |
数字 | 将数字与其他字符分开。 | 输入: "Hello123there" 输出: "Hello", "123", "there" |
拆分 | 通用的预分词器,可根据提供的模式和行为进行拆分。如有必要,可以反转模式。
| 示例 with pattern = , behavior = "isolated" , invert = False 输入: "Hello, how are you?" 输出: "Hello,", " ", "how", " ", "are", " ", "you?" |
序列 | 允许您组合多个 预分词器 ,这些预分词器将按给定的顺序运行 | Sequence([Punctuation(), WhitespaceSplit()]) |
模型
模型是用于实际进行分词的核心算法,因此,它们是 Tokenizer 的唯一强制性组件。
名称 | 描述 |
---|---|
WordLevel | 这是“经典”的分词算法。它让您可以简单地将单词映射到 ID,而无需任何花哨的东西。这具有使用和理解非常简单的优点,但是它需要非常大的词汇表才能获得良好的覆盖率。使用此 模型 需要使用 预分词器 。此模型不会直接做出任何选择,它只是将输入 tokens 映射到 ID。 |
BPE | 最流行的子词分词算法之一。字节对编码的工作原理是从字符开始,同时合并那些最常一起出现的字符,从而创建新的 tokens。然后,它迭代地工作,从语料库中最常见的对中构建新的 tokens。BPE 能够通过使用多个子词 tokens 构建从未见过的单词,因此需要较小的词汇表,并且减少了出现“unk”(未知)tokens 的机会。 |
WordPiece | 这是一种子词分词算法,与 BPE 非常相似,主要由 Google 在 BERT 等模型中使用。它使用贪婪算法,该算法尝试首先构建长单词,当词汇表中不存在整个单词时,将其拆分为多个 tokens。这与 BPE 从字符开始,尽可能构建更大的 tokens 不同。它使用著名的 ## 前缀来标识属于单词一部分的 tokens(即不以单词开头)。 |
Unigram | Unigram 也是一种子词分词算法,它的工作原理是尝试识别最佳的子词 tokens 集,以最大化给定句子的概率。这与 BPE 不同,因为 BPE 不是基于按顺序应用的一组规则来确定性的。相反,Unigram 将能够计算多种分词方式,同时选择最有可能的一种。 |
后处理器
在整个流程之后,我们有时希望在将分词后的字符串输入到模型(如“[CLS] My horse is amazing [SEP]”)之前插入一些特殊 tokens。后处理器
就是执行此操作的组件。
名称 | 描述 | 示例 |
---|---|---|
模板处理 | 让您轻松地模板化后处理,添加特殊 tokens,并为每个序列/特殊 token 指定 type_id 。模板提供两个字符串,分别代表单个序列和序列对,以及一组要使用的特殊 tokens。 | 示例,当使用这些值指定模板时
输入: ("I like this", "but not this") 输出: "[CLS] I like this [SEP] but not this [SEP]" |
解码器
解码器知道如何从 Tokenizer 使用的 ID 返回到可读的文本片段。例如,某些 规范化器
和 预分词器
使用需要还原的特殊字符或标识符。
名称 | 描述 |
---|---|
ByteLevel | 还原 ByteLevel 预分词器。此预分词器在字节级别进行编码,使用一组可见的 Unicode 字符来表示每个字节,因此我们需要一个解码器来还原此过程并再次获得可读的内容。 |
Metaspace | 还原 Metaspace 预分词器。此预分词器使用特殊标识符 来标识空格,因此此解码器有助于解码这些空格。 |
WordPiece | 还原 WordPiece 模型。此模型使用特殊标识符 ## 来表示继续的子词,因此此解码器有助于解码这些子词。 |