2

我已经阅读了这个这个问题,但我仍然不明白stemDocumentin的用法tm_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"

它不起作用。为什么这样?

4

1 回答 1

1

不幸的是,你偶然发现了一个错误。stemDocument如果您在传递语言时有效:

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

但是在 中使用 this 时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 好得多。

于 2019-01-15T13:28:26.107 回答