Guardar el clasificador entrenado Bayes ingenuo en NLTK

Estoy un poco confundido con respecto a cómo salvar a un clasificador entrenado. Al igual que en, volver a entrenar a un clasificador cada vez que quiero usarlo es obviamente muy malo y lento, ¿cómo lo guardo y lo cargué cuando lo necesito? El código está abajo, gracias de antemano por su ayuda. Estoy usando Python con NLTK Naive Bayes Classifier.

classifier = nltk.NaiveBayesClassifier.train(training_set) # look inside the classifier train method in the source code of the NLTK library def train(labeled_featuresets, estimator=nltk.probability.ELEProbDist): # Create the P(label) distribution label_probdist = estimator(label_freqdist) # Create the P(fval|label, fname) distribution feature_probdist = {} return NaiveBayesClassifier(label_probdist, feature_probdist) 

Ahorrar:

 import pickle f = open('my_classifier.pickle', 'wb') pickle.dump(classifier, f) f.close() 

Para cargar más tarde:

 import pickle f = open('my_classifier.pickle', 'rb') classifier = pickle.load(f) f.close() 

Pasé por el mismo problema y no puede guardar el objeto, ya que es una clase ELEFreqDistr NLTK. De todos modos NLTK es un infierno lento. El entrenamiento tomó 45 minutos en un conjunto decente y decidí implementar mi propia versión del algoritmo (ejecutarlo con pypy o renombrarlo .pyx e instalar cython). Toma aproximadamente 3 minutos con el mismo conjunto y puede simplemente guardar datos como json (implementaré pickle que es más rápido / mejor).

Comencé un proyecto github simple, revisa el código aquí

Para volver a entrenar el Classifer en escabeche:

 f = open('originalnaivebayes5k.pickle','rb') classifier = pickle.load(f) classifier.train(training_set) print('Accuracy:',nltk.classify.accuracy(classifier,testing_set)*100) f.close()