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

时间:2014-04-01 00:54:49

标签: r nlp sentiment-analysis qdap

我希望将qdap polarity函数应用于文档向量,每个文档可以包含多个句子,并获得每个文档的相应极性。例如:

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.

此警告无法忽略,因为它似乎会添加文档中每个句子的极性分数。这可能导致文档级极性分数超出[-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"]

我希望我可以在已删除句点的某个矢量版本上运行polarity,但sentSplit似乎不止于此。这适用于DATA但不适用于其他文本集(我不确定除句点之外的完整中断集)。

所以,我怀疑接近这个的最好方法是使文档向量的每个元素看起来像一个长句子。我该怎么做,还是有另一种方式?

2 个答案:

答案 0 :(得分:2)

Max在此版本的qdap(1.3.4)中发现了一个错误,该错误将占位符计为一个影响等式的单词,因为分母为sqrt(n),其中n为单词计数。从1.3.5开始,这已得到纠正,因此两个不同的输出不匹配的原因。

这是输出:

library(qdap)
counts(polarity(DATA$state))[, "polarity"]

## > counts(polarity(DATA$state))[, "polarity"]
##  [1] -0.8164966 -0.4472136  0.0000000 -1.0000000  0.0000000  0.0000000  0.0000000
##  [8] -0.5773503  0.0000000  0.4082483  0.0000000
## Warning message:
## In polarity(DATA$state) : 
##   Some rows contain double punctuation.  Suggested use of `sentSplit` function.

在这种情况下,使用strip并不重要。它可能在更复杂的情况下涉及放大器,否定器,底片和逗号。这是一个例子:

## > counts(polarity("Really, I hate it"))[, "polarity"]
## [1] -0.5
## > counts(polarity(strip("Really, I hate it")))[, "polarity"]
## [1] -0.9

请参阅文档了解更多信息。

答案 1 :(得分: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