在使用 HuggingFace RobertaTokenizer 之前,我是否需要先对文本进行预标记? (不同理解)
Do I need to pre-tokenize the text first before using HuggingFace's RobertaTokenizer? (Different undersanding)
在 Huggingface 中使用 Roberta 分词器时,我感到很困惑。
>>> tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'big', ')', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'Ġbig', 'Ġ)', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.encode("The tiger is ___ (big) than the dog.")
[0, 20, 23921, 16, 2165, 36, 8527, 43, 87, 5, 2335, 4, 2]
>>> x = tokenizer.encode("The tiger is ___ ( big ) than the dog.")
[0, 20, 23921, 16, 2165, 36, 380, 4839, 87, 5, 2335, 4, 2]
>>>
问题:(big)
和( big )
有不同的标记化结果,这也导致不同的标记id。我应该使用哪一个?这是否意味着我应该首先对输入进行预标记以使其成为 ( big )
然后进行 RobertaTokenization?或者真的不重要?
其次,BertTokenizer
似乎没有这样的困惑:
>>> tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>>
BertTokenizer
使用 wordpieces 给我相同的结果。
有什么想法可以帮助我更好地理解 RobertaTokenizer,我知道它使用的是字节对编码?
Hugingface 的变形金刚设计为您不应该进行任何预标记。
RoBERTa 使用具有无损预标记化的 SentecePiece。也就是说,当你有一个标记化的文本时,你应该总是能够说出文本在标记化之前的样子。 Ġ
(即 ▁
,原始 SentecePiece 中一个奇怪的 Unicode 下划线)表示当你去标记时应该有一个 space。结果 big
和 ▁big
最终成为不同的标记。当然,在这个特定的上下文中,它没有多大意义,因为它显然仍然是同一个词,但这是你为无损标记化付出的代价,也是 RoBERTa 的训练方式。
BERT使用WordPiece,不会出现这个问题。另一方面,原始字符串和标记化文本之间的映射并不那么简单(这可能会带来不便,例如,当您想突出显示用户生成的文本中的某些内容时)。
在 Huggingface 中使用 Roberta 分词器时,我感到很困惑。
>>> tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'big', ')', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['The', 'Ġtiger', 'Ġis', 'Ġ___', 'Ġ(', 'Ġbig', 'Ġ)', 'Ġthan', 'Ġthe', 'Ġdog', '.']
>>> x = tokenizer.encode("The tiger is ___ (big) than the dog.")
[0, 20, 23921, 16, 2165, 36, 8527, 43, 87, 5, 2335, 4, 2]
>>> x = tokenizer.encode("The tiger is ___ ( big ) than the dog.")
[0, 20, 23921, 16, 2165, 36, 380, 4839, 87, 5, 2335, 4, 2]
>>>
问题:(big)
和( big )
有不同的标记化结果,这也导致不同的标记id。我应该使用哪一个?这是否意味着我应该首先对输入进行预标记以使其成为 ( big )
然后进行 RobertaTokenization?或者真的不重要?
其次,BertTokenizer
似乎没有这样的困惑:
>>> tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
>>> x = tokenizer.tokenize("The tiger is ___ (big) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>> x = tokenizer.tokenize("The tiger is ___ ( big ) than the dog.")
['the', 'tiger', 'is', '_', '_', '_', '(', 'big', ')', 'than', 'the', 'dog', '.']
>>>
BertTokenizer
使用 wordpieces 给我相同的结果。
有什么想法可以帮助我更好地理解 RobertaTokenizer,我知道它使用的是字节对编码?
Hugingface 的变形金刚设计为您不应该进行任何预标记。
RoBERTa 使用具有无损预标记化的 SentecePiece。也就是说,当你有一个标记化的文本时,你应该总是能够说出文本在标记化之前的样子。 Ġ
(即 ▁
,原始 SentecePiece 中一个奇怪的 Unicode 下划线)表示当你去标记时应该有一个 space。结果 big
和 ▁big
最终成为不同的标记。当然,在这个特定的上下文中,它没有多大意义,因为它显然仍然是同一个词,但这是你为无损标记化付出的代价,也是 RoBERTa 的训练方式。
BERT使用WordPiece,不会出现这个问题。另一方面,原始字符串和标记化文本之间的映射并不那么简单(这可能会带来不便,例如,当您想突出显示用户生成的文本中的某些内容时)。