使用 R 的 qdap 包估计文档极性而不使用 sentSplit

Max*_*nis 5 nlp r sentiment-analysis qdap

我想将qdappolarity函数应用于文档向量,每个文档可以包含多个句子,并为每个文档获取相应的极性。例如:

library(qdap)
polarity(DATA$state)$all$polarity
# Results:
 [1] -0.8165 -0.4082  0.0000 -0.8944  0.0000  0.0000  0.0000 -0.5774  0.0000
[10]  0.4082  0.0000
Warning message:
In polarity(DATA$state) :
  Some rows contain double punctuation.  Suggested use of `sentSplit` function.
Run Code Online (Sandbox Code Playgroud)

这个警告不能忽略,因为它似乎添加了文档中每个句子的极性分数。这可能导致文档级极性分数超出 [-1, 1] 范围。

我知道首先运行sentSplit然后在句子中求平均值的选项,可能按字数加权极性,但这是 (1) 低效的(大约是在带有警告的完整文档上运行的时间的 4 倍),并且( 2)不清楚如何给句子加权。这个选项看起来像这样:

DATA$id <- seq(nrow(DATA)) # For identifying and aggregating documents 
sentences <- sentSplit(DATA, "state")
library(data.table) # For aggregation
pol.dt <- data.table(polarity(sentences$state)$all)
pol.dt[, id := sentences$id]
document.polarity <- pol.dt[, sum(polarity * wc) / sum(wc), "id"]
Run Code Online (Sandbox Code Playgroud)

我希望我可以polarity在删除句点的矢量版本上运行,但似乎sentSplit不止于此。这适用于DATA但不适用于其他文本集(我不确定除句号之外的全套休息时间)。

所以,我怀疑解决这个问题的最好方法是让文档向量的每个元素看起来像一个长句子。我将如何做到这一点,或者有其他方法吗?

Max*_*nis 0

看起来像删除标点符号和其他额外的技巧polarity来认为向量是一个句子:

SimplifyText <- function(x) {
  return(removePunctuation(removeNumbers(stripWhitespace(tolower(x))))) 
}
polarity(SimplifyText(DATA$state))$all$polarity
# Result (no warning)
 [1] -0.8165 -0.4472  0.0000 -1.0000  0.0000  0.0000  0.0000 -0.5774  0.0000
[10]  0.4082  0.0000 
Run Code Online (Sandbox Code Playgroud)