Tokenizers 文档

组件

Hugging Face's logo
加入 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 的实现。可以设置的选项包括:
  • clean_text
  • handle_chinese_chars
  • strip_accents
  • lowercase
序列 组合多个规范化器,这些规范化器将按提供的顺序运行 Sequence([NFKC(), Lowercase()])

预分词器

预分词器 负责根据一组规则拆分输入。这种预处理使您可以确保底层 模型 不会在多个“拆分”中构建 tokens。例如,如果您不希望 tokens 内有空格,则可以使用 预分词器 在这些空格上进行拆分。

您可以使用 序列 轻松地将多个 预分词器 组合在一起(请参见下文)。预分词器 也被允许修改字符串,就像 规范化器 所做的那样。这对于允许一些复杂的算法是必要的,这些算法需要在规范化之前进行拆分(例如 ByteLevel)。

Python
Rust
Node
名称 描述 示例
ByteLevel 在空格上拆分,同时将所有字节重新映射到一组可见字符。这项技术由 OpenAI 随 GPT-2 引入,具有一些或多或少不错的特性。
  • 由于它映射到字节,因此使用此方法的 tokenizer 只需要 256 个字符作为初始字母表(一个字节可以拥有的值数),而不是 130,000 多个 Unicode 字符。
  • 前一点的一个结果是,使用此方法绝对没有必要拥有未知 token,因为我们可以用 256 个 tokens 表示任何内容 (Youhou!! 🎉🎉)
  • 对于非 ascii 字符,它变得完全不可读,但它仍然有效!
输入: "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"
拆分 通用的预分词器,可根据提供的模式和行为进行拆分。如有必要,可以反转模式。
  • 模式应该是自定义字符串或正则表达式。
  • 行为应为以下之一
    • removed
    • isolated
    • merged_with_previous
    • merged_with_next
    • contiguous
  • invert 应为布尔标志。
示例 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。 示例,当使用这些值指定模板时
  • single: "[CLS] $A [SEP]"
  • pair: "[CLS] $A [SEP] $B [SEP]"
  • special tokens
    • "[CLS]"
    • "[SEP]"

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

解码器

解码器知道如何从 Tokenizer 使用的 ID 返回到可读的文本片段。例如,某些 规范化器预分词器 使用需要还原的特殊字符或标识符。

名称 描述
ByteLevel 还原 ByteLevel 预分词器。此预分词器在字节级别进行编码,使用一组可见的 Unicode 字符来表示每个字节,因此我们需要一个解码器来还原此过程并再次获得可读的内容。
Metaspace 还原 Metaspace 预分词器。此预分词器使用特殊标识符 来标识空格,因此此解码器有助于解码这些空格。
WordPiece 还原 WordPiece 模型。此模型使用特殊标识符 ## 来表示继续的子词,因此此解码器有助于解码这些子词。
< > 在 GitHub 上更新