Применение обученной модели BERT для развертывания прогнозирования

В настоящее время я работаю над задачей классификации по нескольким меткам для текстовых данных. У меня есть фрейм данных со столбцом идентификатора, текстовым столбцом и несколькими столбцами, которые представляют собой текстовую метку, содержащую только 1 или 0.

Я использовал существующее решение, предложенное на этом веб-сайте Классификация токсичных комментариев Kaggle с использованием Bert, который позволяет выражать в процентах степень его принадлежности к каждому ярлыку.

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

Я пробовал это решение:

def getPrediction(in_sentences):
  label = ['S1, S2, S3']
  input_examples = [run_classifier.InputExample(guid="", text_a = x, text_b = None, label=label) for x in in_sentences]
  input_features = run_classifier.convert_examples_to_features(input_examples, LABEL_COLUMNS, MAX_SEQ_LENGTH, tokenizer)
  predict_input_fn = run_classifier.input_fn_builder(features=input_features, seq_length=MAX_SEQ_LENGTH, is_training=False, drop_remainder=False)
  predictions = estimator.predict(predict_input_fn)
  return [(sentence, prediction['probabilities'], labels[prediction['labels']]) for sentence, prediction in zip(in_sentences, predictions)]

pred_sentences = [
  "here is an exemple of sentence"]

pred_sentences = ''.join(pred_sentences)

predictions = getPrediction(pred_sentences)

И я получил:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-490-770bf0871d3e> in <module>
----> 1 predictions = getPrediction(pred_sentences)

<ipython-input-486-3de7328d60db> in getPrediction(in_sentences)
      2   label = ['S1','S2',
      3    'S3']
----> 4   input_examples = [run_classifier.InputExample(guid="", text_a = x, text_b = None, labels=label) for x in in_sentences]
      5   input_features = run_classifier.convert_examples_to_features(input_examples, LABEL_COLUMNS, MAX_SEQ_LENGTH, tokenizer)
      6   predict_input_fn = run_classifier.input_fn_builder(features=input_features, seq_length=MAX_SEQ_LENGTH, is_training=False, drop_remainder=False)

<ipython-input-486-3de7328d60db> in <listcomp>(.0)
      2   label = ['S1,
      3    S2,S3']
----> 4   input_examples = [run_classifier.InputExample(guid="", text_a = x, text_b = None, labels=label) for x in in_sentences]
      5   input_features = run_classifier.convert_examples_to_features(input_examples, LABEL_COLUMNS, MAX_SEQ_LENGTH, tokenizer)
      6   predict_input_fn = run_classifier.input_fn_builder(features=input_features, seq_length=MAX_SEQ_LENGTH, is_training=False, drop_remainder=False)

TypeError: __init__() got an unexpected keyword argument 'labels'

Есть идеи, что мне нужно изменить, чтобы последняя часть моего алгоритма работала?


person JEG    schedule 25.06.2020    source источник


Ответы (1)


Вы допустили опечатку, InputExample ожидает аргумент ключевого слова с именем label, а не labels:

[run_classifier.InputExample(guid="", text_a = x, text_b = None, labels=label) for x in in_sentences]
                                                                      ^
person BioGeek    schedule 25.06.2020
comment
Фактически, я уже пробовал это, но у меня возникла ошибка: TypeError: unhashable type: 'list' - person JEG; 25.06.2020
comment
Это потому, что аргумент ключевого слова label ожидает строку, а не список. См. github.com/google-research/bert/blob/master. / - person BioGeek; 25.06.2020
comment
Я пытался добавить: def getPrediction (in_sentences): label = [S1, S2, S3] label = .join (str (x) for x in label), которые позволяют преобразовать список в строку, но я все равно получаю сообщение об ошибке : KeyError: 'S1 S2 S3' - person JEG; 25.06.2020
comment
InputExample предназначен для одного обучающего / тестового примера, поэтому должен получить только один ярлык. - person BioGeek; 25.06.2020
comment
См. Шаг Data Preprocessing в этой записной книжке: github.com/google-research/ bert / blob / master / - person BioGeek; 25.06.2020
comment
Я использую тот же код, что и на этом веб-сайте: kaggle. ru / javaidnabi /xic-comment-classification-using-bert / - person JEG; 29.06.2020
comment
но он отличается от кода, доступного на Github github.com/google- research / bert / blob / master / (что позволяет протестировать обученный алгоритм на новых предложениях). - person JEG; 29.06.2020
comment
Моя цель здесь - адаптировать код детали, начиная с def getPrediction (in_sentences):, к моему основному алгоритму (Kaggle one). На мой взгляд, основное отличие состоит в том, что в коде Github учитывается только один label_columns, но с новой переменной label_list, в моем основном коде у меня много label_columns и нет label_list. - person JEG; 29.06.2020
comment
Итак, я попытался изменить, например, параметр label_list в label_columns, я также попытался изменить label = 0 в label = labels, где labels = [S1, S2, S3], но в этом последнем примере у меня была ошибка, говорящая, что метка переменной может принимать только строку, как вы упомянули, поэтому я попытался преобразовать этот список в строку с помощью: labels = '' .join (labels), но у меня есть KeyError: 'S1S2S3'. - person JEG; 29.06.2020
comment
Наконец, я также попробовал: label = 'S1' (что не имеет смысла в моем случае, потому что у меня есть 3 метки, но не только одна), но я получил ValueError: логиты и метки должны иметь одинаковую форму ((?, 3) vs ( ?,)) - person JEG; 29.06.2020