2013-03-07 13 views
5

Utilizzo di mahout Sono in grado di classificare il sentimento dei dati. Ma sono bloccato con una matrice di confusione.Mahout per analisi sentimentali

Sto usando gli algoritmi mahout 0.7 naive bayes per classificare il sentimento dei tweet. Io uso trainnb e testnb classificatori naive bayes per addestrare il classificatore e classificare il sentimento di tweet come "positivo", "negativo" o "neutro".

Esempio formazione positivo impostato

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

campioni di training Analogamente ho preparato di negativo e neutro, è un insieme di dati enorme.

I tweet di dati di prova campione che sto fornendo sono senza includere i sentimenti.

'it is nice model' 
    'simply fantastic ' 

sono in grado di eseguire l'algoritmo di classificazione mahout, e dà l'uscita di istanze classificati come matrice di confusione.

Passaggio successivo Devo scoprire quali tweet mostrano un sentimento positivo e quali sono negativi. output previsto utilizzando la classificazione: per taggare il testo con il sentimento.

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

In mahout quale algoritmo è necessario implementare per ottenere l'output nel formato sopra. o è necessaria qualsiasi implementazione di sorgente personalizzata.

Per visualizzare i dati "gentilmente" suggerirmi algoritmi forniti da apache mahout, che saranno adatti per l'analisi del sentiment dei dati di Twitter.

risposta

3

In generale per classificare del testo è necessario eseguire Naive Bayes con diversi priori (positivi e negativi nel tuo caso) e quindi scegliere solo quello che risulta in un valore maggiore.

This excerpt dal libro Mahout ha alcuni esempi. Vedi Listino 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); 

Qui il risultato dovrebbe contenere un'etichetta "positiva" o "negativa".

1

Non sono sicuro di poterti aiutare completamente ma spero di riuscire a darti dei punti di accesso. In generale, il mio consiglio per voi sarebbe quello di scaricare il codice sorgente di Mahout e vedere come vengono implementati esempi e classi target. Non è così facile, ma dovresti essere pronto che Mahout non ha porte di accesso facili. Ma una volta entrati, la curva di apprendimento sarà veloce.

Prima di tutto, dipende dalla versione di Mahout che si sta utilizzando. Sto usando 0.7 me stesso, quindi la mia spiegazione sarà relativa a 0.7.

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()); 

} 

Quello che succede qui:

1) In primo luogo, si carica il modello che hai facendo trainnb. Questo modello è stato salvato dove specificato usando -o parametro mentre si chiama trainnb. Il modello è .bin file.

2) StandardNaiveBayesClassifier viene creata usando il vostro modello

3) RawEntry è la mia classe personalizzata che è solo un wrapper stringa grezza dei miei dati. toNaiveBayesTrainingFormar prende la stringa che voglio classificare, rimuove il rumore da esso in base alle mie esigenze e restituisce semplicemente una stringa di funzioni 'word1 word2 word3 word4'. Quindi, la mia stringa grezza non classificata è stata convertita in formato applicabile per la classificazione.

4) Ora serie di caratteristiche deve essere codificato come vettore di Mahout perché ingresso classificatore è solo in vettoriale

5) Passare vettore per classificatore - magia.

Questa è la prima parte. Ora, il classificatore ti restituisce Vettore che contiene classi (sentimenti nel tuo caso) con probabilità. Vuoi un output specifico. Il più semplice da implementare (ma io non impegna il più efficiente ed elegante) sarebbe quello di fare dopo:

1) Si crea mappa ridurre posti di lavoro che passa per tutti i dati che si desidera classificare

2) Per ogni esempio si chiama il metodo classificare la sostanza (non dimenticate di fare alcuni cambiamenti non creare StandardNaiveBayesClassifier per ogni istanza)

3) Avere risultati della classificazione di vettore potete dati di uscita in qualsiasi formato manifestare l'interesse nella mappa ridurre lavoro

4) L'impostazione utile qui è jC.set ("mapreduce.textoutputformat.separator", ""); dove jC è JobConf. Questo ti permette di scegliere il separatore per il tuo file di output dal lavoro mapreduce. Nel tuo caso questo è ",".

Ancora, questo vale per Mahout 0.7. Non ci sono garanzie che funzionerà per te così com'è. Ha funzionato per me però.

In generale, non ho mai lavorato con Mahout da riga di comando e per me Mahout da Java è la strada da percorrere.