Keras prétraitement du texte - sauvegarde de L'objet Tokenizer à classer pour la notation

j'ai formé un modèle de classificateur de sentiment en utilisant la bibliothèque de Keras en suivant les étapes ci-dessous(en gros).

  1. convertissez le corpus de texte en séquences en utilisant Tokenizer object / class
  2. construisez un modèle en utilisant le modèle.ajustement() la méthode
  3. evaluer Ce modèle

maintenant pour la notation en utilisant ce modèle, j'ai pu sauvegarder le modèle dans un fichier et le charger à partir d'un fichier. Cependant, je n'ai pas trouvé un moyen de sauvegarder L'objet Tokenizer dans le fichier. Sans cette Je devrai traiter le corpus à chaque fois que j'aurai besoin de marquer ne serait-ce qu'une seule phrase. Est-il un moyen de contourner cela?

18
demandé sur Marcin Możejko 2017-08-17 15:25:32

3 réponses

la façon La plus courante consiste à utiliser pickle ou joblib. Ici vous avez un exemple sur la façon d'utiliser pickle pour enregistrer 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)
31
répondu Marcin Możejko 2018-10-01 20:49:37

la réponse acceptée montre clairement comment sauvegarder le tokenizer. Ce qui suit est un commentaire sur le problème de (généralement) notation après ajustement ou économie. Supposons qu'une liste texts se compose de deux listes Train_text et Test_text, où l'ensemble de jetons dans Test_text est un sous-ensemble de l'ensemble de jetons dans Train_text (hypothèse optimiste). Puis fit_on_texts(Train_text) donne des résultats différents pour texts_to_sequences(Test_text) par rapport au premier appel fit_on_texts(texts) et puis text_to_sequences(Test_text).

Exemple Concret:

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,))

Résultats:

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

bien sûr, si l'hypothèse optimiste ci-dessus n'est pas satisfaite et que L'ensemble des tokens dans Test_text est disjoint de celui de Train_test, alors le test 1 donne une liste de crochets vides [].

4
répondu Quetzalcoatl 2018-07-09 19:06:11

j'ai créé le problème https://github.com/keras-team/keras/issues/9289 dans le keras Repo. Jusqu'à ce que L'API soit modifiée, le problème a un lien vers un gist qui a du code pour montrer comment sauvegarder et restaurer un tokenizer sans avoir les documents originaux sur lesquels le tokenizer était adapté. Je préfère stocker toutes les informations de mon modèle dans un fichier JSON (parce que les raisons, mais surtout l'environnement mixte JS/Python), et cela permettra cela, même avec sort_keys=True

1
répondu UserOneFourTwo 2018-02-02 16:58:56