Keras Text Preprocessing - Сохранение объекта Tokenizer в файл для подсчета очков

Я обучил модель классификатора чувств, используя библиотеку Keras, выполнив следующие шаги (в общем).

  • Преобразовать текстовое содержимое в последовательности, используя объект/класс Tokenizer
  • Создайте модель с помощью метода model.fit()
  • Оцените эту модель.

Теперь для оценки с использованием этой модели я смог сохранить модель в файле и загрузить из файла. Однако я не нашел способ сохранить объект Tokenizer в файле. Без этого мне придется обрабатывать корпус каждый раз, когда мне нужно набрать хотя бы одно предложение. Есть ли способ обойти это?

Ответ 1

Наиболее распространенным способом является использование pickle или joblib. Здесь у вас есть пример того, как использовать pickle для сохранения Tokenizer:

import pickle

# saving
with open('tokenizer.pickle', 'wb') as handle:
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

# loading
with open('tokenizer.pickle', 'rb') as handle:
    tokenizer = pickle.load(handle)

Ответ 2

Принятый ответ наглядно демонстрирует, как сохранить токенизатор. Ниже приведен комментарий к проблеме (как правило) оценки после подгонки или сохранения. Предположим, что texts списков состоит из двух списков Train_text и Test_text, где набор токенов в Test_text является подмножеством набора токенов в Train_text (оптимистическое предположение). Затем fit_on_texts(Train_text) дает разные результаты для texts_to_sequences(Test_text) по сравнению с первым вызовом fit_on_texts(texts) а затем text_to_sequences(Test_text).

Конкретный пример:

from keras.preprocessing.text import Tokenizer

docs = ["A heart that",
         "full up like",
         "a landfill",
        "no surprises",
        "and no alarms"
         "a job that slowly"
         "Bruises that",
         "You look so",
         "tired happy",
         "no alarms",
        "and no surprises"]
docs_train = docs[:7]
docs_test = docs[7:]
# EXPERIMENT 1: FIT  TOKENIZER ONLY ON TRAIN
T_1 = Tokenizer()
T_1.fit_on_texts(docs_train)  # only train set
encoded_train_1 = T_1.texts_to_sequences(docs_train)
encoded_test_1 = T_1.texts_to_sequences(docs_test)
print("result for test 1:\n%s" %(encoded_test_1,))

# EXPERIMENT 2: FIT TOKENIZER ON BOTH TRAIN + TEST
T_2 = Tokenizer()
T_2.fit_on_texts(docs)  # both train and test set
encoded_train_2 = T_2.texts_to_sequences(docs_train)
encoded_test_2 = T_2.texts_to_sequences(docs_test)
print("result for test 2:\n%s" %(encoded_test_2,))

Результаты:

result for test 1:
[[3], [10, 3, 9]]
result for test 2:
[[1, 19], [5, 1, 4]]

Конечно, если вышеупомянутое оптимистическое предположение не выполняется, и набор токенов в Test_text не пересекается с набором Train_test, тогда тест 1 приводит к списку пустых скобок [].

Ответ 3

Класс Tokenizer имеет функцию для сохранения даты в формате JSON:

tokenizer_json = tokenizer.to_json()
with io.open('tokenizer.json', 'w', encoding='utf-8') as f:
    f.write(json.dumps(tokenizer_json, ensure_ascii=False))

Данные могут быть загружены с tokenizer_from_json функции keras_preprocessing.text из keras_preprocessing.text:

with open('tokenizer.json') as f:
    data = json.load(f)
    tokenizer = tokenizer_from_json(data)

Ответ 4

Я создал проблему https://github.com/keras-team/keras/issues/9289 в keras repo. До тех пор, пока API не будет изменен, проблема имеет ссылку на суть, которая имеет код, демонстрирующий, как сохранять и восстанавливать токенизатор, не имея исходных документов, на которые помещался токенизатор. Я предпочитаю хранить всю информацию о моей модели в файле JSON (потому что причины, но в основном смешанные среды JS/Python), и это позволит это, даже с sort_keys = True