2013-03-07 10 views
5

Mit Mahout kann ich das Sentiment von Daten klassifizieren. Aber ich stecke mit einer Konfusionsmatrix fest.Mahout für die Sentimentanalyse

Ich benutze Mahout 0.7 Naive Bayes Algorithmen, um das Sentiment von Tweets zu klassifizieren. Ich benutze trainnb und testnb Naive Bayes Klassifikatoren, um den Klassifikator zu trainieren und das Sentiment von Tweets als 'positiv', 'negativ' oder 'neutral' zu klassifizieren.

Probe positiv Ausbildung

 'positive','i love my i phone' 
     'positive' , it's pleasure to have i phone' 

Ähnlich eingestellt habe ich vorbereitet Trainingsproben negativer und neutral, ist es ein großer Datensatz.

Die Beispiel-Testdaten Tweets, die ich zur Verfügung stelle, sind ohne Sentimentation.

'it is nice model' 
    'simply fantastic ' 

Ich kann den Mahout Klassifikationsalgorithmus auszuführen, und es gibt Ausgabe von klassifizierten Instanzen als Konfusionsmatrix.

Im nächsten Schritt muss ich herausfinden, welche Tweets positive Stimmung zeigen und welche negativ sind. erwartete Ausgabe mit Klassifizierung: um Text mit der Stimmung zu markieren.

 'negative','very bad btr life time' 
     'positive' , 'i phone has excellent design features' 

In Mahout welchen Algorithmus muss ich implementieren, um Ausgabe in dem obigen Format zu erhalten. oder eine benutzerdefinierte Quellenimplementierung ist erforderlich.

Zum Anzeigen von Daten 'freundlicherweise' schlagen Sie mir Algorithmen, die Apache Mahout bietet, die für meine Twitter-Daten-Sentiment-Analyse geeignet sein wird.

Antwort

3

Im Allgemeinen, um etwas Text zu klassifizieren, müssen Sie Naive Bayes mit verschiedenen Prioren (positiv und negativ in Ihrem Fall) ausführen und dann einfach diejenige auswählen, die einen größeren Wert ergibt.

This excerpt aus dem Mahout Buch hat einige Beispiele. Siehe Liste 2:

Parameters p = new Parameters(); 
p.set("basePath", modelDir.getCanonicalPath());9 
Datastore ds = new InMemoryBayesDatastore(p); 
Algorithm a = new BayesAlgorithm(); 
ClassifierContext ctx = new ClassifierContext(a,ds); 
ctx.initialize(); 

.... 

ClassifierResult result = ctx.classifyDocument(tokens, defaultCategory); 

Hier sollte Ergebnis entweder "positiv" oder "negativ" Label enthalten.

1

Ich bin mir nicht sicher, ob ich Ihnen in vollem Umfang helfen kann, aber ich hoffe, dass ich Ihnen einige Einstiegspunkte geben kann. Im Allgemeinen wäre mein Rat für Sie, Mahouts Quellcode herunterzuladen und zu sehen, wie Beispiele und Zielklassen implementiert werden. Das ist nicht so einfach, aber Sie sollten bereit sein, dass Mahout keine einfachen Eingangstüren hat. Aber sobald Sie sie betreten, wird die Lernkurve schnell sein.

Zuerst hängt es von der Version von Mahout ab, die Sie verwenden. Ich benutze 0,7 selbst, meine Erklärung wird 0,7 sein.

public void classify(String modelLocation, RawEntry unclassifiedInstanceRaw) throws IOException { 

    Configuration conf = new Configuration(); 

    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelLocation), conf); 
    AbstractNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(model); 

    String unclassifiedInstanceFeatures = RawEntry.toNaiveBayesTrainingFormat(unclassifiedInstanceRaw); 

    FeatureVectorEncoder vectorEncoder = new AdaptiveWordValueEncoder("features"); 
    vectorEncoder.setProbes(1); // my features vectors are tiny 

    Vector unclassifiedInstanceVector = new RandomAccessSparseVector(unclassifiedInstanceFeatures.split(" ").length()); 

    for (String feature: unclassifiedInstanceFeatures) { 
     vectorEncoder.addToVector(feature, unclassifiedInstanceVector); 
    } 

    Vector classificationResult = classifier.classifyFull(unclassifiedInstanceVector); 

    System.out.println(classificationResult.asFormatString()); 

} 

Was hier passiert:

1) Zuerst Sie das Modell Sie, indem Sie trainnb bekam laden. Dieses Modell wurde an der Stelle gespeichert, an der Sie den Parameter -o beim Aufruf von trainnb angegeben haben. Modell ist die .bin-Datei.

2) StandardNaiveBayesClassifier erstellt Ihr Modell mit

3) RawEntry ist meine benutzerdefinierte Klasse, die nur ein Wrapper um rohe Zeichenkette meiner Daten ist. toNaiveBayesTrainingFormar nimmt die Zeichenfolge, die ich klassifizieren möchte, entfernt Rauschen basierend auf meinen Bedürfnissen und gibt einfach eine Zeichenfolge mit den Merkmalen 'word1 word2 word3 word4' zurück. Also wurde meine nicht klassifizierte rohe Saite in ein anwendbares Format für die Klassifizierung umgewandelt.

4) muss nun Reihe von Funktionen wie Mahout Vectors codiert werden, da Eingang Klassifikator nur in Vector

ist

setzen 5) Vektor-Klassifikator - Magie.

Dies ist der erste Teil. Jetzt gibt der Klassifikator Ihnen den Vektor zurück, der Klassen (Sentiments in Ihrem Fall) mit Wahrscheinlichkeiten enthält. Sie möchten eine bestimmte Ausgabe. Die direkteste umzusetzen (aber ich nehme nicht die effizienteste und stilvoll) zu tun wäre, nächste: Sie

1) erstellen Karte Job reduzieren, die alle Daten durchlaufen Sie

2) Für jede klassifizieren wollen Instanz, die Sie Methode klassifizieren nennen (nicht vergessen, einige Änderungen nicht zu tun StandardNaiveBayesClassifier für jede Instanz erstellen) Sie

Job reduzieren im Kartenausgabedaten in welchem ​​Format auch immer Sie whish können

3) Klassifizierungsergebnis Vektor 4) Nützliche Einstellung hier ist jC.set ("mapreduce.textoutputformat.separator", ""); Wo jC ist JobConf. Auf diese Weise können Sie das Trennzeichen für Ihre Ausgabedatei von mapreduce job auswählen. In Ihrem Fall ist das ",".

Auch dies gilt alles für Mahout 0.7. Nein, garantiert, dass es für Sie so funktioniert wie es ist. Es hat aber für mich funktioniert.

Im Allgemeinen habe ich nie mit Mahout von der Kommandozeile aus gearbeitet und für mich ist Mahout von Java der Weg zu gehen.

Verwandte Themen