web-dev-qa-db-fra.com

Sauvegarder le classificateur Naive Bayes Trained en NLTK

Je suis un peu confus quant à la façon dont je sauve un classificateur formé. Comme dans, réentraîner un classificateur à chaque fois que je veux l'utiliser est évidemment très lent et lent, comment puis-je l'enregistrer et le charger à nouveau lorsque j'en ai besoin? Le code est ci-dessous, merci d'avance pour votre aide. J'utilise Python avec 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)
47
user179169

Sauver:

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

Pour charger plus tard:

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

Je suis passé par le même problème, et vous ne pouvez pas enregistrer l'objet car est une classe ELEFreqDistr NLTK. Quoi qu'il en soit, NLTK est un enfer lent. La formation a pris 45 minutes sur un set décent et j'ai décidé de mettre en œuvre ma propre version de l'algorithme (l'exécuter avec pypy ou le renommer en .pyx et installer cython). Cela prend environ 3 minutes avec le même ensemble et il peut simplement sauvegarder des données au format json (je vais implémenter pickle qui est plus rapide/meilleur). 

J'ai commencé un projet simple github, consultez le code ici

5
luke14free

Pour recycler le classificateur de cornichons:

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