Как узнать, какой токен является токеном unk из токенизатора Hugging Face?

Я хочу добавить несколько новых токенов в токенизатор предварительно обученного Tokenizer, чтобы выполнить точную настройку моей последующей задачи. Но я не хочу проверять, просматривая каждый образец, чтобы узнать, какого токена нет в словаре токенизатора. Есть ли способ извлечь, какие строковые токены являются неизвестными токенами, когда я передаю корпус?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
159
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, можете ли вы надежно/эффективно определить, является ли токен неизвестным, не пропуская его через токенизатор, особенно из-за того, что многие современные токенизаторы токенизируют с использованием подслов.

Однако вы можете значительно сократить необходимое время обработки, запустив токенизатор по списку уникальных слов. Обратите внимание, что под словами здесь я на самом деле имею в виду «традиционные» токены, не являющиеся подсловами.

Извлечение набора уникальных слов

Для этого вы можете получить список слов с помощью претокенайзера :

>>> 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])

Другие вопросы по теме