在自然语言处理中,tokenizer
是一个非常关键的组件,它将文本转化为模型可以理解的格式。这个过程通常包括以下几个步骤:
1. 文本标准化
- 小写化:将所有文本转换为小写,以减少不同形式的单词(如 "Apple" 和 "apple")被视为不同词的情况。
- 去除标点符号:删除或替换标点符号,不过在某些场景下,保留标点符号可能是有必要的,因为它们包含情感或语法信息。
- 去除特殊字符:移除不必要的字符,比如 HTML 标签或其他非语言符号。
2. 分词(Tokenization)
- 按空格分词:最简单的方式是按空格分词,将每个单词视为一个 token。但这无法处理复杂情况,如多词短语或连接符。
- 子词分词(Subword Tokenization):例如在 BERT 和 RoBERTa 中使用的 Byte-Pair Encoding (BPE) 或 WordPiece。这些算法会将罕见词拆分为更小的子词,从而减少词汇量,并提高模型处理新词或罕见词的能力。
- 字符级分词:将每个字符视为一个 token,适用于处理拼写错误频繁或词汇量特别大的情况。
3. 词汇表映射
- 词汇表构建:
tokenizer
会使用一个预定义的词汇表(vocabulary)或在训练过程中构建的词汇表。词汇表中每个 token 都对应一个唯一的 ID。 - 未知词处理:对于词汇表中没有的词,通常会用一个特殊的
<UNK>
token 或者将其拆分为已知的子词来表示。
4. 附加特殊标记
- 起始标记和结束标记:例如
<CLS>
用于句子开头,<SEP>
用于句子分隔。BERT 和 RoBERTa 等模型会在输入句子时添加这些标记。 - 填充(Padding):为了使输入批次中的所有序列具有相同长度,短于最大长度的序列会被填充,通常使用
<PAD>
token。
5. 编码(Encoding)
- Token ID 转换:将每个 token 转换为词汇表中的对应 ID。
- 生成注意力掩码(Attention Mask):对于填充的部分生成一个掩码,用于告知模型忽略这些部分。
- 位置编码(Positional Encoding):有些模型需要为每个 token 提供位置编码,以保持序列信息(尽管这个步骤通常由模型内部处理)。
6. 返回编码后的输出
- 最终,
tokenizer
会输出一个包含 token ID 的序列,注意力掩码,以及可能的其他辅助信息,如 token 类型 ID(用于区分句子 A 和句子 B)。
示例:Hugging Face 的 transformers
库中的 tokenizer
from transformers import RobertaTokenizer
# 加载预训练的 RoBERTa tokenizer
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
# 输入文本
text = "Hello, how are you?"
# 执行tokenizer,包含分词、词汇表映射、添加特殊标记等步骤
tokens = tokenizer(text, padding=True, truncation=True, return_tensors="pt")
# 打印输出
print(tokens)
在这个示例中,tokenizer
将文本 "Hello, how are you?" 转换为 RoBERTa 模型可以接受的格式,包括 token ID、注意力掩码等。
总结
tokenizer
是将自然语言文本转化为模型输入的关键组件。它包含文本标准化、分词、词汇表映射、添加特殊标记、编码等多个步骤,使得模型能够理解和处理输入文本。