Путаница в предварительной обработке текста для модели Роберта - PullRequest
1 голос
/ 15 апреля 2020

Я хочу применить модель Роберта для сходства текста. Учитывая пару предложений, ввод должен быть в формате <s> A </s></s> B </s>. Я выяснил два возможных способа генерации входных идентификаторов, а именно

a)

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands')

list2 = tokenizer.encode('Numbness of upper limb')

sequence = list1+[2]+list2[1:]

В этом случае последовательность [0, 12178, 3814, 2400, 11, 1420, 2, 2, 234, 4179, 1825, 9, 2853, 29654, 2]

b)

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands', add_special_tokens=False)

list2 = tokenizer.encode('Numbness of upper limb', add_special_tokens=False)

sequence = [0]+list1+[2,2]+list2+[2]

В этом случае последовательность [0, 25101, 3814, 2400, 11, 1420, 2, 2, 487, 4179, 1825, 9, 2853, 29654, 2]

Здесь 0 представляет <s> токен, а 2 представляет </s> токен. Я не уверен, что является правильным способом кодирования данных двух предложений для вычисления сходства предложений с использованием модели Роберты.

1 Ответ

2 голосов
/ 15 апреля 2020

Возможно, самый простой способ - напрямую использовать предоставленную функцию самими токенизаторами HuggingFace, а именно аргумент text_pair в функции encode, см. здесь . Это позволяет вам напрямую вводить два предложения, что даст вам желаемый результат:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')
sequence = tokenizer.encode(text='Very severe pain in hands',
                            text_pair='Numbness of upper limb',
                            add_special_tokens=True)

Это особенно удобно, если вы имеете дело с очень длинными последовательностями, так как функция encode автоматически уменьшает ваш длины в соответствии с аргументом truncaction_strategy. Вы, очевидно, не должны беспокоиться об этом, если это только короткие последовательности.

В качестве альтернативы, вы также можете использовать более явную build_inputs_with_special_tokens() функцию RobertaTokenizer в частности, который может быть добавлен к вашему примеру следующим образом:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('roberta-base')

list1 = tokenizer.encode('Very severe pain in hands', add_special_tokens=False)
list2 = tokenizer.encode('Numbness of upper limb', add_special_tokens=False)

sequence = tokenizer.build_inputs_with_special_tokens(list1, list2)

Обратите внимание, что в этом случае вы должны сгенерировать последовательности list1 и list2 все еще без любой специальные токены, как вы уже сделали правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...