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