BART Tokenizer为何对同一单词产生不同分词结果?
问题分析:BART分词器中单词位置不同导致分词结果差异
这不是bug,是BART使用的Byte-level BPE分词器的正常行为,核心原因和词首空格标记以及分词器的预训练词汇表有关:
1. BART分词器的核心类型
BART采用的是Byte-level BPE(字节级字节对编码)分词器,这类分词器会用特殊符号Ġ(U+0120)标记位于词首的空格。也就是说,句子中间的单词前面会隐含这个标记,而句首单词没有。
2. 两种场景的分词逻辑差异
- 当"Thames"在句首时,分词器处理的是无前缀的原始字符串
Thames; - 当"Thames"在句子中间时,它前面有一个空格,所以分词器实际处理的是带前缀标记的
ĠThames。
3. 预训练词汇表的影响
BART的预训练词汇表中,包含完整的ĠThames token,但没有Thames这个无前缀的token。因此:
- 句首的
Thames找不到匹配的完整token,只能被BPE算法拆分成本身存在的子token组合:Th+ames; - 句中的
ĠThames能直接匹配到词汇表中的完整条目,所以作为单个token输出。
验证方法
你可以通过以下代码直接确认词汇表的情况:
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('facebook/bart-large-cnn') print(tokenizer.get_vocab().get("ĠThames")) # 会返回对应的token ID,比如29807 print(tokenizer.get_vocab().get("Thames")) # 返回None,说明词汇表中无此条目
内容的提问来源于stack exchange,提问作者andrea
相关产品推荐
相关产品推荐

