情感分析是德语中的天真贝叶斯



我对天真的贝叶斯算法有问题,我无法找出原因。我尝试了一个在线教程,因此一开始我开始创建一些培训数据。在下面的代码中,我只使用了很少的培训数据,但这是同样的问题。

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

这就是结果:即使我所有的输入都非常积极(我更改了它们(,一切都消失了。

     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,最终始终为Negativ:/

您缺少培训数据。如果我运行您的代码,我会得到

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

因此,只有前两个要素是错误的 - 最后三个确实应该是负面的,后的和负面的。如果我们查看分类器信息,如果在 feinde sind doof 中发现的单词我们找到

                             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。尝试将其提供更多信息,而您要预测的单词之间存在重叠,并且应该起作用。


Update 如果您运行

> 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的人页面,您会获得高斯手段和SD。您可以得到这样的条件概率:

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(lieb |阳性(概率,您需要贝叶斯公式以颠倒概率。

Google"零问题"one_answers"幼稚贝叶斯",以获取训练和测试零件中的单词不存在的指示(请参阅laplace参数(。

最新更新