首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在英语上训练的BPE编码和在孟加拉语上应用的BPE编码不返回未知的标记?

为什么在英语上训练的BPE编码和在孟加拉语上应用的BPE编码不返回未知的标记?
EN

Stack Overflow用户
提问于 2021-09-07 14:14:42
回答 1查看 123关注 0票数 1

我使用在英语数据上训练的roberta-base tokenizer tokenizer = RobertaTokenizerFast.from_pretrained('roberta-base',add_prefix_space=True)来标记化孟加拉语,只是为了看看它是如何表现的。当我尝试对一个孟加拉字符tokenizer.encode('বা')进行编码时,我得到了[0, 1437, 35861, 11582, 35861, 4726, 2],这意味着它在它的词汇表中找到了一些与孟加拉字符匹配的标记,即使是在英语上训练。在进一步的研究中,我发现这些都是特殊字符['<s>', 'Ġ', 'à¦', '¬', 'à¦', '¾', '</s>']。我的问题是,为什么会发生这种情况,当应用于一种新的语言时,它不是应该输出未知的标记吗?非常感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2021-10-22 08:40:41

正如评论中提到的,原因是RoBERTa标记器是基于字节的,而不是基于字符的。

UTF-8中,字符由不同的字节数表示,这与拉丁字母有很大的不同: ASCII字符是单字节的,“最长”字符最多为四个字节。维基百科的一个例子:

代码语言:javascript
复制
Char | UTF code | Bytes
------------------------------
$    | U+0024   | 24
¢    | U+00A2   | C2 A2
ह    | U+0939   | E0 A4 B9
€    | U+20AC   | E2 82 AC
    | U+10348  | F0 90 8D 88

因此,RoBERTa使用的SentecePiece标记器首先将文本分割成字节,这始终是可能的,而且只有256个字节,所以没有什么是每个OOV的。然后,已知的字节组被分组为来自词汇表的已知标记。

SentencePiece还对空格和特殊字符进行特殊处理。首先,它用特殊字符和空格分割文本,并用特殊字符替换空格。在最初的实现中,它是一个特殊的UTF8下划线,在Huggingface实现中,它是Ġ。这个特殊字符也被放在句子的开头,所以当单词在句子的开头或中间时,它们被一致地表示出来。

所以,你看到的输出基本上是:

  1. 是每个字符串(Ġ)前面的特殊空格符号,
  2. 是表示字符

的四个字节

这意味着字符বা不在词汇表中,因此它最终被表示为四个字节,并且字节总是已知的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69089843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档