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