Оценка полярности документа с использованием пакета 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