分词器文档

组件

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 规范化
小写 将所有大写替换为小写 输入: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()])

预分词器

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", "?"
空格 在单词边界处分割(使用以下正则表达式:\w+|[^\w\s]+ 输入:"Hello there!"
输出:"Hello", "there", "!"
WhitespaceSplit 在任何空格字符处分割 输入:"Hello there!"
输出:"Hello", "there!"
标点符号 将所有标点符号隔离开来 输入:"Hello?"
输出:"Hello", "?"
元空间 在空格处分割并将它们替换为特殊字符“ ”(U+2581) 输入:"Hello there"
输出:"Hello", " there"
CharDelimiterSplit 在给定字符处分割 使用x的示例
输入:"Helloxthere"
输出:"Hello", "there"
数字 将数字与任何其他字符分开。 输入:"Hello123there"
输出:"Hello", "123", "there"
分割 用途广泛的预分词器,它根据提供的模式和行为进行分割。如果需要,可以反转模式。
  • pattern 应该是一个自定义字符串或正则表达式。
  • behavior 应该是以下之一
    • 移除
    • 隔离
    • 与前合并
    • 与后合并
    • 连续
  • invert 应该是一个布尔标志。
使用 pattern = ,behavior = "isolated",invert = False 的示例
输入:"Hello, how are you?"
输出:"Hello,", " ", "how", " ", "are", " ", "you?"
序列 允许您组合多个PreTokenizer,这些PreTokenizer将按给定顺序运行 Sequence([Punctuation(), WhitespaceSplit()])

模型

模型是用于实际分词的核心算法,因此,它们是分词器中唯一必不可少的组件。

名称 描述
WordLevel 这是“经典”的分词算法。它允许你简单地将单词映射到ID,无需任何花哨的操作。这样做的好处是使用和理解起来非常简单,但它需要非常大的词汇表才能获得良好的覆盖率。使用此Model需要使用PreTokenizer。此模型不会直接做出任何选择,它只是将输入标记映射到ID。
BPE 最流行的子词分词算法之一。字节对编码(Byte-Pair-Encoding)的工作原理是从字符开始,合并最常一起出现的字符,从而创建新的标记。然后,它迭代地从语料库中看到的最高频对构建新的标记。BPE能够通过使用多个子词标记来构建它从未见过的单词,因此需要较小的词汇表,并且不太可能出现“unk”(未知)标记。
WordPiece 这是一种与BPE非常相似的子词分词算法,主要由谷歌在BERT等模型中使用。它使用贪婪算法,首先尝试构建长单词,当整个单词不存在于词汇表中时,将其拆分为多个标记。这与BPE不同,BPE是从字符开始,构建尽可能大的标记。它使用著名的##前缀来识别属于单词一部分的标记(即不是单词开头)。
Unigram Unigram也是一种子词分词算法,它通过尝试识别最佳的子词标记集来最大化给定句子的概率。这与BPE的不同之处在于,它不是基于顺序应用的一组规则来确定性的。相反,Unigram能够计算多种分词方式,并选择最可能的一种。

后处理

在整个流程之后,我们有时希望在将分词后的字符串馈送到模型(例如“[CLS] My horse is amazing [SEP]”)之前插入一些特殊标记。PostProcessor 就是执行此操作的组件。

名称 描述 示例
TemplateProcessing 允许你轻松地模板化后处理,添加特殊标记,并为每个序列/特殊标记指定type_id。模板被提供两个字符串,分别表示单个序列和序列对,以及一组要使用的特殊标记。 例如,当使用以下值指定模板时
  • single: "[CLS] $A [SEP]"
  • pair: "[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 PreTokenizer。此PreTokenizer使用一组可见的Unicode字符以字节级进行编码,以表示每个字节,因此我们需要一个解码器来还原此过程并再次获得可读的内容。
元空间 还原Metaspace PreTokenizer。此PreTokenizer使用特殊标识符 来识别空格,因此此解码器有助于解码这些空格。
WordPiece 还原WordPiece模型。此模型使用特殊标识符##来表示继续的子词,因此此解码器有助于解码这些子词。