2016-04-28 5 views
0

Ich arbeite an einem Projekt mit dem NLTK-Toolkit. Mit der Hardware, die ich habe, kann ich das Klassifikatorobjekt auf einem kleinen Datensatz ausführen. Also habe ich die Daten in kleinere Stücke aufgeteilt und das Klassifikationsobjekt in ihnen ausgeführt, während ich all diese einzelnen Objekte in einer Pickle-Datei gespeichert habe.Wie zum Zusammenschluss NaiveBayesClassifier Objekt in NLTK

Jetzt zum Testen muss ich das ganze Objekt als ein besseres Ergebnis haben. Also meine Frage ist, wie kann ich diese Objekte zu einem kombinieren.

objs = [] 

while True: 
    try: 
     f = open(picklename,"rb") 
     objs.extend(pickle.load(f)) 
     f.close() 
    except EOFError: 
     break 

Dies funktioniert nicht. Und es gibt den Fehler TypeError: 'NaiveBayesClassifier' object is not iterable.

NaiveBayesClassifier Code:

classifier = nltk.NaiveBayesClassifier.train(training_set) 
+0

Wie sieht der Code für 'NaiveBayesClassifier' aus? – Omid

+0

@Omid Es ist ein Toolkit. Ich habe meine Frage zum Klassifikator bearbeitet. – Arkham

Antwort

0

Ich bin nicht sicher über die genaue Format Ihrer Daten, aber Sie können nicht einfach verschiedene Klassifizierer verschmelzen. Der Naive Bayes-Klassifikator speichert basierend auf den Daten, auf denen er trainiert wurde, eine Wahrscheinlichkeitsverteilung, und Sie können Wahrscheinlichkeitsverteilungen ohne Zugriff auf die Originaldaten nicht zusammenführen.

Wenn Sie sich den Quellcode hier: http://www.nltk.org/_modules/nltk/classify/naivebayes.html eine Instanz der Klassifikator speichert:

self._label_probdist = label_probdist 
self._feature_probdist = feature_probdist 

diese im Zug Verfahren berechneten relativen Häufigkeiten verwendet. (zB P (L_1) = (# von L1 im Trainingssatz)/(# Labels im Trainingssatz) Um die beiden zu kombinieren, möchten Sie (# von L1 in Train 1 + Train 2)/(# von Labels) erhalten in T1 + T2)

Allerdings ist das naive bayes-Verfahren nicht zu schwer von Grund auf neu zu implementieren, vor allem, wenn Sie dem 'train'-Quellcode im obigen Link folgen.Hier finden Sie einen Überblick mit der NaiveBayes-Quelle

Code
  1. Store 'FreqDist' Objekte für jede Teilmenge der Daten für die Etiketten und Funktionen.

    label_freqdist = FreqDist() 
    feature_freqdist = defaultdict(FreqDist) 
    feature_values = defaultdict(set) 
    fnames = set() 
    
    # Count up how many times each feature value occurred, given 
    # the label and featurename. 
    for featureset, label in labeled_featuresets: 
        label_freqdist[label] += 1 
        for fname, fval in featureset.items(): 
         # Increment freq(fval|label, fname) 
         feature_freqdist[label, fname][fval] += 1 
         # Record that fname can take the value fval. 
         feature_values[fname].add(fval) 
         # Keep a list of all feature names. 
         fnames.add(fname) 
    
    # If a feature didn't have a value given for an instance, then 
    # we assume that it gets the implicit value 'None.' This loop 
    # counts up the number of 'missing' feature values for each 
    # (label,fname) pair, and increments the count of the fval 
    # 'None' by that amount. 
    for label in label_freqdist: 
        num_samples = label_freqdist[label] 
        for fname in fnames: 
         count = feature_freqdist[label, fname].N() 
         # Only add a None key when necessary, i.e. if there are 
         # any samples with feature 'fname' missing. 
         if num_samples - count > 0: 
          feature_freqdist[label, fname][None] += num_samples - count 
          feature_values[fname].add(None) 
    # Use pickle to store label_freqdist, feature_freqdist,feature_values 
    
  2. Kombinieren Sie diejenigen, die ihre eingebaute 'add'-Methode verwenden. Dadurch können Sie die relative Häufigkeit für alle Daten ermitteln.

    all_label_freqdist = FreqDist() 
    all_feature_freqdist = defaultdict(FreqDist) 
    all_feature_values = defaultdict(set) 
    
    for file in train_labels: 
        f = open(file,"rb") 
        all_label_freqdist += pickle.load(f) 
        f.close() 
    
    # Combine the default dicts for features similarly 
    
  3. Verwenden Sie den 'Schätzer', um eine Wahrscheinlichkeitsverteilung zu erstellen.

    estimator = ELEProbDist() 
    
    label_probdist = estimator(all_label_freqdist) 
    
    # Create the P(fval|label, fname) distribution 
    feature_probdist = {} 
    for ((label, fname), freqdist) in all_feature_freqdist.items(): 
        probdist = estimator(freqdist, bins=len(all_feature_values[fname])) 
        feature_probdist[label, fname] = probdist 
    
    classifier = NaiveBayesClassifier(label_probdist, feature_probdist) 
    

Der Klassifikator werden die Zählungen über alle Daten nicht kombinieren und produzieren, was Sie brauchen.