使用 R 计算大数据集中每一行的情绪

Calculate sentiment of each row in a big dataset using R

我无法计算相对较大的数据集 (N=36140) 中每一行的平均情绪。 我的数据集包含来自 Google Play 商店应用的评论数据(每行代表一条评论),我想使用 sentiment_by() 函数计算每条评论的情绪。 问题是这个函数需要很多时间来计算它。

这是我的数据集的 link .csv 格式:

https://drive.google.com/drive/folders/1JdMOGeN3AtfiEgXEu0rAP3XIe3Kc369O?usp=sharing

我试过使用这个代码:

library(sentimentr)
e_data = read.csv("15_06_2016-15_06_2020__Sygic.csv", stringsAsFactors = FALSE)
sentiment=sentiment_by(e_data$review)

然后我收到以下警告消息(经过 10 多分钟后我取消了该过程):

Warning message:
Each time `sentiment_by` is run it has to do sentence boundary disambiguation when a
raw `character` vector is passed to `text.var`. This may be costly of time and
memory.  It is highly recommended that the user first runs the raw `character`
vector through the `get_sentences` function. 

我也试过用下面的代码使用get_sentences()函数,但是sentiment_by()函数仍然需要很多时间来执行计算

e_sentences = e_data$review %>%
  get_sentences() 
e_sentiment = sentiment_by(e_sentences)

我有关于 Google Play 商店评论数据的数据集,我在过去一个月里使用了 sentiment_by() 函数,它在计算情绪时工作得非常快......我只从昨天开始运行计算这么长时间。

有没有一种方法可以快速计算大数据集上每一行的情绪。

一旦您获得超过 500 条左右的个人评论,sentiment 中使用的算法似乎是 O(N^2),这就是为什么当您提高数据集的大小时它突然需要更长的时间显著地。大概是在以某种方式比较每对评论?

我浏览了帮助文件 (?sentiment),它似乎没有做任何依赖成对评论的事情,所以这有点奇怪。

library(data.table)
reviews <- iconv(e_data$review, "") # I had a problem with UTF-8, you may not need this
x1 <- rbindlist(lapply(reviews[1:10],sentiment_by))
x1[,element_id:=.I]
x2 <- sentiment_by(reviews[1:10])

有效地产生相同的输出,这意味着 sentimentr 包中有一个错误导致它不必要地慢。

一个解决方案就是对评论进行批处理。这将破坏 sentiment_by 中的 'by' 功能,但我认为您应该能够在发送它们之前(或发送之后,因为这似乎无关紧要)自行对它们进行分组。

batch_sentiment_by <- function(reviews, batch_size = 200, ...) {
  review_batches <- split(reviews, ceiling(seq_along(reviews)/batch_size))
  x <- rbindlist(lapply(review_batches, sentiment_by, ...))
  x[, element_id := .I]
  x[]
}

batch_sentiment_by(reviews)

在我的机器上大约需要 45 秒(对于更大的数据集应该是 O(N)