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

如何定位HuggingFace BertTokenizer中的未知编码词汇?

定位BART中文分词器中的未知Token

要找出导致[UNK]的具体词汇,你可以通过以下两种方法实现:

方法一:直接分词匹配未知Token

调用分词器的tokenize方法得到分词后的token列表,遍历找到[UNK]的位置,对应原文本的字符(适合单字符导致的UNK场景):

paragraph_chinese = '...' # 你的长文本内容
from transformers import BertTokenizer

tokenizer_bart = BertTokenizer.from_pretrained("fnlp/bart-base-chinese")
tokens = tokenizer_bart.tokenize(paragraph_chinese)

# 遍历查找[UNK]
for idx, token in enumerate(tokens):
    if token == '[UNK]':
        print(f"未知Token位置:{idx},对应原文本字符:{paragraph_chinese[idx]}")

方法二:通过偏移映射精准定位(推荐)

使用encode_plus方法获取offset mapping,它会返回每个token在原文本中的起始、结束索引,能精准定位产生UNK的原文本片段:

paragraph_chinese = '...' # 你的长文本内容
from transformers import BertTokenizer

tokenizer_bart = BertTokenizer.from_pretrained("fnlp/bart-base-chinese")
# 编码时返回偏移映射和token列表
encoding = tokenizer_bart.encode_plus(
    paragraph_chinese,
    return_offsets_mapping=True,
    return_tokens=True,
    add_special_tokens=False  # 移除[CLS][SEP]等特殊token,只关注文本本身的token
)

tokens = encoding['tokens']
offset_mapping = encoding['offset_mapping']

# 遍历匹配[UNK]并定位原文本内容
for token, offset in zip(tokens, offset_mapping):
    if token == '[UNK]':
        start, end = offset
        unknown_text = paragraph_chinese[start:end]
        print(f"未知Token对应的原文本内容:{unknown_text},字符位置范围:{start}-{end}")

补充说明

  • 方法二的offset_mapping能准确标记每个token在原文本中的字符索引范围,不管是生僻字、特殊符号还是多字符组合导致的UNK,都能精准定位。
  • 从你的运行结果可知,当前使用的分词器实际是BertTokenizer,上述方法完全适配该类型分词器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:25:02