2017-06-05 2 views
1

J'ai un problème avec l'algorithme des bayes naïfs et je ne suis pas capable de trouver pourquoi. J'ai essayé un tutoriel en ligne et donc au début j'ai commencé à créer des données d'entraînement. Dans le code ci-dessous, j'utilise juste très peu de données d'entraînement, mais c'est le même problème.Analyse de sentiment R Naive Bayes en allemand

pos_tweets = rbind(
    c('Ich liebe das auto', 'positive'), 
    c('Diese Aussicht ist großartig', 'positive'), 
    c('toller morgen', 'positive'), 
    c('ich freue mich so', 'positive'), 
    c('du bist aber lieb, danke', 'positive') 
) 

neg_tweets = rbind(
    c('ich hasse autos', 'negative'), 
    c('der blick ist horror', 'negative'), 
    c('voll müde heute', 'negative'), 
    c('schreckliche stille', 'negative'), 
    c('er ist ein feind', 'negative') 
) 

test_tweets = rbind(
    c('Schöne Momente erlebt', 'positive'), 
    c('zusammen macht es gleich doppelt spass', 'positive'), 
    c('Yeah, toller Tag', 'positive'), 
    c('Super schöne Umgebung', 'positive'), 
    c('es zieht ein leichter wind auf, sehr angenehm', 'positive') 
) 

tweetsbind = rbind(pos_tweets, neg_tweets, test_tweets) 

matrix1= create_matrix(tweetsbind[,1], language="german", 
         removeStopwords=FALSE, removeNumbers=TRUE, 
         stemWords=FALSE) 
mat1 = as.matrix(matrix1) 

Maintenant, je former mon modèle:

classifier1 = naiveBayes(mat1[1:10,], as.factor(tweetsbind[1:10,2])) 

Et maintenant, je veux l'utiliser:

predicted = predict(classifier1, mat1[11:15,]); predicted 

Quand je regarde dans mon modèle il l'air assez bon, parce que les mots négatifs sont marqués comme négatifs et les positifs comme positifs. Mais en utilisant le modèle pour analyser les données de test, il ne sort que des résultats négatifs, même lorsque les instructions sont évidemment positives et que le mot utilisé existe également dans l'ensemble d'apprentissage.


Mon nouveau code est:

# search for some twitter data 
happy <- searchTwitter(":)",n = 10000, lang ='de') 
happy_text <- sapply(happy, function (x) x$getText()) 
sad <- searchTwitter(":(",n = 10000, lang ='de') 
sad_text <- sapply(sad, function (x) x$getText()) 

# create the matrix 
tweets <- rbind(sad_text[1:2500,], happy_text[1:2500,]) # if I use more training data, I get a storage error 
tweet <- as.matrix(tweets) 
matrix= create_matrix(tweet[,2], language= "german", removeStopwords=FALSE, removeNumbers=TRUE, stemWords=FALSE) 
matrixdoc = as.matrix(matrix) 

# transform to factor and train the model 
X <- as.data.frame(matrixdoc[1:5000,]) 
X$out <- as.factor(tweet[1:5000,3]) 
X <- as.data.frame(lapply(X, factor)) 
classifierstack <- naiveBayes(out ~ ., data=X) 

# predict 
predicted = predict(classifierstack, mat1[11:15,],type = "raw") 

Et voici le résultat: tout ist negativ, même si toutes mes entrées sont très positiv (je les ai changé).

 negativ  positiv 
[1,]  1 5.828223e-176 
[2,]  1 4.110223e-244 
[3,]  1 3.274458e-244 
[4,]  1 3.534996e-176 
[5,]  1 0.000000e+00 

Et si j'essaie ceci:

> predict(classifierstack, "zeigt", type = "raw") 
    negativ positiv 
[1,]  0.5  0.5 

-> il sort toujours de 0,5 à 0,5 et est finalement toujours negativ:/

+0

