Как использовать библиотеку Hugging Face Transformers в Tensorflow для классификации текста в пользовательских данных?

Я пытаюсь выполнить классификацию двоичного текста для пользовательских данных (которые находятся в формате csv) с использованием различных архитектур трансформаторов, которые предлагает библиотека Hugging Face 'Transformers'. Я использую это сообщение в блоге Tensorflow в качестве ссылки.

Я загружаю настраиваемый набор данных в формат tf.data.Dataset, используя следующий код:

def get_dataset(file_path, **kwargs):
   dataset = tf.data.experimental.make_csv_dataset(
     file_path,
     batch_size=5, # Artificially small to make examples easier to show.
     na_value="",
     num_epochs=1,
     ignore_errors=True, 
     **kwargs)
   return dataset 

После этого, когда я попытался использовать 'glue_convert_examples_to_features" rel>' glue_convert_examples_to_features" rel>"noreferrer_examples" rel>"noreferrer_examples" rel> ' для токенизации, как показано ниже:

train_dataset = glue_convert_examples_to_features(
                           examples = train_data,
                           tokenizer = tokenizer, 
                           task = None,
                           label_list = ['0', '1'],
                           max_length = 128
                           )

что вызывает ошибку «UnboundLocalError: локальная переменная 'processor', на которую ссылалась перед присваиванием '» по адресу:

 if is_tf_dataset:
    example = processor.get_example_from_tensor_dict(example)
    example = processor.tfds_map(example)

Во всех примерах я вижу, что они используют такие задачи, как «mrpc» и т. Д., Которые предопределены и имеют glue_processor для обработки. Ошибка возникает в "строке 85" в исходном коде.

Может ли кто-нибудь помочь с решением этой проблемы с использованием «пользовательских данных»?


person rocky_1234    schedule 30.01.2020    source источник


Ответы (1)


У меня была такая же проблема с запуском.

Это представление Kaggle очень помогло мне. Здесь вы можете увидеть, как можно токенизировать данные в соответствии с выбранной предварительно обученной моделью:

from transformers import BertTokenizer
from keras.preprocessing.sequence import pad_sequences

bert_model_name = 'bert-base-uncased'

tokenizer = BertTokenizer.from_pretrained(bert_model_name, do_lower_case=True)
MAX_LEN = 128

def tokenize_sentences(sentences, tokenizer, max_seq_len = 128):
    tokenized_sentences = []

    for sentence in tqdm(sentences):
        tokenized_sentence = tokenizer.encode(
                            sentence,                  # Sentence to encode.
                            add_special_tokens = True, # Add '[CLS]' and '[SEP]'
                            max_length = max_seq_len,  # Truncate all sentences.
                    )
        
        tokenized_sentences.append(tokenized_sentence)

    return tokenized_sentences

def create_attention_masks(tokenized_and_padded_sentences):
    attention_masks = []

    for sentence in tokenized_and_padded_sentences:
        att_mask = [int(token_id > 0) for token_id in sentence]
        attention_masks.append(att_mask)

    return np.asarray(attention_masks)

input_ids = tokenize_sentences(df_train['comment_text'], tokenizer, MAX_LEN)
input_ids = pad_sequences(input_ids, maxlen=MAX_LEN, dtype="long", value=0, truncating="post", padding="post")
attention_masks = create_attention_masks(input_ids)

После этого вы должны разделить идентификаторы и маски:

from sklearn.model_selection import train_test_split

labels =  df_train[label_cols].values

train_ids, validation_ids, train_labels, validation_labels = train_test_split(input_ids, labels, random_state=0, test_size=0.1)
train_masks, validation_masks, _, _ = train_test_split(attention_masks, labels, random_state=0, test_size=0.1)

train_size = len(train_inputs)
validation_size = len(validation_inputs)

Кроме того, я просмотрел person Domi W    schedule 30.03.2020

comment
Для меня генератор не работал, и вместо labels[i] мне пришлось использовать tf.reshape(tf.constant(labels[i]), [1,num_labels]), чтобы tf не жаловался на несоответствие форм. В любом случае, спасибо, ваш ответ мне очень помог! - person Dirk N.; 07.07.2020
comment
Не могли бы вы привести пример того, как получить аргумент train_masks, который вы используете во втором фрагменте кода? Вдобавок я предполагаю, что вы получаете свой val_dataset с той же процедурой, что и train_dataset, верно? - person Pavel Razgovorov; 19.08.2020
comment
Привет, я обновил свой ответ в соответствии с вашим комментарием. Вы также могли бы просто нажать на соревнование Kaggle, чтобы узнать. И да, я получаю val_dataset с той же процедурой, что и train_dataset. - person Domi W; 20.08.2020