我想向预训练的 Tokenizer 的 tokenizer 添加一些新的 token,以便对我的下游任务进行微调。但我不想通过查看每个示例来检查哪个标记不在 Tokenizer 的词汇表中。当我传入语料库时,有什么方法可以提取哪些字符串标记是未知标记吗?
我不确定您是否可以可靠/有效地确定令牌是否未知,而不通过标记器传递它,特别是由于许多当代标记器使用子词进行标记化。
但是,您可以通过在唯一单词列表上运行标记器来大幅减少所需的处理时间。请注意,这里的单词实际上指的是“传统”非子词标记。
为此,您可以使用 pre-tokenizer 获取单词列表:
>>> tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str("I'm good, thanks!")
['I', "'", 'm', 'good', ',', 'thanks', '!']
您当然可以选择不使用
pre_tokenizer
并仅在空格上分隔,但这会大大增加唯一单词的数量,特别是由于标点符号没有以空格分隔。这也取决于您使用的语言。
此外,根据您的数据和标记器,在预标记化之前规范化文本可能会很有用。例如,如果您的模型没有大小写,那么将所有标记都小写是有益的,从而进一步减少唯一单词的数量。
您可能会发现本指南很有用,因为它更详细地介绍了分词器执行的预处理步骤。
将这些预先标记化的标记添加到
set
:
unique_tokens = set()
for text in corpus:
tokens = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
unique_tokens.update([token for token, _ in tokens])
然后,在
unique_tokens
上运行您的标记器,提取标记器未知的标记:
unique_tokens = list(unique_tokens)
unknown_tokens = []
for i, sub_tokens in enumerate(tokenizer(unique_tokens)["input_ids"]):
if tokenizer.unk_token_id in sub_tokens:
unknown_tokens.append(unique_tokens[i])