Токены, возвращенные в трансформаторной модели Берта из encode ()

У меня есть небольшой набор данных для анализа настроений. Классификатор будет простым KNN, но я хотел получить слово «встраивание» с моделью Bert из библиотеки transformers. Обратите внимание, что я только что узнал об этой библиотеке - я все еще учусь.

Поэтому, глядя на онлайн-пример, я пытаюсь понять размеры, которые возвращаются из модели.

Пример:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

tokens = tokenizer.encode(["Hello, my dog is cute", "He is really nice"])
print(tokens)

tokens = tokenizer.encode("Hello, my dog is cute", "He is really nice")
print(tokens)

tokens = tokenizer.encode(["Hello, my dog is cute"])
print(tokens)

tokens = tokenizer.encode("Hello, my dog is cute")
print(tokens)

Результат следующий:

[101, 100, 100, 102]

[101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 2002, 2003, 2428, 3835, 102]

[101, 100, 102]

[101, 7592, 1010, 2026, 3899, 2003, 10140, 102]

Кажется, я не могу найти документы для encode() - я понятия не имею, почему он возвращает разные данные, когда ввод передается в виде списка. Что это делает?

Кроме того, есть ли способ передать токен слова и вернуть фактическое слово - для устранения вышеуказанной проблемы?

заранее спасибо


person Edv Beq    schedule 27.08.2020    source источник


Ответы (1)


Для получения фактического токен для идентификатора:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

tokens = []

tokens.append(tokenizer.encode(["Hello, my dog is cute", "He is really nice"]))

tokens.append(tokenizer.encode("Hello, my dog is cute", "He is really nice"))

tokens.append(tokenizer.encode(["Hello, my dog is cute"]))

tokens.append(tokenizer.encode("Hello, my dog is cute"))

for t in tokens:
    print(tokenizer.convert_ids_to_tokens(t))

Выход:

['[CLS]', '[UNK]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]', 'he', 'is', 'really', 'nice', '[SEP]']
['[CLS]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]']

Как вы можете видеть здесь, каждый из ваших входов был токенизирован, и были добавлены специальные токены в соответствии с вашей моделью (bert). Функция кодирования не обработала ваши списки должным образом, что может быть ошибкой или предполагаемым поведением в зависимости от того, как вы ее определяете, потому что это метод пакетной обработки batch_encode_plus:

tokenizer.batch_encode_plus(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False)

Выход:

{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}

Я не уверен, почему метод кодирования не задокументирован, но может случиться так, что huggingface хочет, чтобы мы использовали вызвать метод напрямую:

tokens = []

tokens.append(tokenizer(["Hello, my dog is cute", "He is really nice"],  return_token_type_ids=False, return_attention_mask=False))

tokens.append(tokenizer("Hello, my dog is cute", "He is really nice",  return_token_type_ids=False, return_attention_mask=False))

tokens.append(tokenizer(["Hello, my dog is cute"], return_token_type_ids=False, return_attention_mask=False))

tokens.append(tokenizer("Hello, my dog is cute", return_token_type_ids=False, return_attention_mask=False))

print(tokens)

Выход:

[{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}, {'input_ids': [101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 2002, 2003, 2428, 3835, 102]}, {'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102]]}, {'input_ids': [101, 7592, 1010, 2026, 3899, 2003, 10140, 102]}]

person cronoik    schedule 27.08.2020
comment
О, спасибо вам большое - это очень помогает. Я предполагаю, что есть флаг для кодирования без специальных символов - person Edv Beq; 27.08.2020
comment
Да add_special_tokens=False. Просто проверьте документацию метода __call__. Я думаю, что все параметры также являются допустимыми параметрами encode. @EdvBeq - person cronoik; 27.08.2020