You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Huggingface DistilBertTokenizer输出的token映射到原文本对应位置

Huggingface Tokenizer token到原文本位置映射方案

方案1:直接使用Tokenizer内置接口(推荐)

DistilBertTokenizer 本身已经内置了偏移量映射的输出能力,无需自行实现对齐逻辑,天然支持[UNK]等特殊令牌的位置匹配:

from transformers import DistilBertTokenizer

tokenizer = DistilBertTokenizer.from_pretrained("distilbert-base-uncased")
text = "I have a new GPU"

# 调用时添加return_offsets_mapping=True参数
encode_output = tokenizer(text, return_offsets_mapping=True)
offset_mapping = encode_output["offset_mapping"]

print(offset_mapping)
# 输出对应为:[(0, 0), (0, 1), (2, 6), (7, 8), (9, 12), (13, 15), (15, 16), (0, 0)]
# 其中首尾的(0,0)对应[CLS]、[SEP]特殊令牌,直接过滤即可
# 剩余元素就是你需要的每个分词token对应原文本的[起始下标, 结束下标)左闭右开区间
  • 针对[UNK]场景:如果输入文本包含词表外的生僻词,tokenizer生成[UNK]时,返回的偏移量会自动对应这个生僻词在原文本的完整起止区间,无需额外处理。
  • 大小写适配:如果需要保留原文本大小写匹配,可加载distilbert-base-cased版本的分词器即可。

方案2:自定义实现对齐逻辑(特殊场景需要时参考)

如果有自定义分词规则的需求,可以按照以下思路实现:

  1. 先预处理原文本,记录每个字符的原始位置索引
  2. 对分词结果做预处理:去掉子词前缀##,得到每个token的纯文本内容
  3. 用双指针分别遍历原文本和拼接后的分词文本,逐字符对齐,同时记录每个token对应的起始、结束偏移量
  4. 遇到[UNK]令牌时,找到前后已对齐的token的位置区间,中间未匹配的文本段就是[UNK]对应的原文本区间

可视化适配建议

你要做注意力值可视化的话,直接过滤掉offset_mapping中值为(0,0)的特殊令牌项,用剩余的区间给原文本对应位置标注注意力权重即可,非技术用户也能直接看懂。


内容的提问来源于stack exchange,提问作者Hardian Lawi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:05