最近在学习Google的SentencePiece时遇到了一些问题。
我自己的理解:
几天前我也有同样的问题,所以我做了一些研究,这是我的答案(可能100%正确,也可能不是100%正确,但可能会有所帮助):
from tokenizers import SentencePieceBPETokenizer
tokenizer = SentencePieceBPETokenizer()
tokenizer.pre_tokenizer.pre_tokenize_str("こんにちは世界")
>>> [('▁こんにちは世界', (0, 7))]
由于这句话中没有分隔符(顺便说一句,它是“Hello World”),因此它不会对其进行预标记,而只是将整个句子视为单个标记,并可能将这个标记发送到 BPE 算法。
tokenizer.pre_tokenizer.pre_tokenize_str("Hello world.")
>>> [('▁Hello', (0, 5)), ('▁world.', (5, 12))]
tokenizer.pre_tokenizer.pre_tokenize_str("Hello world.")
>>> [('▁Hello', (0, 5)), ('▁', (5, 6)), ('▁', (6, 7)), ('▁world.', (7, 14))]
看看它是如何根据空格对句子进行预标记的?唯一的区别是它保留了空白信息,而天真的空白预标记器(或任何其他预标记器)可能会丢失这些信息。根据我从论文中了解到的内容,这是该句子的唯一优势,它通过保持空白信息完整来使编码和解码无损。
我希望这是有道理的。
参考: