Я думаю, что ответ в основном заключается в том, что именно таким образом hunspell
останавливается. Мы можем проверить это в более простом примере:
hunspell::hunspell_stem("taking")
#> [[1]]
#> [1] "taking"
hunspell::hunspell_stem("committing")
#> [[1]]
#> [1] "committing"
ing-форма - единственная опция, предлагаемая hunspell. Для меня это тоже не имеет большого смысла, и я бы предложил использовать другой стеммер. И пока мы на этом, я думаю, что вы также выиграете от перехода на quanteda
вместо tm
:
library(quanteda)
sentences <- c("We're taking proactive steps to tackle ...",
"A number of measures we are taking to support ...",
"We caught him committing an indecent act.")
tokens(sentences, remove_numbers = TRUE) %>%
tokens_tolower() %>%
tokens_wordstem()
#> Tokens consisting of 3 documents.
#> text1 :
#> [1] "we'r" "take" "proactiv" "step" "to" "tackl" "."
#> [8] "." "."
#>
#> text2 :
#> [1] "a" "number" "of" "measur" "we" "are" "take"
#> [8] "to" "support" "." "." "."
#>
#> text3 :
#> [1] "we" "caught" "him" "commit" "an" "indec" "act" "."
Рабочий процесс намного чище, на мой взгляд, и результаты немного больше смысла для меня. quanteda
использует пакет SnowballC
для выполнения стемминга, который вы можете интегрировать в рабочий процесс tm
, если хотите. tokens
объекты - это текст в том же порядке, что и входной объект, но токенизированные (то есть разделенные на слова).
Если вы все еще хотите использовать hunspell
, вы можете сделать это с помощью следующей функции, которая устраняет некоторые проблемы, которые у вас возникли («число» теперь правильно):
stem_hunspell <- function(toks) {
# look up the term in the dictionary
stems <- vapply(hunspell::hunspell_stem(types(toks)), "[", 1, FUN.VALUE = character(1))
# if there are no stems, use the original term
stems[nchar(stems) == 0] <- types(toks)[nchar(stems) == 0]
tokens_replace(toks, types(toks), stems, valuetype = "fixed")
}
tokens(sentences, remove_numbers = TRUE, ) %>%
tokens_tolower() %>%
stem_hunspell()
#> Tokens consisting of 3 documents.
#> text1 :
#> [1] "we're" "taking" "active" "step" "to" "tackle" "." "."
#> [9] "."
#>
#> text2 :
#> [1] "a" "number" "of" "measure" "we" "are" "taking"
#> [8] "to" "support" "." "." "."
#>
#> text3 :
#> [1] "we" "caught" "him" "committing" "an"
#> [6] "decent" "act" "."