len(tokenizer) 和 tokenizer.vocab_size 有啥区别

Posted

技术标签:

【中文标题】len(tokenizer) 和 tokenizer.vocab_size 有啥区别【英文标题】:what is the difference between len(tokenizer) and tokenizer.vocab_sizelen(tokenizer) 和 tokenizer.vocab_size 有什么区别 【发布时间】:2021-07-28 11:05:25 【问题描述】:

我正在尝试在预训练的 HuggingFace Transformers 模型的词汇表中添加一些新词。我做了以下改变分词器的词汇并增加了模型的嵌入大小:

tokenizer.add_tokens(['word1', 'word2', 'word3', 'word4'])
model.resize_token_embeddings(len(tokenizer))
print(len(tokenizer)) # outputs len_vocabulary + 4

但是在我的语料库上训练模型并保存后,我发现保存的分词器词汇量没有改变。再次查看后发现,上述代码并没有改变词汇量大小(tokenizer.vocab_size 还是一样),只是改变了len(tokenizer)。

所以现在我的问题是; tokenizer.vocab_size 和 len(tokenizer) 有什么区别?

【问题讨论】:

【参考方案1】:

从HuggingFace docs,如果您搜索方法vocab_size,您可以在文档字符串中看到它返回的大小不包括添加的标记:

基本词汇的大小(没有添加的标记)。

然后还调用标记器对象上的len() 方法,该对象本身调用__len__ 方法:

def __len__(self):
    """
    Size of the full vocabulary with the added tokens.
    """
    return self.vocab_size + len(self.added_tokens_encoder)

因此您可以清楚地看到前者返回的大小不包括添加的标记,而后者包括添加的标记,因为它本质上是前者(vocab_size加上len(added_tokens_encoder)

【讨论】:

以上是关于len(tokenizer) 和 tokenizer.vocab_size 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

同账号小程序token和app token一样吗

安全登陆怎么生成token

tokenize($s) 和 tokenize($s, ' ') 一样吗?

前端的token验证 (以vue为例)

jenkins生成token

Token和session 详解