Я хочу добавить несколько новых токенов в токенизатор предварительно обученного 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])