Я думаю, что то, что вы хотите сделать, намеренно невозможно в quanteda
.
Конечно, вы можете легко выполнить очистку без потери порядка слов, используя набор функций tokens*
:
library("tm")
data("crude")
library("quanteda")
toks <- corpus(crude) %>%
tokens(remove_punct = TRUE, remove_numbers = TRUE) %>%
tokens_wordstem()
print(toks, max_ndoc = 3)
#> Tokens consisting of 20 documents and 15 docvars.
#> reut-00001.xml :
#> [1] "Diamond" "Shamrock" "Corp" "said" "that" "effect"
#> [7] "today" "it" "had" "cut" "it" "contract"
#> [ ... and 78 more ]
#>
#> reut-00002.xml :
#> [1] "OPEC" "may" "be" "forc" "to" "meet" "befor"
#> [8] "a" "schedul" "June" "session" "to"
#> [ ... and 427 more ]
#>
#> reut-00004.xml :
#> [1] "Texaco" "Canada" "said" "it" "lower" "the"
#> [7] "contract" "price" "it" "will" "pay" "for"
#> [ ... and 40 more ]
#>
#> [ reached max_ndoc ... 17 more documents ]
Но невозможно вернуть этот tokens
объект в корпус. Теперь можно было бы написать новую функцию для этого:
corpus.tokens <- function(x, ...) {
quanteda:::build_corpus(
unlist(lapply(x, paste, collapse = " ")),
docvars = cbind(quanteda:::make_docvars(length(x), docnames(x)), docvars(x))
)
}
corp <- corpus(toks)
print(corp, max_ndoc = 3)
#> Corpus consisting of 20 documents and 15 docvars.
#> reut-00001.xml :
#> "Diamond Shamrock Corp said that effect today it had cut it c..."
#>
#> reut-00002.xml :
#> "OPEC may be forc to meet befor a schedul June session to rea..."
#>
#> reut-00004.xml :
#> "Texaco Canada said it lower the contract price it will pay f..."
#>
#> [ reached max_ndoc ... 17 more documents ]
Но этот объект, технически являясь объектом класса corpus
, не является тем, чем должен быть корпус. От ?corpus
[курсив добавлен]:
Значение
Объект класса корпуса, содержащий исходные тексты , переменные уровня документа , метаданные уровня документа, метаданные уровня корпуса и настройки по умолчанию для последующей обработки корпуса.
Указанный выше объект не соответствует этому описанию, так как исходные тексты уже были обработаны. Однако класс объекта сообщает иначе. Я не вижу причин нарушать этот logi c, поскольку все последующие шаги анализа должны быть возможны с использованием функций tokens*
или dfm*
.