想知道一段文字被模型切成了哪些 token,不要按汉字数或空格猜。用与模型配套的分词器,同时打印 token、数字 ID 和它在原文中的位置,才能解释某个词为什么被拆开。本文演示 Transformers 的检查方法,适合准备模型输入或排查 token 数量的 Python 用户。
先固定模型和分词器
示例使用英文 DistilBERT 分词器,不加载模型权重,也不调用付费 API。先在独立 Python 环境安装 transformers==4.57.1。首次加载需要从 Hugging Face 下载分词文件;已经保存完整文件的读者可以把模型名换成本地目录。不能把这个分词器的结果当作 ChatGPT、DeepSeek 或其他模型的计费数。

这里采用 英文 DistilBERT 模型卡中的同名检查点。模型卡标注英文任务和 Apache-2.0;正式项目仍需按实际模型核对语言与许可。
打印 token、ID 与原文片段
把下面代码保存为 inspect_tokens.py 后运行。英文句子是人为编写的演示素材,不是训练数据或模型效果测试。
from transformers import AutoTokenizer
checkpoint = "distilbert/distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint, use_fast=True)
if not tokenizer.is_fast:
raise RuntimeError("此检查需要 fast tokenizer 的 offset 映射")
text = "The answer was unbelievably helpful."
encoded = tokenizer(
text,
return_offsets_mapping=True,
return_special_tokens_mask=True,
)
tokens = tokenizer.convert_ids_to_tokens(encoded["input_ids"])
print("token 数:", len(encoded["input_ids"]))
for token, token_id, (start, end), special in zip(
tokens, encoded["input_ids"], encoded["offset_mapping"],
encoded["special_tokens_mask"],
):
print(token, token_id, (start, end), repr(text[start:end]), special)
assert len(tokens) == len(encoded["input_ids"]) == len(encoded["offset_mapping"])
print("解码:", tokenizer.decode(encoded["input_ids"], skip_special_tokens=True))
根据 Tokenizer API,input_ids 是模型词表中的数字编号;convert_ids_to_tokens 显示词表项;fast tokenizer 的 offset_mapping 给出相对原始输入的字符起止位置。Python 切片的终点不包含在片段内,因此 text[start:end] 可以直接核对。
怎样判断输出是否正确
在 Python 3.11、Transformers 4.57.1 的本地检查中,这句文本得到 12 个 token,包括开头的 [CLS] 和结尾的 [SEP]。unbelievably 被拆成 un、##bel、##ie、##va、##bly。读者应以自己的分词文件及运行输出为准;这些数字只说明本句的分词,不代表中文表现或模型准确率。
验证方法是核对每个非特殊 token 的位置落在原文范围内,并查看相邻片段能否解释词的拆分。特殊 token 不是从原文截出来的,在本例中对应 (0, 0) 和空片段;用 special_tokens_mask 标识它们,不把它们当作空文本错误。## 是此 WordPiece 词表的子词标记,不能据此推断所有模型都采用相同规则。
模型为 uncased,解码可能变成小写并改变空格。解码用于查看模型读到的内容,精确回查仍用原文与 offset;不能要求解码字符串逐字符等于输入。
检查自己的文本时保留哪些信息
先把 text 替换为一条获准使用的短样本,记录检查点、分词器文件版本以及是否自动加特殊 token。若只想比较原文切分数量,可以另跑 tokenizer(text, add_special_tokens=False),但不要直接把该结果代入需要特殊 token 的模型。
如果模型没有 fast tokenizer,return_offsets_mapping=True 可能不受支持;应换成该模型提供的 fast 版本或只核对 ID 和解码,不能编造位置。遇到词表未知符号 [UNK]、语言不匹配或不合理的切分时,先核对实际模型使用的 tokenizer。普通词根中的“分词”也可能指中文词语切分;本教程检查的是模型子词输入,两种任务的输出不能混用。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30433.html