Путаница в предварительной обработке текста для модели Роберты

Я хочу применить модель Роберты для подобия текста. Для пары предложений ввод должен быть в формате <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> токен. Я не уверен, как правильно закодировать данные два предложения для вычисления сходства предложений с использованием модели Роберты.


person Mr. NLP    schedule 15.04.2020    source источник


Ответы (1)


Самый простой способ - это, вероятно, напрямую использовать предоставленную функцию самими токенизаторами 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 по-прежнему без каких-либо специальных токенов, как вы уже сделали правильно.

person dennlinger    schedule 15.04.2020