为什么 huggingface t5 tokenizer 会忽略一些空格?

why does huggingface t5 tokenizer ignore some of the whitespaces?

我正在将 T5 模型和分词器用于下游任务。我想将某些 whitesapces 添加到分词器中,例如行结尾 (\t) 和制表符 (\t)。添加这些标记是有效的,但不知何故标记器总是忽略第二个空格。因此,它将序列 “\n\n” 标记为单行结尾,序列 "\n\n\n\n" 标记为两行结尾,依此类推。请参阅下文进行重现。

from transformers import T5Tokenizer
tokenizer = T5Tokenizer.from_pretrained("t5-large")
tokenizer.add_tokens(["\n"])

tokenizer.encode("\n") # returns [32100, 1] as expected
tokenizer.encode("\n\n") # returns [32100, 1] but expected would be [32100, 32100, 1]
tokenizer.encode("\n\n\n\n") # returns [32100, 32100, 1] but expected would be [32100, 32100, 32100, 32100, 1]

这种行为背后的原因是什么?它是错误还是与分词器的工作方式有关?我注意到这只发生在添加的空格上,但不会发生在其他字符上。

有没有办法防止分词器忽略重复的空格?

此行为由 T5Tokenizer 中的 tokenize 方法在默认情况下如何剥离标记来解释。可以做的是将标记“\n”作为特殊标记添加到分词器中。因为特殊标记永远不会分开,所以它按预期工作。

它有点老套,但似乎有效。

from tokenizers import AddedToken
tokenizer.add_special_tokens({"additional_special_tokens": [AddedToken("\n")]})
print(tokenizer.special_tokens_map)

然后它标记化 '\n' 而不跳过任何出现。请注意,AddedToken 很重要,因为以下内容以某种方式 NOT 起作用。

tokenizer.add_special_tokens({"additional_special_tokens": ["\n"]})