在之前的文章 前端大模型入门:编码(Tokenizer)和嵌入(Embedding)解析 - llm的输入中,我简单对比了下tokenizer和splitter的区别,以及其功能,让大家对分词器有了初步的认识。本篇文章中,我将带领大家深入探讨 transformer.js 提供的 tokenizer(分词器)接口。tokenizer 是自然语言处理的核心模块之一,负责将文本转化为模型可以理解的输入形式。transformer.js 提供了多种 tokenizer 接口和类型,满足不同类型模型的需求,例如 BERT、GPT 等。下面我们将从接口方法、类型以及使用示例来全面解析 transformer.js 的 tokenizer 接口。
一言概括分词器:模型处理能力有限、需要将数量巨大的单字进行组合成词、使之可计算
分词器,还可以理解为大模型的编码器、大模型的口腔 - 咀嚼以便处理消化
一、Tokenizer 概述
在 Transformer.js 中,tokenizer 主要用于将文本转化为模型所需的格式。它通过将自然语言转化为 ID 数组,使模型可以处理输入数据。以 Hugging Face 的 AutoTokenizer
为例,我们可以通过如下方式初始化一个 tokenizer:
javascript">import { AutoTokenizer } from '@huggingface/transformers';const tokenizer = await AutoTokenizer.from_pretrained('Xenova/bert-base-uncased');
const { input_ids } = await tokenizer('I love transformers!');
// 结果:Tensor {
// data: BigInt64Array(6) [101n, 1045n, 2293n, 19081n, 999n, 102n],
// dims: [1, 6],
// type: 'int64',
// size: 6,
// }
在这个示例中,AutoTokenizer
可以根据模型名称自动选择适合的 tokenizer,并将输入句子 “I love transformers!” 转化为 token IDs。
二、Tokenizer 的主要接口方法
-
tokenize(text, options)
- 该方法将文本转化为 token 列表。可以选择传入 options,控制是否添加特殊字符或进行截断等。
- 示例:
javascript">const tokens = tokenizer.tokenize('Hello world!'); // 结果:['Hello', 'world', '!']
-
encode(text, options)
encode
方法是将文本转化为 token ID 的核心步骤。它会将文本编码为一个整型数组,每个整数表示一个词汇表中的 token。- 示例:
javascript">const inputIds = tokenizer.encode('I love transformers!'); // 结果:[101, 1045, 2293, 19081, 999, 102]
-
convert_tokens_to_ids(tokens)
- 该方法将分词后的 token 转化为对应的 ID。
- 示例:
javascript">const tokenIds = tokenizer.convert_tokens_to_ids(['Hello', 'world', '!']); // 结果:[7592, 2088, 999]
-
convert_ids_to_tokens(ids)
- 通过传入 ID 列表将其转换为对应的 token。通常用于将模型输出转化为可读文本。
- 示例:
javascript">const tokens = tokenizer.convert_ids_to_tokens([7592, 2088, 999]); // 结果:['Hello', 'world', '!']
-
batch_decode(batch, decode_args)
- 该方法用于将多个序列的 token ID 批量解码为文本字符串。
- 示例:
javascript">const decodedTexts = tokenizer.batch_decode([[101, 1045, 2293, 19081, 999, 102]]); // 结果:['I love transformers!']
-
add_special_tokens(tokens)
- 该方法用于为 token 序列添加特殊字符,例如
[CLS]
或[SEP]
,以适应模型的输入格式。
- 该方法用于为 token 序列添加特殊字符,例如
-
pad(tokens, padding_length)
- 对 token 序列进行填充,使其长度一致。可以指定填充的长度或者使用默认配置。
-
truncation(tokens, max_length)
- 该方法用于对 token 序列进行截断,使其长度不超过指定的最大长度。
-
decode(token_ids, skip_special_tokens)
- 将 token ID 转化为对应的文本字符串,并可以选择是否跳过特殊字符。
-
from_pretrained(pretrained_model_name_or_path, options)
- 加载预训练的 tokenizer,可根据模型名称或路径自动初始化。
三、Tokenizer 的不同类型
根据参考文档,transformer.js 提供了多种 tokenizer 类型,每种类型对应不同的模型和任务。例如:
- BertTokenizer:用于 BERT 模型的分词。
- AlbertTokenizer:用于 ALBERT 模型的分词。
- WhisperTokenizer:专为自动语音识别(ASR)任务设计。
- ByteLevelPreTokenizer:用于 GPT-2 模型的 Byte-Pair Encoding (BPE) 分词。
这些 tokenizer 类型均继承自 PreTrainedTokenizer
类,意味着它们具有相同的基础方法,但根据模型的需要进行了特定实现。例如,BertTokenizer 在处理中文字符时会自动添加空格,方便模型进行 token 边界的识别。
四、示例:使用 PreTrainedTokenizer 进行文本处理
以下是如何使用 PreTrainedTokenizer 初始化并处理输入文本的完整示例:
javascript">import { AutoTokenizer } from '@huggingface/transformers';(async () => {const tokenizer = await AutoTokenizer.from_pretrained('bert-base-uncased');const tokens = tokenizer.tokenize('Welcome to the world of Transformers!');console.log(tokens);// 输出:['Welcome', 'to', 'the', 'world', 'of', 'Transformers', '!']const ids = tokenizer.encode('Welcome to the world of Transformers!');console.log(ids);// 输出:[101, 6160, 2000, 1996, 2088, 1997, 19081, 999, 102]
})();
在这个例子中,AutoTokenizer
自动为我们选择了适合的 tokenizer,并将句子 “Welcome to the world of Transformers!” 转化为 token 和 ID。
五、小结
在 transformer.js 中,tokenizer 扮演着至关重要的角色。通过各种接口方法,tokenizer 可以灵活地将文本处理为模型所需的输入格式,并将输出结果还原为可读文本。本文仅介绍了 tokenizer 的部分核心方法及常用的 tokenizer 类型。此外,transformer.js 还提供了许多其他的接口方法,例如 add_special_tokens
、pad
、truncation
等,可以帮助用户根据具体任务需求灵活调整输入数据的格式。读者在实际应用中,可以根据具体需求选择适合的 tokenizer 类型和接口方法,来完成对文本的分词和处理。
详细的更多的API接口参考 Hugginface Tokenizer