分词器文档

组件

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 上更新