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

问题描述

我在计算相对较大的数据集(N = 36140)中每行的平均情感时遇到麻烦。 我的数据集包含Google Play商店中某个应用的评论数据(每一行代表一个评论),我想使用sentiment_by()函数来计算每个评论的情绪。 问题在于该函数需要大量时间来计算它。

以下是.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条左右的个人评论,$subs = subscription::all(); $details = $subs->pluck('details')->toArray(); 中使用的算法就好像是O(N ^ 2),这就是为什么当您大幅增加数据集的大小时突然花费更长的时间的原因。大概是以某种方式比较每对评论吗?

我浏览了帮助文件(sentiment),它似乎并没有执行取决于对评论的任何操作,所以有点奇怪。

?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中的“ by”功能,但是我认为您应该能够在发送之前(或之后似乎无关紧要)自行对它们进行分组。

sentiment_by

在我的计算机上花费约45秒的时间(对于更大的数据集,应为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)