NLP 中的 token 是什么?对照字符、词和子词理解长度与截断

NLP 里的 token 是分词器交给模型的离散单位,既不必等于一个汉字,也不必等于一个空格隔开的词。先用一份极小的教学语料训练 WordPiece 分词器,再比较字符数、空格词数和实际 token 数,最后演示截断会丢掉什么。

NLP 里的 token 是分词器交给模型的离散单位,既不必等于一个汉字,也不必等于一个空格隔开的词。先用一份极小的教学语料训练 WordPiece 分词器,再比较字符数、空格词数和实际 token 数,最后演示截断会丢掉什么。

准备与运行

本文只使用人工构造的教学材料,没有把示例结果当作真实项目效果。以下代码在 Windows 的 Python 3.11 独立环境执行通过。先在空目录运行安装命令,再将完整代码保存为 demo.py,执行 python demo.py。

NLP 中的 token 是什么?对照字符、词和子词理解长度与截断

python -m pip install tokenizers==0.22.1

三种长度口径不能混用

“人工智能 NLP”有 7 个非空白字符,但按空格只会得到两个字段;真实 token 个数要由选定模型的分词器计算。不同模型的词表、规范化、特殊符号都可能改变结果,因此不能用“每个汉字一个 token”的经验值直接规划输入上限。

演示从四条教学文本训练一个 WordPiece 词表。它不是任何线上大模型的词表,只用来展示同一段文本如何被拆成带有 ID 的单位。做项目时必须替换为目标模型配套的分词器,并记录词表版本。

先看完整序列,再决定是否截断

代码先对完整输入编码,再把编码器上限设为 6。通过比较两组 token 和 ID,可以看到尾部内容是否被舍弃。真实模型可能还加入起止符、角色标记和输出预留,因此只统计用户文本的 token 数不足以保证请求一定不过长。

截断前应确定哪些材料可以舍弃:产品规则和待回答问题常比冗长背景更关键。若资料不能丢,可以按语义边界分段、分别保留来源编号,再逐段核对答案;不要静默截断后仍要求模型回答被截掉的事实。

完整代码

from tokenizers import Tokenizer, models, pre_tokenizers, trainers

corpus = ["人工智能 NLP 处理文本", "人工智能 可以处理中文", "NLP 需要词表", "处理文本需要核对长度"]
tokenizer = Tokenizer(models.WordPiece(unk_token="[UNK]"))
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.WordPieceTrainer(vocab_size=25, special_tokens=["[UNK]"])
tokenizer.train_from_iterator(corpus, trainer=trainer)
sample = "人工智能 NLP 处理文本 需要词表 人工智能 NLP 处理文本"
full = tokenizer.encode(sample)
print("non_space_chars", len(sample.replace(" ", "")))
print("space_fields", len(sample.split()))
print("full_tokens", full.tokens)
print("full_ids", full.ids)
tokenizer.enable_truncation(max_length=6)
short = tokenizer.encode(sample)
print("truncated_tokens", short.tokens)
print("truncated_ids", short.ids)
print("removed_count", len(full.ids)-len(short.ids))
assert len(short.ids) == min(6, len(full.ids))
assert len(full.ids) > len(short.ids)

运行结果与核对

下面是上述脚本在本地执行得到的输出;正式数据请按相同检查点复核。

non_space_chars 26
space_fields 7
full_tokens ['人', '##工', '##智', '##能', 'N', '##L', '##P', '处', '##理', '##文', '##本', '需', '##要', '##词', '##表', '人', '##工', '##智', '##能', 'N', '##L', '##P', '处', '##理', '##文', '##本']
full_ids [5, 23, 24, 25, 2, 38, 39, 8, 28, 30, 31, 22, 33, 40, 41, 5, 23, 24, 25, 2, 38, 39, 8, 28, 30, 31]
truncated_tokens ['人', '##工', '##智', '##能', 'N', '##L']
truncated_ids [5, 23, 24, 25, 2, 38]
removed_count 20

运行后先看 full_tokens 与 full_ids 是否逐项对应,再看 truncated_tokens 是否只保留前六个单位,removed_count 是否大于零。若换成目标模型,应以该模型分词器重新测量,并同时核对它的特殊 token 与可用上下文设置。

适用边界

这套词表由四条人为文本临时训练,切分结果不代表 ChatGPT、DeepSeek 或任意预训练模型,也不说明实际费用。上限 6 仅为让截断可见而设;代码未发送模型请求。

常见问题

空格词数能用于中文 token 预算吗?

不能。中文句子通常没有天然空格分词边界;即使有空格,子词分词器仍可能把一个字段拆成多个 token。用目标模型的分词器实测。

参考资料

以下官方资料已于 2026 年 10 月 1 日核对,分别用于确认文中接口或方法定义。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31715.html

赞 (0)
AI小管家的头像AI小管家
表格分析智能体先看什么?生成字段概况、空值率和唯一值检查表
上一篇 2小时前
客服文本分类该用传统 NLP 还是大模型?用固定标签和复核成本做选择
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

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

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