2016-04-30 8 views
0

Wie können wir einen funktionierenden Klassifikator für die Sentiment-Analyse machen, da wir dafür unseren Klassifikator auf riesigen Datenmengen trainieren müssen.Sentiment Analysis Klassifizierer mit maschinellem Lernen

Ich habe die riesige Datenmenge zu trainieren, aber das Klassifikator-Objekt (hier mit Python), gibt einen Speicherfehler bei der Verwendung von 3000 Wörtern. Und ich muss für mehr als 100K Wörter trainieren.

Was ich dachte war, den riesigen Datensatz in kleinere Teile zu teilen und ein Klassifikatorobjekt für jedes zu machen und es in einer Beißdatei zu speichern und sie alle zu verwenden. Aber es scheint, dass die Verwendung des gesamten Klassifikatorobjekts zum Testen nicht möglich ist, da nur eines der Objekte während des Testens benötigt wird. Die Lösung, die mir in den Sinn kommt, ist entweder, alle gespeicherten Klassifikatorobjekte zu kombinieren, die in der Pickle-Datei gespeichert sind (was gerade nicht passiert), oder das gleiche Objekt mit einem neuen Trainingssatz anzuhängen (aber das ist es auch wieder) überschrieben und nicht angehängt werden).

Ich weiß nicht warum, aber ich konnte keine Lösung für dieses Problem finden, auch wenn es die Basis des maschinellen Lernens ist. Jedes maschinelle Lernprojekt muss in einem großen Datensatz trainiert werden, und die Objektgröße für das Training dieser Datensätze führt immer zu einem Speicherfehler.

Also, wie um dieses Problem zu lösen? Ich bin offen für jede Lösung, würde aber gern hören, was von Menschen verfolgt wird, die in Echtzeit Lernprojekte durchführen.

Code Snippet:

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 

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) 

PS: Ich bin mit dem NLTK Toolkit NaiveBayes verwenden. Mein Trainingsdatensatz wird geöffnet und in der documents gespeichert.

Antwort

1

Es gibt zwei Dinge, die Sie scheinen zu fehlen:

  1. Datensätze für Text sind in der Regel äußerst spärlich, und man sollte sie als schwach besetzte Matrizen speichern. Für eine solche Darstellung sollten Sie in der Lage sein, Millionen von Dokumenten in Ihrem Speicher mit vocab zu speichern. von 100.000.

  2. Viele moderne Lernmethoden werden im Mini-Batch-Szenario trainiert, dh Sie brauchen nie einen ganzen Datensatz im Speicher, sondern füttern ihn mit zufälligen Teilmengen an das Modell - trainieren aber trotzdem ein einzelnes Modell. Auf diese Weise kann Ihr Datensatz beliebig groß sein, der Speicherverbrauch ist konstant (festgelegt durch die Minibatch-Größe) und nur die Trainingszeit wird mit der Anzahl der Samples skaliert.

+0

Ich habe meine Textdaten in Form von Dokumenten. Jedes Dokument hat ein paar Sätze. So habe ich Tausende von Dokumenten. Das Durcharbeiten all dieser Dokumente ist für mich kein Problem. Aber die Anzahl der Wörter, die ich für das Training wähle, macht es. Wenn ich mehr als 3000 Wörter wähle, beginnt es Wörterbuchfehler zu geben. – Arkham

+0

es gibt keinen "Wörterbuchfehler" - das scheint ein bestimmtes Implementierungsproblem zu sein, daher ist es ohne genauen Code unmöglich, dieses spezifische Problem zu verfolgen. Wie in der Antwort gezeigt - es gibt keine solchen Einschränkungen für moderne ML-Techniken, daher liegt das Problem in Ihrem Code, nicht in ML-Methoden. – lejlot

+0

Ich habe das Code-Snippet gepostet, wo ich 3000 Wörter verwende. – Arkham

Verwandte Themen