我有一个具有两种语言的语料库(语言信息保存在docvar lang
中),并且希望根据docvar
的值删除停用词。
我使用的是一个实质上荒谬的示例来说明这一点(因为在示例语料库中,所有语音都是英语的):
library(quanteda)
library(quanteda.corpora)
corp <- corpus(data_corpus_ungd2017) %>%
corpus_subset(country %in% c("Austria", "Australia"))
corp
现在包含奥地利和比利时的讲话;假设它们是用德语和法语给出的:我如何根据country_iso
的值来选择性地删除停用词?我尝试了类似的尝试,但未成功。
toks <- corp %>%
tokens() %>%
ifelse(docvars(field = "country_iso") == "AUT",
tokens_remove(stopwords("de")),
tokens_remove(stopwords("en")))
ifelse(。,docvars(field =“ country_iso”))==“ AUT”,tokens_remove(stopwords(“ de”)),中的错误: 未使用的参数(tokens_remove(stopwords(“ en”)))
我怎样才能最好地实现一个语料库?
答案 0 :(得分:3)
这是一个有趣的问题!当前在 quanteda (<= v1.5.1)中,类似列表的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。下面的语言分配功能可以扩展,或者您可以为语言创建一个单独的国家/地区表,并通过一些合并功能创建语言文档。确切的方法不是解决方案的中心,但是您确实需要一个语言变量,该变量必须与stopwords::stopwords()
作为输入的ISO-639-1 language codes相匹配。
# 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()
的令牌对象。 / p>
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
}
现在我们可能希望将它们放回原来的顺序,然后在检查时,可以看到已删除了与语言相对应的停用词。在本示例中,仅保留了“ pads”,以便我们可以看到它,但是您可能不想保留它们,因此只需在{{1}中设置padding = FALSE
(默认设置) }致电。
tokens_remove()