【问题标题】:R tidytext sentiment analysis- how to use the drop parameterR tidytext 情感分析-如何使用drop参数
【发布时间】:2021-07-11 17:07:44
【问题描述】:

我最近问了一个关于在情绪分析后遗漏的条目的问题。我分析的推文并不总是包含词典中的单词。我想知道哪些不能翻译。因此,即使得分为零,我也想保留这些。在我之前的问题中,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

【问题讨论】:

  • @RonakShah 我已经添加了请求的信息

标签: r sentiment-analysis tidytext


【解决方案1】:

如果在连接后没有返回任何行,您可以返回一个全为 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

【讨论】:

  • 这成功了。非常感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多