这是一个有趣的问题!目前在 quanteda (tokens 对象不允许分配文档级标记元素,因此不能使用基于 lapply() 的解决方案。最有效的方法是将标记对象分割成相同语言的块,然后对每个块应用停用词删除。
在您的问题中选择作为示例的 UNDG(联合国一般性辩论)语料库并不非常适合此示例,因为它完全是英文的,因此我在下面创建了一个双语示例来说明解决方案。
library("quanteda")
## Package version: 1.5.1
txt <- c(
Austria = "Dies ist ein Beispieltext in deutscher Sprache.",
Australia = "This is a sample English text.",
Germany = "Dies ist ein Beispieltext in deutscher Sprache.",
"United Kingdom" = "This is s sample English text."
)
corp <- corpus(txt,
docvars = data.frame(country = names(txt), stringsAsFactors = FALSE)
)
现在我们需要创建和设置语言 docvar。可以扩展下面的语言分配功能,或者您可以为语言创建单独的国家表并通过某些合并功能创建语言文档。确切的方法不是解决方案的核心,但您确实需要一个与ISO-639-1 language codes 匹配的语言变量,stopwords::stopwords() 将其作为输入。
# language assignemnt function
setlang <- Vectorize(
vectorize.args = "country",
FUN = function(country) {
switch(country,
"Austria" = "de",
"Germany" = "de",
"Australia" = "en",
"United States" = "en",
"United Kingdom" = "en"
)
}
)
# set a language docvar
docvars(corp, "lang") <- setlang(docvars(corp, "country"))
# inspect
summary(corp)
## Corpus consisting of 4 documents:
##
## Text Types Tokens Sentences country lang
## Austria 8 8 1 Austria de
## Australia 7 7 1 Australia en
## Germany 8 8 1 Germany de
## United Kingdom 7 7 1 United Kingdom en
##
## Source: /private/var/folders/1v/ps2x_tvd0yg0lypdlshg_vwc0000gp/T/RtmpflhaMi/reprex933852cb0380/* on x86_64 by kbenoit
## Created: Sat Nov 2 10:19:59 2019
## Notes:
现在我们可以遍历标记对象并删除每个语言段的停用词。下面我们需要使用 if 来检查 NULL 是否为第一种语言,因为(目前)我们无法返回带有 c(NULL, tokensobject) 的标记对象,因为我们可以使用为其他对象实现的 c()。
toks <- tokens(corp)
tokslist <- NULL
for (l in unique(docvars(toks, "lang"))) {
toksthislang <- tokens_subset(toks, lang == l) %>%
tokens_remove(stopwords(language = l), padding = TRUE)
tokslist <- if (!is.null(tokslist)) c(tokslist, toksthislang) else toksthislang
}
现在我们可能希望将它们放回原来的顺序,然后当我们检查它时,我们可以看到与语言相关的停用词已被删除。出于本示例的目的,“垫”已被保留,因此我们可以看到这一点,但您可能不想保留它们,因此只需在上面的 tokens_remove() 调用中设置 padding = FALSE(默认值)。
# put back into original order
toks <- tokslist[docnames(toks)]
lapply(toks, head)
## $Austria
## [1] "" "" "" "Beispieltext"
## [5] "" "deutscher"
##
## $Australia
## [1] "" "" "" "sample" "English" "text"
##
## $Germany
## [1] "" "" "" "Beispieltext"
## [5] "" "deutscher"
##
## $`United Kingdom`
## [1] "" "" "s" "sample" "English" "text"