Как я могу загрузить статистику читабельности текста с помощью Quanteda? - PullRequest
2 голосов
/ 14 марта 2019

Я новичок как в начальной загрузке, так и в пакете quanteda для анализа текста. У меня есть большой набор текстов, организованных по типу группы документов, для которых я хотел бы получить оценки читабельности. Я легко могу получить оценки читабельности для каждой группы с помощью следующей функции:

textstat_readability(texts(mwe, groups = "document"), "Flesch")

Затем я хочу загрузить результаты, чтобы получить 95% доверительный интервал, обернув функцию:

b_readability <- function(x, i, groups = NULL, measure = "Flesch")
textstat_readability(texts(x[i], groups = groups), measure) 
n <- 10

groups <- factor(mwe[["document"]]$document)  
b <- boot(texts(mwe), b_readability, strata = groups, R = n, groups = groups) 
colnames(b$t) <- names(b$t0)
apply(b$t, 2, quantile, c(.025, .5, .975)) 

Но «b <-» завершается ошибкой: «Ошибка в t.star [r,] <- res [[r]]: неверное количество индексов в матрице» </p>

Я потратил впустую два дня, пытаясь отладить без удачи. Что я делаю неправильно? Очень ценю за любой совет ...

MWE:

mwe<-structure(list(document = structure(c(1L, 1L), 
.Label = c("a", "b", "c", "d", "e"), class = "factor"),  text = c("Text 1. Text 1.1", "Text 2."), section = structure(2:1, .Label = c("aa", "bb", "cc", "dd", "ee", "ff", "hh", "ii", "jj", "kk"), class = "factor"), year = c(1919L, 1944L), preamble = structure(8:9, .Label = c("1", "2","3", " 4 ", "5", "6  ",  "7  ",  "8  ", "9  ",  "10 "), class = "factor"), articles = c(43L, 47L), pages = c(5.218, 7.666), wordcount = c(3503L, 4929L), mean_articles = c(45, 45)), row.names = 1:2, class = "data.frame")

mwe <- corpus(mwe)

b_readability <- function(x, i, groups = NULL, measure = "Flesch")
textstat_readability(texts(x[i], groups = groups), measure) 
n <- 10

groups <- factor(mwe[["document"]]$document)  
b <- boot(texts(mwe), b_readability, strata = groups, R = n, groups = groups) 
colnames(b$t) <- names(b$t0)
apply(b$t, 2, quantile, c(.025, .5, .975)) 

1 Ответ

2 голосов
/ 15 марта 2019

Хороший вопрос, который включает в себя много знаний о пакете 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
...