Seite 1 von 1

Probabilistisches diktionär mit naive bayes

Verfasst: Fr Okt 27, 2017 12:30 pm
von Hadsga
Hi,

ich möchte eine automatisierte Inhaltsanalyse mit einem naive bayes Klassifikator durchführen. Die Inhaltsanalyse umfasst insgesamt 10000 Dokumente. Das Ziel ist es den Klassifikator mit einigen vorkodierten Dokumenten zu trainieren. Wie viele Dokumente dafür nötig sind, ist im Vorhinein nicht zu sagen. Ich würde etwa 1000 ansetzten. Das Ziel wäre, dass der Klassifikator in 80% der Fälle richtig liegt. Dafür würde ich die 1000 kodierten Dokumente in eine Training- und ein Test-Set aufteilen. Die Verteilung würde bei 50 zu 50 liegen. Nun gilt es die Features zu identifizieren, die letztendlich zu dem Ergebnis, d.h. der Vorhersage des interessierenden Merkmals beigetragen haben. Das Ganze soll so ähnlich funktionieren wie ein Spam-Filter. Auch ein Spam-Filter weiß aufgrund des Trainingsprozesses was Spam-Mails von nicht Spam-Mails unterscheidet. Anhand dieses probabilistischen Diktonärs sollen dann die verbleibenden 9000 Dokumente kodiert werden.
Hier ein Beispiel. Dies sind 24 Fälle mit einer kodierten Kategorie.

Code: Alles auswählen

glimpse(amazon_test_pragmatic)
Observations: 24
    Variables: 2
    $ Pragmatic  <dbl> 1, 1, -1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
    $ reviewText <chr> "I love this. I have a D800. I am mention my camera to make sure that y...
Ziel ist es die positive Ausprägung der Kategorie "Prgamatic" (Prgamatic > 0) anhand des Review-Textes vorherzusagen. Dazu habe ich folgenden Kode erstellt:

Code: Alles auswählen

   amazon_test_pragmatic$reviewText <- as.factor(amazon_test_pragmatic$reviewText)
    
    amazon_test_pragmatic$positive <- as.factor(amazon_test_pragmatic$Pragmatic > 0)
    
    corpus <- Corpus(VectorSource(amazon_test_pragmatic$reviewText))
    
    clean_corpus <- corpus %>% 
      tm_map(tolower) %>%
      tm_map(removeNumbers) %>%
      tm_map(removePunctuation) %>%
      tm_map(removeWords, c(stopwords("english")))
    
    dtm <- DocumentTermMatrix(clean_corpus)
    
    positive_indicators <- which(amazon_test_pragmatic$positive == TRUE)
    
    negative_indicators <- which(amazon_test_pragmatic$positive == FALSE)
    
    wordcloud(clean_corpus[positive_indicators], min.freq = 10)
    
    wordcloud(clean_corpus[negative_indicators], min.freq = 10)
    
    prgamatic_train <- amazon_test_pragmatic[1:12,]
    pragmatic_test <- amazon_test_pragmatic[13:24,]
    
    dtm_train <- dtm[1:12,]
    dtm_test <- dtm[13:24,]
    corpus_train <- clean_corpus[1:12]
    corpus_test <- clean_corpus[13:24]
    
    positive <- subset(pragmatic_train, positive == T)
    negative <- subset(pragmatic_train, positive == F)
    
    freq_words <- findFreqTerms(dtm_train, 3)
    
    
    positive_train <- DocumentTermMatrix(corpus_train, control = list (directory = freq_words))
    positive_test <- DocumentTermMatrix(corpus_test, control = list (directrory = freq_words))
    
    convert_count <- function(x) {
      y <- ifelse(x > 0, 1,0)
      y <- factor(y, levels=c(0,1), labels=c("No", "Yes"))
      y
    }
    
    positive_train <- apply(positive_train, 2, convert_count)
    positive_test <- apply(positive_test, 2, convert_count)
    
    classifier <- naiveBayes(positive_train, factor(pragmatic_train$positive))
                                                  
    test_pred <- predict(classifier, newdata = positive_test)
    table(test_pred, pragmatic_train$positive)
    
    test_pred FALSE TRUE
        FALSE     0    0
        TRUE      3    9
Das Problem ist nun, dass ich nicht weiß, welche Features zu diesem Ergebnis in welchem Ausmaß beigetragen haben. Hat jemand eine Idee? Danke.