2017-06-05 135 views
1

我有一个天真的贝叶斯算法的问题,我无法找出原因。我尝试了一个在线教程,开始时我开始创建一些培训数据。在下面的代码中,我只用了很少的训练数据,但它是同样的问题。情绪分析R德语朴素贝叶斯

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) 

现在我训练我的模型:

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

,现在我想使用它:

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

当我看着我的模型看起来相当不错的,因为否定词标记为否定,正面为正面。

虽然使用该模型分析测试数据,但它只输出负数,即使语句显然是正数,并且使用的词也存在于训练集中。


我的新代码是:

# 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") 

这是结果:一切IST是负面的,即使我所有的投入都非常positiv(我改变了他们)。

 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 

如果我试试这个:

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

- >它总是输出0.5 0.5,终于永远是负面的:/

+0

您是否使用'e1071'包装中的'naiveBayes'? – ekstroem

+0

是的,我正在使用e1071软件包 –

+0

您的更新无法重现,因此看不清您的数据出了什么问题。什么是'testS'?你在原始数据/问题上得到了与以下相同的结果吗? – ekstroem

回答

0

你缺乏训练数据。如果我运行代码,我得到

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

所以只有前两个元素是错误的 - 过去三年确实应该是否定的,正负。如果我们看一下在发现,说的话的分类信息,feinde信德笨蛋我们发现

       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 

所以真的是没有的信息进行分类,则默认为第一级类别,negative。试着为它提供更多的信息,在你想要预测的单词之间存在重叠并且它应该起作用。


更新如果运行

> 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 

然后就可以看到各个概率。适合的“问题”是输入被读作数字(而不是二进制因子),所以你不会看到(按行)加起来的条件概率。根据naiveBayes的手册页,您可以获得高斯平均值和sds。你可以得到的条件概率是这样的:

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) 

这会给你

  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 

这些都是P(利布|阳性)的概率,你需要你贝叶斯公式反转概率。

谷歌的“零问题”和“朴素贝叶斯”可以在训练和测试部分中不存在单词时进行轻微改进(参见laplace参数)。

+0

非常感谢你的回答,它已经帮了我很多! 你解释的情况我明白了:)但如果你看看句子“c('hab dich lieb','positive'),那么通常”lieb“应该是积极的,因为训练集包括了句子:c('du bist所以我不明白为什么算法返回这个句子是负数? lieb as.factor(tweetsbind [1:10,2])[,1] [, 2] 负0.0 0.0000000 正数0.2 0.4472136 –

+0

是的,但是你有两个单词不会提高概率,我会更新答案 – ekstroem

+0

谢谢,但是如果我使用你的代码,我只会得到负面结果(我甚至试用了5000个训练数据推文。 >预测 是负面positiv [1,] 1 2.610912e-223 [2,1] 1 1.147911e-223 [3,] 1 2.610912e-223 [4,] 1 2.610912e-223 [5,1] 1 8.703038 e-224 –