组件
在构建分词器时,您可以将各种类型的组件附加到此分词器以自定义其行为。此页面列出了大多数提供的组件。
规范化器
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 的实现。可以设置的选项包括
|
|
序列 | 组合多个规范化器,这些规范化器将按提供的顺序运行 | 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", "?" |
空格 | 在单词边界处分割(使用以下正则表达式:\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 = "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 。模板被提供两个字符串,分别表示单个序列和序列对,以及一组要使用的特殊标记。 |
例如,当使用以下值指定模板时
输入: ("I like this", "but not this") 输出: "[CLS] I like this [SEP] but not this [SEP]" |
解码器
解码器知道如何从分词器使用的ID转换回可读的文本片段。例如,某些Normalizer
和PreTokenizer
使用需要还原的特殊字符或标识符。
名称 | 描述 |
---|---|
ByteLevel | 还原ByteLevel PreTokenizer。此PreTokenizer使用一组可见的Unicode字符以字节级进行编码,以表示每个字节,因此我们需要一个解码器来还原此过程并再次获得可读的内容。 |
元空间 | 还原Metaspace PreTokenizer。此PreTokenizer使用特殊标识符 来识别空格,因此此解码器有助于解码这些空格。 |
WordPiece | 还原WordPiece模型。此模型使用特殊标识符## 来表示继续的子词,因此此解码器有助于解码这些子词。 |