为何Tokenizer与TokenizerFast对同一句子编码结果不同?
问题原因分析
核心差异来自于do_basic_tokenize参数对Tokenizer处理流程的本质影响:
当
do_basic_tokenize=True时,Tokenizer会先执行基础分词步骤:- 自动拆分文本中的特殊符号(比如测试文本里的
--)、连字符(比如Ritz-Carlton中的-),将它们与单词拆分成独立的原子单元; - 完成空格、大小写标准化等前置处理;
- 再把这些拆分好的单元传给子词分词器(如BPE、WordPiece)处理。
由于基础分词的规则固定无歧义,多次编码同一文本的结果会完全一致。
- 自动拆分文本中的特殊符号(比如测试文本里的
当
do_basic_tokenize=False时,Tokenizer会跳过基础拆分步骤,直接把整段连续文本传给子词分词器:- 子词分词器会从文本开头尝试匹配词汇表中的最长可能子词,对于带特殊符号的字符串(如
Ritz-Carlton、--),如果完整字符串不在词汇表内,拆分逻辑会完全依赖词汇表覆盖范围,最终得到和开启基础分词时完全不同的子词组合; - 比如测试文本中的
Ritz-Carlton,开启基础分词时会被拆成Ritz、-、Carlton三个单元再分别处理;关闭基础分词时,子词分词器会把它当成一个整体,可能拆成Ritz、-Carl、ton这类差异极大的子词,直接导致编码结果不一致。
- 子词分词器会从文本开头尝试匹配词汇表中的最长可能子词,对于带特殊符号的字符串(如
简单来说,基础分词是给子词分词器做“预处理兜底”,确保特殊符号、复合词被拆成无歧义单元;跳过这一步会让子词分词器直接处理原始字符串,结果自然会出现差异。
内容的提问来源于stack exchange,提问作者feng shen
相关产品推荐
相关产品推荐

