Оценка полярности документа с использованием пакета Q'sd R без sentSplit

Я хотел бы подать заявку qdap"s 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 ответа

Макс нашел ошибку в этой версии 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

см. документацию для получения дополнительной информации.

Похоже на удаление пунктуации и других дополнительных трюков 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 
Другие вопросы по тегам