如何删除多种语言的停用词?

时间:2019-11-01 17:49:08

标签: r quanteda

我有一个具有两种语言的语料库(语言信息保存在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”)))

我怎样才能最好地实现一个语料库?

1 个答案:

答案 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()