按日期进行情绪分析
Sentiment Analysis By Date
我正在对每天都在增长的相当大的数据集进行一些非常基本的情绪分析。我需要将这些数据输入到一个闪亮的应用程序中,我可以在其中调整日期范围。与其 运行 一遍又一遍地分析,我想做的是创建一个新的 CSV,其中包含每个日期的情绪得分总和。不过,我在迭代日期时遇到了麻烦。这是一些示例数据,我试过的 lapply()
语句不起作用。
library(tidyverse)
library(syuzhet)
library(data.table)
df <- data.frame(date = c("2021-01-18", "2021-01-18", "2021-01-18", "2021-01-17","2021-01-17", "2021-01-16", "2021-01-15", "2021-01-15", "2021-01-15"),
text = c("Some text here", "More text", "Some other words", "Just making this up", "as I go along", "hope the example helps", "thank you in advance", "I appreciate the help", "the end"))
> df
date text
1 2021-01-18 Some text here
2 2021-01-18 More text
3 2021-01-18 Some other words
4 2021-01-17 Just making this up
5 2021-01-17 as I go along
6 2021-01-16 hope the example helps
7 2021-01-15 thank you in advance
8 2021-01-15 I appreciate the help
9 2021-01-15 the end
dates_scores_df <- lapply(df, function(i){
data <- df %>%
# Filter to the unique date
filter(date == unique(df$date[i]))
# Sentiment Analysis for each date
sentiment_data <- get_nrc_sentiment(df$text)
# Convert to df
score_df <- data.frame(sentiment_data[,])
# Transpose the data frame and adjust column names
daily_sentiment_data <- transpose(score_df)
colnames(daily_sentiment_data) <- rownames(score_df)
# Add a date column
daily_sentiment_data$date <- df$date[i]
})
sentiment_scores_by_date <- do.call("rbind.data.frame", dates_scores_df)
我想得到的是这样的(这里的数据是编造的,与上面的例子不符)
date anger anticipation disgust fear joy sadness surprise trust negative positive
2021-01-18 1 2 0 1 2 0 2 1 1 2
2021-01-17 1 2 0 2 3 3 1 2 0 1
函数lapply
遍历列表的元素。数据框在技术上是一个列表,每一列都是该列表的一个元素。因此,在您的示例中,您迭代的是列而不是行,甚至是日期(这似乎是您的目标)。我将 dplyr::group_by
与以下之一结合使用,而不是 lapply
:dplyr::do
、dplyr::summarize
或 tidyr::nest
。请参阅每个功能的文档以确定哪个功能最适合您的需要。
你可以试试:
library(dplyr)
library(purrr)
library(syuzhet)
df %>%
split(.$date) %>%
imap_dfr(~get_nrc_sentiment(.x$text) %>%
summarise(across(.fns = sum)) %>%
mutate(date = .y, .before = 1)) -> result
result
我正在对每天都在增长的相当大的数据集进行一些非常基本的情绪分析。我需要将这些数据输入到一个闪亮的应用程序中,我可以在其中调整日期范围。与其 运行 一遍又一遍地分析,我想做的是创建一个新的 CSV,其中包含每个日期的情绪得分总和。不过,我在迭代日期时遇到了麻烦。这是一些示例数据,我试过的 lapply()
语句不起作用。
library(tidyverse)
library(syuzhet)
library(data.table)
df <- data.frame(date = c("2021-01-18", "2021-01-18", "2021-01-18", "2021-01-17","2021-01-17", "2021-01-16", "2021-01-15", "2021-01-15", "2021-01-15"),
text = c("Some text here", "More text", "Some other words", "Just making this up", "as I go along", "hope the example helps", "thank you in advance", "I appreciate the help", "the end"))
> df
date text
1 2021-01-18 Some text here
2 2021-01-18 More text
3 2021-01-18 Some other words
4 2021-01-17 Just making this up
5 2021-01-17 as I go along
6 2021-01-16 hope the example helps
7 2021-01-15 thank you in advance
8 2021-01-15 I appreciate the help
9 2021-01-15 the end
dates_scores_df <- lapply(df, function(i){
data <- df %>%
# Filter to the unique date
filter(date == unique(df$date[i]))
# Sentiment Analysis for each date
sentiment_data <- get_nrc_sentiment(df$text)
# Convert to df
score_df <- data.frame(sentiment_data[,])
# Transpose the data frame and adjust column names
daily_sentiment_data <- transpose(score_df)
colnames(daily_sentiment_data) <- rownames(score_df)
# Add a date column
daily_sentiment_data$date <- df$date[i]
})
sentiment_scores_by_date <- do.call("rbind.data.frame", dates_scores_df)
我想得到的是这样的(这里的数据是编造的,与上面的例子不符)
date anger anticipation disgust fear joy sadness surprise trust negative positive
2021-01-18 1 2 0 1 2 0 2 1 1 2
2021-01-17 1 2 0 2 3 3 1 2 0 1
函数lapply
遍历列表的元素。数据框在技术上是一个列表,每一列都是该列表的一个元素。因此,在您的示例中,您迭代的是列而不是行,甚至是日期(这似乎是您的目标)。我将 dplyr::group_by
与以下之一结合使用,而不是 lapply
:dplyr::do
、dplyr::summarize
或 tidyr::nest
。请参阅每个功能的文档以确定哪个功能最适合您的需要。
你可以试试:
library(dplyr)
library(purrr)
library(syuzhet)
df %>%
split(.$date) %>%
imap_dfr(~get_nrc_sentiment(.x$text) %>%
summarise(across(.fns = sum)) %>%
mutate(date = .y, .before = 1)) -> result
result