Crie o dfm passo a passo com quanteda

Quero analisar um grande (n = 500.000) corpus de documentos. estou usandoquanteda na expectativa de queserá mais rápido do quetm_map() detm. Quero prosseguir passo a passo em vez de usar a maneira automatizada comdfm(). Eu tenho razões para isso: em um caso, não quero tokenizar antes de remover as palavras-chave, pois isso resultaria em muitos bigrams inúteis; em outro, tenho que pré-processar o texto com procedimentos específicos do idioma.

Eu gostaria que essa sequência fosse implementada:
1) remova a pontuação e os números
2) remova palavras-chave (ou seja, antes da tokenização para evitar tokens inúteis)
3) tokenizar usando unigramas e bigrams
4) crie o dfm

Minha tentativa:

> library(quanteda)
> packageVersion("quanteda")
[1] ‘0.9.8’
> text <- ie2010Corpus$documents$texts
> text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents))

> class(text.corpus)
[1] "corpus" "list"

> stopw <- c("a","the", "all", "some")
> TextNoStop <- removeFeatures(text.corpus, features = stopw)
# Error in UseMethod("selectFeatures") : 
# no applicable method for 'selectFeatures' applied to an object of class "c('corpus', 'list')"

# This is how I would theoretically continue: 
> token <- tokenize(TextNoStop, removePunct=TRUE, removeNumbers=TRUE)
> token2 <- ngrams(token,c(1,2))

Pergunta bônus Como removo tokens esparsos noquanteda? (ou seja, equivalente aremoveSparseTerms() notm.

ATUALIZAR À luz da resposta de @ Ken, eis o código para prosseguir passo a passo comquanteda:

library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’

1) Remova a pontuação e os números personalizados. Por exemplo. observe que o "\ n" no corpus ie2010

text.corpus <- ie2010Corpus
texts(text.corpus)[1]      # Use texts() to extrapolate text
# 2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery.\nIt is

texts(text.corpus)[1] <- gsub("\\s"," ",text.corpus[1])    # remove all spaces (incl \n, \t, \r...)
texts(text.corpus)[1]
2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery. It is of e

Uma observação adicional sobre o motivo pelo qual um pode preferir pré-processar. Meu corpus atual é em italiano, um idioma que tem artigos relacionados às palavras com um apóstrofo. Assim, a retadfm() pode levar a tokenização inexata. por exemplo.:

broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))

produzirá dois tokens separados para a mesma palavra ("un'abile" e "l'abile"), daí a necessidade de uma etapa adicional comgsub() aqui.

2) Emquanteda não é possível remover palavras irrelevantes diretamente no texto antes da tokenização. No meu exemplo anterior, "l" e "un" precisam ser removidos para não produzir bigrams enganosos. Isso pode ser tratado emtm comtm_map(..., removeWords).

3) Tokenização

token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)

4) Crie o dfm:

dfm <- dfm(token)

5) Remova recursos esparsos

dfm <- trim(dfm, minCount = 5)

questionAnswers(1)

yourAnswerToTheQuestion