Я работаю с проблемой классификации текста, где хочу использовать модель BERT в качестве основы, за которой следуют плотные слои. Я хочу знать, как работают 3 аргумента? Например, если у меня есть 3 предложения как:
'My name is slim shade and I am an aspiring AI Engineer',
'I am an aspiring AI Engineer',
'My name is Slim'
Итак, что будут делать эти 3 аргумента? Я думаю следующее:
max_length=5
строго сохранит все предложения длиной 5padding=max_length
добавит отступ 1 к третьему предложениюtruncate=True
обрежет первое и второе предложение так, чтобы их длина была ровно 5.Пожалуйста, поправьте меня, если я ошибаюсь.
Ниже приведен мой код, который я использовал.
! pip install transformers==3.5.1
from transformers import BertTokenizerFast
tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
tokens = tokenizer.batch_encode_plus(text,max_length=5,padding='max_length', truncation=True)
text_seq = torch.tensor(tokens['input_ids'])
text_mask = torch.tensor(tokens['attention_mask'])
То, что вы предположили, почти верно, однако отличий немного.
max_length=5
, max_length
указывает длину размеченного текста. По умолчанию BERT выполняет токенизацию фрагментов слов. Например, слово «играть» можно разделить на «играть» и «##инг» (может быть, это не очень точно, но просто для того, чтобы помочь вам понять токенизацию частей слов), а затем добавить токен [CLS]
в начале предложение и токен [SEP]
в конце предложения. Таким образом, он сначала токенизирует предложение, усекает его до max_length-2
(если truncation=True
), затем добавляет [CLS]
в начале и [SEP]
токен в конце (таким образом, общая длина max_length
)
padding='max_length'
, В этом примере не очень очевидно, что 3-й пример будет дополнен, так как длина превышает 5
после добавления токенов [CLS]
и [SEP]
. Однако, если у вас есть max_length
из 10. Токенизированный текст соответствует [101, 2026, 2171, 2003, 11754, 102, 0, 0, 0, 0]
, где 101 — это идентификатор [CLS]
, а 102 — идентификатор [SEP]
токенов. Таким образом, дополняется нулями, чтобы весь текст был длиной max_length
Аналогично, truncate=True
гарантирует строгое соблюдение max_length, т. е. более длинные предложения усекаются до max_length
, только если truncate=True
Мы не можем гарантировать, изменится ли currentI
на current I
. Так как само слово current
можно разделить на части. Вам не нужно выполнять лемматизацию, у меня есть ответ на этот вопрос по адресу: stackoverflow.com/questions/57057992/…
У меня есть 6 элементов в моей предварительной обработке. Можете ли вы дать свой отзыв о том, какой из них я должен использовать. Лемматизация, стемминг, удаление чисел (любое число с плавающей запятой или целое число), удаление слов одиночной длины (x, y, i, a, b), замена любого числа на «число» (2 = число, 123,43 = число), удаление стоп-слов, удаление специальные символы? Не могли бы вы оставить свой отзыв об этом?
И ваш другой ответ был очень описательным и дает много деталей. Спасибо, что помогаете таким, как я.
Не могли бы вы помочь мне с проблемой комментария выше? Есть предположения?
предварительная обработка?
PreProcessing
— это функция, которая использует от 0 до 6 различных методов, описанных выше. Какой из них я должен использовать? Данные — это физика, химия, математика и биология. Лемматизация и стемминг не будут работать, как вы описали выше. Удаление стоп-слов также приведет к потере семантического контекста. Итак, помня об этих вещах, какие из них я должен использовать?
Предварительная обработка действительно зависит от выбора приложения, если вы используете BERT, я бы вообще рекомендовал не выполнять лемматизацию. Однако предварительная прецессия 2 = number
и т. д. обычно не имеет большого значения. Вы все еще можете оставить слово одинарной длины (стоп-слова), так как они добавят ту или иную информацию.
Ой! Хорошо. Спасибо. Я использую только BERT. Так что я думаю, что эти вещи не будут настолько полезными. Для моих пользовательских моделей все было по-другому.
@AshwinGeetD'Sa Спасибо за отличный ответ! Не могли бы вы подробнее объяснить, почему max_length является мягким ограничением и как оно работает?
Большое спасибо за этот подробный ответ. Я хочу усечение, потому что я работаю с проблемой классификации, поэтому я не могу работать с переменной длиной. Также у меня есть еще одно сомнение по поводу словаря. По моему мнению, Vocab уже построен с использованием текстов 300 Б. Так возможно ли, что он может изменить
zaxis
наz axis
иcurrentI
наcurrent I
? также будет лучше использоватьLemmatization
и/илиStemming. Also can it work with
sin,cos,theta,gamma`и т. д. Я думаю, что они тоже были частью текстов 300B, потому что он предсказывает правильную метку только на их основе.