Как правильно использовать stemDocument? - PullRequest
0 голосов
/ 15 января 2019

Я уже прочитал это и это вопросы, но я все еще не понимал использование stemDocument в 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"

это не работает. Почему так?

1 Ответ

0 голосов
/ 15 января 2019

К сожалению, вы наткнулись на ошибку. stemDocument работает, если вы передаете язык, когда вы делаете:

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

Но при использовании этого в tm_map функция начинается с stemDocument.PlainTextDocument. В этой функции язык корпуса проверяется на соответствие языку, указанному в функции. Это работает правильно. Но в конце этой функции все передается функции stemDocument.character, но без языковой компоненты . В stemDocument.character язык по умолчанию указан как английский. Таким образом, при вызове tm_map (или DocumentTermMatrix) язык, который вы ему предоставляете, вернется обратно к английскому, и stemming не будет работать правильно.

Обходной путь может быть использован пакет 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 или оба. Оба пакета обрабатывают неанглийские языки намного лучше, чем тм.

...