如何将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:自定义实现对齐逻辑(特殊场景需要时参考)
如果有自定义分词规则的需求,可以按照以下思路实现:
- 先预处理原文本,记录每个字符的原始位置索引
- 对分词结果做预处理:去掉子词前缀
##,得到每个token的纯文本内容 - 用双指针分别遍历原文本和拼接后的分词文本,逐字符对齐,同时记录每个token对应的起始、结束偏移量
- 遇到
[UNK]令牌时,找到前后已对齐的token的位置区间,中间未匹配的文本段就是[UNK]对应的原文本区间
可视化适配建议
你要做注意力值可视化的话,直接过滤掉offset_mapping中值为(0,0)的特殊令牌项,用剩余的区间给原文本对应位置标注注意力权重即可,非技术用户也能直接看懂。
内容的提问来源于stack exchange,提问作者Hardian Lawi
相关产品推荐
相关产品推荐

