it-swarm.com.de

Keras-Textvorverarbeitung - Speichern des Tokenizer-Objekts in einer Datei zur Bewertung

Ich habe ein Sentiment-Klassifizierungsmodell mithilfe der Keras-Bibliothek trainiert, indem Sie die folgenden Schritte (allgemein) befolgen.

  1. Konvertieren Sie einen Textkorpus mithilfe des Tokenizer-Objekts/der Klasse in Sequenzen
  2. Erstellen Sie ein Modell mit der model.fit () -Methode 
  3. Bewerten Sie dieses Modell

Nun konnte ich das Modell in einer Datei speichern und aus einer Datei laden. Ich habe jedoch keine Möglichkeit gefunden, das Tokenizer-Objekt in einer Datei zu speichern. Andernfalls muss ich den Korpus jedes Mal bearbeiten, wenn ich nur einen einzigen Satz zählen muss. Gibt es da einen Weg?

Am gebräuchlichsten ist die Verwendung von pickle oder joblib . Hier haben Sie ein Beispiel, wie Sie mit pickleTokenizer speichern können:

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)
46
Marcin Możejko

Die akzeptierte Antwort zeigt deutlich, wie der Tokenizer gespeichert wird. Das Folgende ist ein Kommentar zu dem Problem der (allgemein) Bewertung von nach Anpassen oder Speichern. Angenommen, eine Liste texts besteht aus zwei Listen Train_text und Test_text, wobei die Menge der Token in Test_text eine Teilmenge der Menge der Token in Train_text ist (eine optimistische Annahme). Dann gibt fit_on_texts(Train_text) andere Ergebnisse für texts_to_sequences(Test_text) als beim ersten Aufruf von fit_on_texts(texts) und dann text_to_sequences(Test_text).

Konkretes Beispiel:

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

Ergebnisse:

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

Wenn die oben genannte optimistische Annahme nicht erfüllt ist und die Menge der Token in Test_text nicht mit der von Train_test übereinstimmt, führt test 1 natürlich zu einer Liste leerer Klammern [].

6
Quetzalcoatl

Ich habe die Ausgabe https://github.com/keras-team/keras/issues/9289 im Keras Repo erstellt. Bis die API geändert wird, enthält das Problem eine Verknüpfung zu einer Gist, die Code enthält, um zu zeigen, wie ein Tokenizer gespeichert und wiederhergestellt wird, ohne dass die Originaldokumente vorhanden sind, auf die der Tokenizer passt. Ich ziehe es vor, alle meine Modellinformationen in einer JSON-Datei zu speichern (aus Gründen, aber hauptsächlich gemischter JS/Python-Umgebung), und dies wird auch bei sort_keys = True möglich sein 

1
UserOneFourTwo

Eine weitere Option ist das Speichern von Tokenizer im JSON-Format:

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

Die Daten können mit der tokenizer_from_json-Funktion von keras_preprocessing.text geladen werden:

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