BERT Vocabulary : 为什么每个单词前面都有''?

BERT Vocabulary : Why every word has '▁' before?

我的问题与 camemBERT 模型(BERT 的法语版本)及其 Tokenizer 有关:

为什么词汇表的每个单词前面都有一个“”字? 例如,它不是“sirop”而是“sirop”(sirop => 糖浆)。

from transformers import CamembertTokenizer
tokenizer = Camembert.Tokenizer.from_pretrained("camembert-base")
voc = tokenizer.get_vocab() #Vocabulary of the model

print("sirop" in voc) # Will display False
print("▁sirop" in voc) # Will display True

感谢您的回答:)

如果我理解正确,CamembertTokenizer 使用 SentencePiece 中的这个特殊字符,请参阅 source code

另一方面,SentencePiece 使用 Subword Tokens(将单词拆分为更小的标记),但在内部始终跟踪单词(有空格的地方)之间的“真实”拆分以及什么是 Subword拆分,他们在每个“真实”标记开始之前使用此字符,follow-up 子词标记(但不是标点符号)没有此标记,请参阅 Explaination in the Github Repository。基本上,空格始终是标记化的一部分,但为了避免出现问题,它在内部转义为“”。

他们使用这个例子:"Hello World." 变成 [Hello] [▁Wor] [ld] [.],然后模型可以使用它,然后再转换回原来的字符串 (detokenized = ''.join(pieces).replace('▁', ' ')) --> "Hello World." 没有歧义,无需单独保存原始字符串。