如何正确使用stemDocument?

How is the correct use of stemDocument?

我已经看了this and 题,但是还是没看懂stemDocumenttm_map中的用法。让我们看这个例子:

q17 <- VCorpus(VectorSource(x = c("poder", "pode")),
               readerControl = list(language = "pt",
                                    load = TRUE))
lapply(q17, content)
$`character(0)`
[1] "poder"

$`character(0)`
[1] "pode"

如果我使用:

> stemDocument("poder", language = "portuguese")
[1] "pod"
> stemDocument("pode", language = "portuguese")
[1] "pod"

它确实有效!但是如果我使用:

> q17 <- tm_map(q17, FUN = stemDocument, language = "portuguese")
> lapply(q17, content)
$`character(0)`
[1] "poder"

$`character(0)`
[1] "pode"

没用。为什么会这样?

很遗憾,您遇到了错误。 stemDocument 如果您在传递语言时有效:

stemDocument(x = c("poder", "pode"), language = "pt")
[1] "pod" "pod"

但是在tm_map中使用这个函数时,函数从stemDocument.PlainTextDocument开始。在此函数中,将根据您在函数中提供的语言检查语料库的语言。这工作正常。但是在这个函数的最后,所有的东西都传递给了函数stemDocument.character,但是没有语言部分。在 stemDocument.character 中,默认语言指定为英语。因此,在 tm_map 调用(或 DocumentTermMatrix)中,您提供的语言将恢复为英语,并且词干提取无法正常工作。

解决方法是使用 quanteda 包:

library(quanteda)
my_dfm <- dfm(x = c("poder", "pode"))
my_dfm <- dfm_wordstem(my_dfm, language = "pt")

my_dfm

Document-feature matrix of: 2 documents, 1 feature (0.0% sparse).
2 x 1 sparse Matrix of class "dfm"
       features
docs    pod
  text1   1
  text2   1

由于您使用的是葡萄牙语,我建议您使用 quanteda 和/或 udpipe 包。这两个包在处理非英语语言方面都比 tm 好得多。