我想对德语推文进行情绪分析。我使用的代码适用于英语,但是当我加载德语单词列表时,所有分数只是结果为零。据我所知,它必须与单词列表的不同结构有关。所以我需要知道的是,如何使我的代码适应德语单词列表的结构。有人可以看看这两个清单吗?
English Wordlist
German Wordlist
# load the wordlists
pos.words = scan("~/positive-words.txt",what='character', comment.char=';')
neg.words = scan("~/negative-words.txt",what='character', comment.char=';')
# bring in the sentiment analysis algorithm
# we got a vector of sentences. plyr will handle a list or a vector as an "l"
# we want a simple array of scores back, so we use "l" + "a" + "ply" = laply:
score.sentiment = function(sentences, pos.words, neg.words, .progress='none')
{
require(plyr)
require(stringr)
scores = laply(sentences, function(sentence, pos.words, neg.words)
{
# clean up sentences with R's regex-driven global substitute, gsub():
sentence = gsub('[[:punct:]]', '', sentence)
sentence = gsub('[[:cntrl:]]', '', sentence)
sentence = gsub('\\d+', '', sentence)
# and convert to lower case:
sentence = tolower(sentence)
# split into words. str_split is in the stringr package
word.list = str_split(sentence, '\\s+')
# sometimes a list() is one level of hierarchy too much
words = unlist(word.list)
# compare our words to the dictionaries of positive & negative terms
pos.matches = match(words, pos.words)
neg.matches = match(words, neg.words)
# match() returns the position of the matched term or NA
# we just want a TRUE/FALSE:
pos.matches = !is.na(pos.matches)
neg.matches = !is.na(neg.matches)
# and conveniently enough, TRUE/FALSE will be treated as 1/0 by sum():
score = sum(pos.matches) - sum(neg.matches)
return(score)
},
pos.words, neg.words, .progress=.progress )
scores.df = data.frame(score=scores, text=sentences)
return(scores.df)
}
# and to see if it works, there should be a score...either in German or in English
sample = c("ich liebe dich. du bist wunderbar","I hate you. Die!");sample
test.sample = score.sentiment(sample, pos.words, neg.words);test.sample
答案 0 :(得分:3)
这可能对您有用:
readAndflattenSentiWS <- function(filename) {
words = readLines(filename, encoding="UTF-8")
words <- sub("\\|[A-Z]+\t[0-9.-]+\t?", ",", words)
words <- unlist(strsplit(words, ","))
words <- tolower(words)
return(words)
}
pos.words <- c(scan("positive-words.txt",what='character', comment.char=';', quiet=T),
readAndflattenSentiWS("SentiWS_v1.8c_Positive.txt"))
neg.words <- c(scan("negative-words.txt",what='character', comment.char=';', quiet=T),
readAndflattenSentiWS("SentiWS_v1.8c_Negative.txt"))
score.sentiment = function(sentences, pos.words, neg.words, .progress='none') {
# ... see OP ...
}
sample <- c("ich liebe dich. du bist wunderbar",
"Ich hasse dich, geh sterben!",
"i love you. you are wonderful.",
"i hate you, die.")
(test.sample <- score.sentiment(sample,
pos.words,
neg.words))
# score text
# 1 2 ich liebe dich. du bist wunderbar
# 2 -2 ich hasse dich, geh sterben!
# 3 2 i love you. you are wonderful.
# 4 -2 i hate you, die.
答案 1 :(得分:2)
在德国名单中,列表中包含以下名称: SentiWS_v1.8c_Negative.txt和SentiWS_v1.8c_Positive.txt 没有加载方式,这仅适用于英文版本:
pos.words = scan("~/positive-words.txt",what='character', comment.char=';')
neg.words = scan("~/negative-words.txt",what='character', comment.char=';')
除此之外,名单的格式不同:
德语版就是这样:
Abbau|NN -0.058 Abbaus,Abbaues,Abbauen,Abbaue
Abbruch|NN -0.0048 Abbruches,Abbrüche,Abbruchs,Abbrüchen
Abdankung|NN -0.0048 Abdankungen
Abdämpfung|NN -0.0048 Abdämpfungen
Abfall|NN -0.0048 Abfalles,Abfälle,Abfalls,Abfällen
Abfuhr|NN -0.3367 Abfuhren
英文版:
魅力
慈善
魅力
迷人
迷人
纯洁
便宜
最便宜的
德国人遵循这种模式:word|NN\tnumber <similar words comma separated>\n
英语版本遵循这种模式word\n
每个文档的标题都不同,所以你可能想跳过标题(在英文列表中似乎是一篇文章,而不是推文或推文的文字)
解决方案,让两个文件的格式相同,然后做任何你想做的事情或准备你的代码来读取两种类型的数据。
现在您的程序适用于英文版本,因此我建议您更改德语列表的格式。您可以更改\n
的每个空格或逗号,然后删除所有| NN和数字。