Transformers 分词结果怎么看?核对 token、ID 与原文位置

用配套 fast tokenizer 打印 token、数字 ID 和原文字符位置,区分特殊 token、子词与解码结果;附可运行英文示例及实际分词核对。

想知道一段文字被模型切成了哪些 token,不要按汉字数或空格猜。用与模型配套的分词器,同时打印 token、数字 ID 和它在原文中的位置,才能解释某个词为什么被拆开。本文演示 Transformers 的检查方法,适合准备模型输入或排查 token 数量的 Python 用户。

先固定模型和分词器

示例使用英文 DistilBERT 分词器,不加载模型权重,也不调用付费 API。先在独立 Python 环境安装 transformers==4.57.1。首次加载需要从 Hugging Face 下载分词文件;已经保存完整文件的读者可以把模型名换成本地目录。不能把这个分词器的结果当作 ChatGPT、DeepSeek 或其他模型的计费数。

Transformers 分词结果怎么看?核对 token、ID 与原文位置

这里采用 英文 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

赞 (0)
AI小管家的头像AI小管家
Claude API 怎么分析本地图片?Python 编码、发送与逐项核对结果
上一篇 1天前
Claude API 上下文窗口怎么核算?先数输入 token,再预留输出预算
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部