如何使用quanteda引导文本可读性统计信息?

问题描述 投票:2回答:1

我是bootstrapping和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]]:矩阵上的下标数不正确”

我浪费了两天试图调试没有运气。我究竟做错了什么?任何建议都非常感谢...

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)) 
r nlp bootstrapping tm quanteda
1个回答
2
投票

一个很好的问题,包括了解很多关于启动包以及如何在quanteda中索引和分组语料库文本。这是最好的(当前)和最安全的方法。这里的“最安全”意味着面向未来,因为目前有一些东西可用于quanteda语料库的内部寻址,这些内容在即将到来的v2中无效。 (我们在?corpus非常清楚地警告这一点,但似乎没有人注意到这个警告...)另请注意,虽然这应该始终有效,但我们还计划在未来版本中使用更直接的方法来引导不需要的文本统计数据用户可以深入了解启动包。

让我们先从内置对象中尝试一个可重现的例子。为了“引导”文本,我们将使用原始句子级重新采样(替换)来构造一个新的假设文本,并使用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")

然后我们必须定义要引导的函数。我们将使用“索引”方法并调用索引i(如上所述)。在这里,x将是一个character而不是语料库,即使我们将再次使用分组变量重新组装它来调用texts()。这还需要返回一个向量而不是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时将qzexswpoi参数和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()
© www.soinside.com 2019 - 2024. All rights reserved.