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)