2013-03-07 19 views
5

Za pomocą korby mogę sklasyfikować sentyment danych. Ale utknąłem z matrycą nieporozumień.Mahout do analizy sentymentów

Używam algorytmów naiwnej bayernu 0,7 do klasyfikacji sentencji tweetów. Używam klasyfikatorów naiwnych typu trainnb i testnb do szkolenia klasyfikatora i klasyfikowania sentencji tweetów jako "pozytywnych", "negatywnych" lub "neutralnych".

próbki dodatnie treningowych

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

Podobnie I przygotowanych próbek treningowych ujemnego i neutralne, jest ogromna zestaw danych.

Podane przeze mnie tweety z danymi testowymi nie zawierają sentymentów.

'it is nice model' 
    'simply fantastic ' 

Jestem w stanie uruchomić algorytm klasyfikacji mahout i daje wynik sklasyfikowanych wystąpień jako macierz zamieszania.

Następnym krokiem muszę sprawdzić, które tweety wykazują pozytywne nastroje, a które są ujemne. oczekiwane wyniki przy użyciu klasyfikacji: do oznaczania tekstu za pomocą sentencji.

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

Na który algorytm muszę zaimplementować, aby uzyskać wyjście w powyższym formacie. lub wymagana jest dowolna niestandardowa implementacja źródła.

Aby wyświetlić dane "uprzejmie" sugerują mi algorytmy, które zapewnia apache mahout, które będą odpowiednie do analizy nastrojów danych Twittera.

Odpowiedz

3

Ogólnie rzecz biorąc, aby sklasyfikować jakiś tekst, musisz uruchomić Naive Bayes z różnymi wersjami (pozytywny i negatywny w twoim przypadku), a następnie wybrać ten, który daje większą wartość.

This excerpt z książki Mahouta ma kilka przykładów. Patrz: listing 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); 

Tutaj wynik powinien zawierać etykietę "dodatnią" lub "negatywną".

1

Nie jestem pewien, czy będę w stanie ci w pełni pomóc, ale mam nadzieję, że będę mógł podać ci kilka punktów. Ogólnie, moja rada dla ciebie polegałaby na pobraniu kodu źródłowego Mahouta i zobaczeniu, jak zaimplementowane są przykłady i klasy docelowe. To nie jest takie łatwe, ale powinieneś być gotowy na to, że Mahout nie ma łatwych drzwi wejściowych. Ale gdy je wprowadzisz, krzywa uczenia się będzie szybka.

Po pierwsze, zależy to od wersji użytego Mahouta. Używam samego 0,7, więc moje wyjaśnienie dotyczy 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()); 

} 

Co się dzieje tutaj:

1) Po pierwsze, należy załadować model, który dostał wykonując trainnb. Ten model został zapisany w miejscu określonym przez parametr -o podczas wywoływania trainnb. Model to plik .bin.

2) StandardNaiveBayesClassifier jest tworzony przy użyciu modelu

3) RawEntry jest mój zwyczaj klasa, która jest po prostu otoki wokół surowego ciąg moich danych. toNaiveBayesTrainingFormar pobiera ciąg, który chcę sklasyfikować, usuwa z niego szum w oparciu o moje potrzeby i po prostu zwraca ciąg funkcji "słowo1 słowo2 słowo3 słowo4". Tak więc mój niesklasyfikowany nieprzetworzony ciąg został przekonwertowany na odpowiedni format dla klasyfikacji.

4) Teraz ciąg funkcji musi być zakodowany jako Kornak wektorowymi, ponieważ wejście jest tylko w klasyfikator Vector

5) Przeciągnij wektor do klasyfikatora - magię.

To jest pierwsza część. Klasyfikator zwraca teraz wektor, który zawiera klasy (uczucia w twoim przypadku) z prawdopodobieństwami. Chcesz konkretnych wyników. Najprostszym wdrożyć (ale nie zakładamy najbardziej wydajny i stylowy) byłoby dalej:

1) utworzyć mapę zmniejszyć pracę, która przechodzi przez wszystkie dane, które chcesz sklasyfikować

2) dla każdego instancja zadzwonić klasyfikować metody (nie zapomnij zrobić kilka zmian, aby nie tworzyć StandardNaiveBayesClassifier dla każdej instancji)

3) Mając na wynik klasyfikacji wektor można dane wyjściowe w dowolnym formacie Państwo zażyczyć w swojej mapie zmniejszyć praca

4) Przydatne tutaj ustawienie to jC.set ("mapreduce.textoutputformat.separator", ""); gdzie jC to JobConf. Pozwala to wybrać separator dla pliku wyjściowego z zadania mapreduce. W twoim przypadku jest to ",".

To samo dotyczy Mahouta 0.7. Żadnych gwarancji, że będzie działać tak jak jest. Dla mnie to zadziałało.

Ogólnie rzecz biorąc, nigdy nie pracowałem z Mahoutem z linii poleceń, a dla mnie Mahout z Java jest drogą do zrobienia.