Очистите корпус с помощью Quanteda - PullRequest
0 голосов
/ 04 августа 2020

Какой способ Quanteda очищает корпус, как показано в примере ниже, с помощью tm (строчные буквы, удаление знаков, удаление чисел, основных слов)? Чтобы быть ясным, я не хочу создавать матрицу функций документа с dfm(), мне просто нужен чистый корпус, который я могу использовать для конкретной c последующей задачи.

# This is what I want to do in quanteda
library("tm")
data("crude")
crude <- tm_map(crude, content_transformer(tolower))
crude <- tm_map(crude, removePunctuation)
crude <- tm_map(crude, removeNumbers)
crude <- tm_map(crude, stemDocument)

PS Я знаю, что мог бы просто сделать quanteda_corpus <- quanteda::corpus(crude), чтобы получить то, что хочу, но я бы предпочел иметь возможность делать все в Quanteda.

1 Ответ

3 голосов
/ 05 августа 2020

Я думаю, что то, что вы хотите сделать, намеренно невозможно в 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*.

...