Хороший вопрос, который включает в себя много знаний о пакете boot , а также о том, как индексировать и группировать тексты корпусов в quanteda . Вот лучший (в настоящее время) и самый безопасный способ сделать это. «Самый безопасный» здесь означает «будущее», поскольку есть некоторые вещи, которые в настоящее время работают во внутренней адресации quanteda корпуса, которые не будут работать в следующей версии v2. (Мы очень четко предупреждаем об этом в ?corpus
, но никто, похоже, не учитывает это предупреждение ...) Обратите также внимание, что, хотя это всегда должно работать, мы также планируем в будущих версиях более прямые методы для загрузки текстовой статистики, которая бы не требует, чтобы пользователь делал такое глубокое погружение в пакет boot .
Давайте сначала попробуем воспроизвести воспроизводимый пример из встроенных объектов. Чтобы «загрузить» текст, мы сконструируем новый, гипотетический текст, используя повторную выборку на уровне предложений (с заменой) из оригинала, и используем texts(x, groups = "<groupvar>")
, чтобы объединить это в гипотетический вид текста. (Это то, что я сделал в двух ссылках в конце этого поста.) Чтобы это произошло, мы можем использовать свойство texts()
, которое работает для получения текстов из объекта корпуса, но также работает и с объектами персонажа. (но с быстрой группировкой).
Чтобы получить предложения, после подстановки корпуса для упрощения нашего примера мы преобразуем его в предложения.
Однако сначала я записал имя исходного документа в новую переменную документа, чтобы мы могли использовать его для группировки позже. В этом примере мы также могли бы использовать Year, но это будет работать для любого примера. (Существуют некоторые внутренние записи об исходном имени документа, которые мы могли бы использовать, но выполнение этого будет оправдано на будущее.)
library("quanteda")
## Package version: 1.4.1
library("boot")
docvars(data_corpus_inaugural, "docnameorig") <- docnames(data_corpus_inaugural)
sent_corpus <- data_corpus_inaugural %>%
corpus_subset(Year > 2000) %>%
corpus_reshape(to = "sentences")
Затем мы должны определить функцию, которая будет загружена. Мы будем использовать метод «index» и будем вызывать index i
(как вы делали выше). Здесь x
будет character
, а не корпусом, даже если мы снова назовем texts()
, используя переменную группировки для его повторной сборки. Для этого также необходимо вернуть vector , а не data.frame, что является обычной формой возврата textstat_*()
. Таким образом, мы извлечем только столбец measure
и вернем его как вектор.
b_readability <- function(x, i, groups = NULL, measure = "Flesch") {
textstat_readability(texts(x[i], groups = groups[i]), measure)[[measure]]
}
Мы будем называть нашу группирующую переменную simgroups
просто для того, чтобы отличить значение от имени аргумента, и использовать это как для аргумента groups
, так и для strata
при вызове boot()
. strata
является аргументом boot()
, а groups
передается нашей функции b_readability()
. Нам нужно разложить эту группирующую переменную, так как функция, кажется, этого хочет. Затем мы звоним boot()
и получаем наш ответ.
simgroups <- factor(docvars(sent_corpus, "docnameorig"))
boot(texts(sent_corpus), b_readability, R = 10,
strata = simgroups, groups = simgroups)
##
## STRATIFIED BOOTSTRAP
##
##
## Call:
## boot(data = texts(sent_corpus), statistic = b_readability, R = 10,
## strata = simgroups, groups = simgroups)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 60.22723 -0.01454477 2.457416
## t2* 53.23332 1.24942328 2.564719
## t3* 60.56705 1.07426297 1.996705
## t4* 53.55532 -0.28971190 1.943986
## t5* 58.63471 0.52289051 2.502101
Они соответствуют пяти (оригинальным) документам, различаемым здесь по году, хотя, к сожалению, эти имена были заменены на t1
, t2
, ... в возвращаемом объекте из boot()
.
Чтобы вернуться к исходному примеру , скажем, они образуют два документа из одного слоя (так как они слишком короткие, два подразделяют дальше). Тогда:
simgroups <- rep(1, ndoc(mwe))
boot(texts(mwe), b_readability, R = 10, strata = simgroups, groups = simgroups)
##
## STRATIFIED BOOTSTRAP
##
##
## Call:
## boot(data = texts(mwe), statistic = b_readability, R = 10, strata = simgroups,
## groups = simgroups)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 119.19 0.6428333 0.4902916