Utilisez-vous le 'naiveBayes' du paquet' e1071'? – ekstroem

+0

Oui, j'utilise le paquet e1071 –

+0

Votre mise à jour n'est pas reproductible, donc ne peut pas voir ce qui ne va pas avec vos données. Qu'est-ce que 'testS'? Avez-vous obtenu les mêmes résultats que ci-dessous sur vos données/questions d'origine? – ekstroem

Répondre

0

Vous manquiez des données de formation. Si je lance votre code je reçois

> predicted = predict(classifier1, mat1[11:15,]); predicted 
[1] negative negative negative positive negative 
Levels: negative positive 

Alors que les deux premiers éléments sont mal - les trois derniers devraient en effet être négatif, postive et négative. Si nous regardons les informations de classificateur pour les mots trouvés dans, disons, sind Feinde Doof nous trouvons

       feinde 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

           sind 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

           doof 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

est donc il n'y a vraiment pas d'informations pour classer et valeur par défaut de la première catégorie de niveau, negative. Essayez de nourrir plus d'informations là où il y a un chevauchement entre les mots que vous voulez prédire et cela devrait fonctionner.


Mise à jour Si vous exécutez

> predicted = predict(classifier1, mat1[11:15,], type="raw"); predicted 
     negative  positive 
[1,] 9.999959e-01 4.093637e-06 
[2,] 7.329224e-01 2.670776e-01 
[3,] 1.000000e+00 4.598781e-11 
[4,] 9.898881e-05 9.999010e-01 
[5,] 1.000000e+00 1.608783e-16 

alors vous pouvez voir les probabilités individuelles. Le "problème" de votre ajustement est que l'entrée est lue comme étant numérique (et non comme des facteurs binaires) de sorte que vous ne verrez pas de probabilités conditionnelles qui (additionnelles) vont jusqu'à un. Selon la page de manuel pour naiveBayes vous obtenez des moyens gaussiens et sds.Vous pouvez obtenir les probabilités conditionnelles comme ceci:

X <- as.data.frame(mat1[1:10,]) 
X$out <- as.factor(tweetsbind[1:10,2]) 
X <- as.data.frame(lapply(X, factor)) 
naiveBayes(out ~ ., data=X) 

Cela vous donnera

  hab 
Y   0 
    negative 1 
    positive 1 
      dich 
Y   0 
    negative 1 
    positive 1 
      lieb 
Y   0 1 
    negative 1.0 0.0 
    positive 0.8 0.2 

Ce sont les P (Lieb | positifs) probabilités et vous devez vous formule de Bayes pour inverser les probabilités.

Google "zéro problème" et "bayes naïves" pour obtenir des directions pour faire de légères améliorations lorsque les mots ne sont pas présents dans les deux parties d'entraînement et de test (voir l'argument laplace).

+0

Merci beaucoup pour votre réponse, cela m'a déjà beaucoup aidé! Le cas que vous avez expliqué je comprends :) mais si vous regardez la phrase "c ('hab dich lieb', 'positif') alors normalement" lieb "devrait être positif parce que l'ensemble d'entraînement comprend la phrase: c ('du bist aber lieb, danke ',' positive ') Donc je ne comprends pas pourquoi l'algorithme retourne cette phrase est négative? lieb asfactor (tweetsbind [1:10, 2]) [, 1] [, 2] négatif 0.0 0.0000000 positif 0.2 0.4472136 –

+0

Oui, mais vous avez deux mots qui n'améliorent pas la probabilité Je vais mettre à jour la réponse – ekstroem

+0

Merci, mais si j'utilise votre code, je ne reçois que des résultats négatifs (et j'ai même essayé avec 5000 tweets de données d'entraînement > prédit negativ positiv [1,] 1 2.610912e-223 [2,] 1 1.147911e-223 [3], 1 2.610912e-223 [4,] 1 2.610912e-223 [5,] 1 8,703038 e-224 –