R tidytext情感分析——drop参数的使用方法
R tidytext sentiment analysis- how to use the drop parameter
我最近问了一个关于情绪分析后遗漏条目的问题。我分析的推文并不总是包含词典中的单词。我想知道哪些不能翻译。所以即使得分为零,我也想保留这些。在我之前的问题中,drop参数是作为解决方案给出的。但是,我认为我可能做错了或遗漏了什么。这是我第一次使用这些技术。
以下函数获取一个数据框并在 return 中给出一个新的数据框,其中包含正面和负面词的数量以及情绪。
输入(故意用荷兰语输入一段文字,因此无法评分)
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)
}
这仍然是 return 一个缺少未评分文本的数据框。可以看到,省略了第一段文字:
sentiment positive negative
2 2 0
-2 0 2
如果在联接后没有行 returned,您可以 return 一个全部为 0 值的小标题。我们可以使用 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 2
我最近问了一个关于情绪分析后遗漏条目的问题。我分析的推文并不总是包含词典中的单词。我想知道哪些不能翻译。所以即使得分为零,我也想保留这些。在我之前的问题中,drop参数是作为解决方案给出的。但是,我认为我可能做错了或遗漏了什么。这是我第一次使用这些技术。
以下函数获取一个数据框并在 return 中给出一个新的数据框,其中包含正面和负面词的数量以及情绪。
输入(故意用荷兰语输入一段文字,因此无法评分)
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)
}
这仍然是 return 一个缺少未评分文本的数据框。可以看到,省略了第一段文字:
sentiment positive negative
2 2 0
-2 0 2
如果在联接后没有行 returned,您可以 return 一个全部为 0 值的小标题。我们可以使用 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 2