Transformer.js(五) — Tokenizer 分词器接口解析 - 数据输入的咀嚼器

ops/2024/11/27 20:58:28/

在之前的文章 前端大模型入门:编码(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 的主要接口方法

  1. tokenize(text, options)

    • 该方法将文本转化为 token 列表。可以选择传入 options,控制是否添加特殊字符或进行截断等。
    • 示例:
    javascript">const tokens = tokenizer.tokenize('Hello world!');
    // 结果:['Hello', 'world', '!']
    
  2. encode(text, options)

    • encode 方法是将文本转化为 token ID 的核心步骤。它会将文本编码为一个整型数组,每个整数表示一个词汇表中的 token。
    • 示例:
    javascript">const inputIds = tokenizer.encode('I love transformers!');
    // 结果:[101, 1045, 2293, 19081, 999, 102]
    
  3. convert_tokens_to_ids(tokens)

    • 该方法将分词后的 token 转化为对应的 ID。
    • 示例:
    javascript">const tokenIds = tokenizer.convert_tokens_to_ids(['Hello', 'world', '!']);
    // 结果:[7592, 2088, 999]
    
  4. convert_ids_to_tokens(ids)

    • 通过传入 ID 列表将其转换为对应的 token。通常用于将模型输出转化为可读文本。
    • 示例:
    javascript">const tokens = tokenizer.convert_ids_to_tokens([7592, 2088, 999]);
    // 结果:['Hello', 'world', '!']
    
  5. batch_decode(batch, decode_args)

    • 该方法用于将多个序列的 token ID 批量解码为文本字符串。
    • 示例:
    javascript">const decodedTexts = tokenizer.batch_decode([[101, 1045, 2293, 19081, 999, 102]]);
    // 结果:['I love transformers!']
    
  6. add_special_tokens(tokens)

    • 该方法用于为 token 序列添加特殊字符,例如 [CLS][SEP],以适应模型的输入格式。
  7. pad(tokens, padding_length)

    • 对 token 序列进行填充,使其长度一致。可以指定填充的长度或者使用默认配置。
  8. truncation(tokens, max_length)

    • 该方法用于对 token 序列进行截断,使其长度不超过指定的最大长度。
  9. decode(token_ids, skip_special_tokens)

    • 将 token ID 转化为对应的文本字符串,并可以选择是否跳过特殊字符。
  10. 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_tokenspadtruncation 等,可以帮助用户根据具体任务需求灵活调整输入数据的格式。读者在实际应用中,可以根据具体需求选择适合的 tokenizer 类型和接口方法,来完成对文本的分词和处理。

详细的更多的API接口参考 Hugginface Tokenizer


http://www.ppmy.cn/ops/137169.html

相关文章

macOS上进行Ant Design Pro实战教程(一)

由于一个AI项目的前端使用了umi,本教程根据阿里官网上的 《Ant Design 实战教程(beta 版)》来实操一下,我使用macOS操作系统,VS Code 开发环境。 一、开发环境 1、安装nodejs, npm, yarn 官网上建议使用cnpm&#xf…

Spring Boot项目中,实体类是否需要实现Serializable接口

在Spring Boot项目中,实体类是否需要实现Serializable接口并不是一个硬性规定,而是取决于具体的应用场景和需求。以下是对这一问题的更详细分析: 1. 序列化的基本概念 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则…

Vue学习记录11

模板引用 虽然Vue的声明性渲染模型抽象了大部分对DOM的直接操作&#xff0c;但在某些情况下&#xff0c;仍然需要直接访问底层DOM元素。要实现这一点&#xff0c;可以使用特殊的 ref attribute: <input ref"input"> ref是一个特殊的attribute,和 v-for中提到…

使用猴子补丁对pytorch的分布式接口进行插桩

训练脚本&#xff1a; from torchvision.datasets import MNIST from torchvision.transforms import ToTensor from torch import nn import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP from torch.utils.data.d…

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程

这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介&#xff08;背景&#xff09;基础测试&#xff08;方法说明/操作说明&#xff09;开发环境搭建&#xff08;方法说明/操作说明代码结果&#xff09;Arduino IDE RL…

Java使用replaceAll替换时不使用正则表达式

前言 public String replaceAll(String regex, String replacement) {return Pattern.compile(regex).matcher(this).replaceAll(replacement);}在使用String.replaceAll() 方法时&#xff0c;由于入参时regex &#xff0c;而入参刚好是正则表达式的字符该怎么办&#xff1f;我…

等保测评讲解:安全管理中心

在数字化转型的背景下&#xff0c;网络安全的重要性愈发凸显&#xff0c;而作为中国边疆大省的黑龙江&#xff0c;其网络安全建设更是不可忽视。等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是确保信息系统安全的关键环节。本文将详细讲解黑龙江等保测评中的安全管…

力扣第 66 题 “加一”

题目描述 给定一个由 非负整数组成的非空数组&#xff0c;表示一个整数。在该整数的基础上加一。 最高位数字在数组的首位&#xff0c;数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1: 输入: digits [1,2,3] 输出:…