最近,我问了一个关于情绪分析后被省略的条目的问题。我分析的推文并不总是包含在词典中的单词。我想知道哪些是不能翻译的。因此,我想保留这些,即使是零字得分。在我前面的问题中,drop参数是作为解决方案给出的。但是,我想我可能做错了或者遗漏了什么。这是我第一次使用这些技术。
下面的函数接受一个数据框架,并给出一个新的数据框架,其中包含了积极的和消极的词汇以及情感。
输入(故意用荷兰语写一篇文章,这样就不能得分)
id <- c(1, 2, 3)
date <- c("12-05-2021", "12-06-2021", "12-07-2021")
text <- c("Dit is tekst in het Nederlands", "I,m so happy that websites like this exsist", "This icecream tastes terrible. It made me upset")
df <- data.frame(id, date, text)作为输出,我需要的是:
sentiment positive negative
0 0 0
2 2 0
-2 0 2但是我的功能给了我别的东西:
sentimentAnalysis <- function(tweetData){
sentimentDataframe <- data.frame()
for(row in 1:nrow(tweetData)){
tekst <- as.character(tweetData[row, "text"])
positive <- 0
negative <- 0
tokens <- tibble(text = tekst) %>% unnest_tokens(word, text, drop = FALSE)
sentiment <- tokens %>%
inner_join(get_sentiments("bing")) %>%
count(sentiment) %>%
spread(sentiment, n, fill = 0) %>%
mutate(sentiment = positive - negative)
sentimentDataframe <- bind_rows(sentimentDataframe, sentiment)
}
sentimentDataframe[is.na(sentimentDataframe)] <- 0
return(sentimentDataframe)
}这仍然返回一个数据帧,其中未加分数的文本丢失。如您所见,省略了第一个文本:
sentiment positive negative
2 2 0
-2 0 2发布于 2021-07-12 13:00:39
如果在联接后没有返回任何行,则可以返回包含所有0值的tibble。我们可以使用一个if条件来检查这一点。
在句子中只有正反两种情绪的情况下,complete会创建另一行,并将其赋值为0。spread也被pivot_wider取代了,因为spread现在被取代了。
library(tidyverse)
library(tidytext)
map_df(df$text, ~{
tibble(text = .x) %>%
unnest_tokens(word, text, drop = FALSE) %>%
inner_join(get_sentiments("bing")) -> tmp
if(nrow(tmp) == 0) tibble(sentiment = 0, positive = 0, negative = 0)
else {
tmp %>%
count(sentiment) %>%
complete(sentiment = c('positive', 'negative'), fill = list(n = 0)) %>%
pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
mutate(sentiment = positive - negative)
}
}) -> res
res
# sentiment positive negative
# <dbl> <dbl> <dbl>
#1 0 0 0
#2 2 2 0
#3 -2 0 2https://stackoverflow.com/questions/68338367
复制相似问题