2016-05-01 6 views
1

Ich erhalte einen Speicherfehler, wenn ich den Klassifikator für den gesamten Datensatz trainiere, also habe ich den Datensatz in kleine Teile geteilt und ein einzelnes Klassifikatorobjekt für jedes trainiert.NLTK Classifier Objekt

Zum Testen benötige ich eine Kombination dieser einzelnen Klassifikatorobjekte. Wie kann ich das machen? Ich kann die Objekte in der Pickle-Datei speichern, aber wiederum sind sie nur einzelne Objekte.

Ich verwende NLTK.

Code:

documents = [(list(movie_reviews.words(fileid)), category) 
     for category in movie_reviews.categories() 
     for fileid in movie_reviews.fileids(category)] 

all_words = [] 
for w in movie_reviews.words(): 
    all_words.append(w.lower()) 
all_words = nltk.FreqDist(all_words) 
word_features = list(all_words.keys())[:3000] 

def find_features(document): 
    words = set(document) 
    features = {} 
    for w in word_features: 
     features[w] = (w in words) 
    return features 



#print((find_features(movie_reviews.words('neg/cv000_29416.txt')))) 
featuresets = [(find_features(rev), category) for (rev, category) in documents] 
numtrain = int(len(documents) * 90/100) 
training_set = featuresets[:numtrain] 
testing_set = featuresets[numtrain:] 

classifier = nltk.NaiveBayesClassifier.train(training_set) 

Antwort

3

Der Klassifikator auf der gesamten Datensatz (die training_set in Ihrem Code) trainiert werden muss, für Sie da Training zu machen korrekte Vorhersagen und Tests (auf der testing_set), in der Lage sein mehr als ein Klassifikator mit Teilen des Datensatzes wird nicht funktionieren - oder zumindest wird es nicht die optimale Lösung sein. Ich würde die folgenden Dinge vorschlagen:

  1. Versuchen Sie, die Speicherfehler zu lösen (wenn Sie auf Windows laufen und 32 Python Bit, das einen Blick auf diese: http://gisgeek.blogspot.gr/2012/01/set-32bit-executable-largeaddressaware.html)
  2. versuchen, Ihren Code/Daten zu optimieren und vielleicht Verwenden Sie weniger Features oder stellen Sie sie platz- und speichersparender dar.
  3. Wenn 1 und 2 nicht funktionieren und viele Klassifikatorobjekte zu einem kombinieren möchten (aber nur wenn es um ihre Vorhersagen geht), könnten Sie Ensemble-Methoden ausprobieren, ABER ich glaube wirklich, dass dies neben dem Punkt von Ihnen ist versuchen zu tun und werden das Problem, vor dem Sie stehen, nicht beheben. Auf jeden Fall, hier ist ein Beispiel für eine MaxVote Klassifikator: https://bitbucket.org/roadrunner_team/large-scale-sentiment-analysis/src/a06d51ef42325293f0296270ca975341c847ab9f/SentimentAnalysis/FigurativeTextAnalysis/models/Classifier_.py?at=master&fileviewer=file-view-default

    class MaxVoteClassifier(object): 
        """ 
         Takes as input a list of pre-trained classifiers and calculates the Frequency Distribution of their predictions 
        """ 
        def __init__(self, classifiers): 
         self._classifiers = classifiers 
         self.predictions = None 
    
        def classify(self, tweet_fea): 
         counts = FreqDist() 
         for classifier in self._classifiers: 
          classifier.set_x_trial([tweet_fea]) 
          counts[classifier.predict()[0]] += 1 
    
         return counts.max() 
    
+0

Vielen Dank für Ihre Antwort. Die Frage ist, dass ich einen Speicherfehler erhalte, wenn ich nur 3000 Wörter überschreite, und für eine korrekte Vorhersage muss ich den ganzen Datensatz verwenden, der mehr als 100k Wörter betragen wird. Ich denke also nicht, dass Punkt 1 und 2 funktionieren. Was ich denke ist, dass mein Problem ein sehr häufiges Problem sein sollte, da die meisten Leute, die ein maschinelles Lernprojekt machen, damit konfrontiert werden müssen. Diese Seite http://text-processing.com/demo/sentiment/ hat eine Anwendung mit NLTK gemacht und es funktioniert perfekt, so dass es eine gemeinsame Technik oder etwas geben muss, die jeder benutzen muss. – Arkham

+0

Das Repository in meinem Beispiel ist ein Sentiment-Analyse-Projekt, das (in einer der Einstellungen) ~ 100000 Tweets für Zugdaten und ~ 20000 für Testdaten verwendet und es in einem einzigen Schritt ohne Speicherprobleme gemacht wird. Es benutzt jedoch scikit-learn (und nltk für andere Dinge). Deshalb habe ich 1 und 2 vorgeschlagen. Können Sie mir mehr darüber erzählen, wo Sie Ihr Beispiel testen? (Hardware und Einrichtung) – mkaran

+0

Ich habe einen 6GB RAM mit dem NLTK-Toolkit natürlich und wie alles auf dem normalen Computer. Nicht mit scikit Modul BTW. Aber da der Link, den ich gepostet habe, kein scikit-Modul verwendet und auf NLTK basiert, denke ich nicht, dass es einen Unterschied machen sollte. – Arkham