德语的 R 朴素贝叶斯情感分析
Sentiment Analysis R Naive Bayes in german
我在使用朴素贝叶斯算法时遇到了问题,但我无法找出原因。我尝试了一个在线教程,所以一开始我就开始创建一些训练数据。在下面的代码中,我只使用了很少的训练数据,但这是同样的问题。
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 并且最终总是负数:/
您缺少训练数据。如果我 运行 你的代码我得到
> 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
。尝试在您要预测的单词之间存在重叠且它应该起作用的地方提供更多信息。
更新 如果你运行
> 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
然后就可以看到个体的概率了。适合您的 "problem" 是输入被读取为数字(而不是二进制因子),因此您不会看到(按行)加起来为 1 的条件概率。根据 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(lieb|positive) 概率,您需要使用贝叶斯公式来反转概率。
Google "zero problem" 和 "naive bayes" 以获得在训练和测试部分都不存在单词时进行轻微改进的指导(参见 laplace
参数).
我在使用朴素贝叶斯算法时遇到了问题,但我无法找出原因。我尝试了一个在线教程,所以一开始我就开始创建一些训练数据。在下面的代码中,我只使用了很少的训练数据,但这是同样的问题。
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 并且最终总是负数:/
您缺少训练数据。如果我 运行 你的代码我得到
> 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
。尝试在您要预测的单词之间存在重叠且它应该起作用的地方提供更多信息。
更新 如果你运行
> 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
然后就可以看到个体的概率了。适合您的 "problem" 是输入被读取为数字(而不是二进制因子),因此您不会看到(按行)加起来为 1 的条件概率。根据 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(lieb|positive) 概率,您需要使用贝叶斯公式来反转概率。
Google "zero problem" 和 "naive bayes" 以获得在训练和测试部分都不存在单词时进行轻微改进的指导(参见 laplace
参数).