Crea dfm paso a paso con quanteda
Quiero analizar un gran corpus de documentos (n = 500,000). estoy usandoquanteda
en la expectativa de quesera mas rapido quetm_map()
detm
. Quiero proceder paso a paso en lugar de usar la forma automatizada condfm()
. Tengo razones para esto: en un caso, no quiero tokenizar antes de eliminar las palabras vacías, ya que esto resultaría en muchos bigrams inútiles, en otro tengo que preprocesar el texto con procedimientos específicos del idioma.
Me gustaría implementar esta secuencia:
1) eliminar la puntuación y los números
2) elimine las palabras vacías (es decir, antes de la tokenización para evitar tokens inútiles)
3) tokenizar usando unigramas y bigramas
4) crea el dfm
Mi intento:
> 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))
Pregunta extra ¿Cómo elimino tokens dispersos enquanteda
? (es decir, equivalente deremoveSparseTerms()
entm
.
ACTUALIZAR A la luz de la respuesta de @ Ken, aquí está el código para proceder paso a paso conquanteda
:
library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’
1) Eliminar puntuación y números personalizados. P.ej. observe que la "\ n" en el 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
Una nota adicional sobre la razón por la cual uno puede preferir preprocesar. Mi corpus actual está en italiano, un idioma que tiene artículos relacionados con las palabras con un apóstrofe. Por lo tanto, la rectadfm()
puede conducir a una tokenización inexacta. p.ej.:
broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))
producirá dos tokens separados para la misma palabra ("un'abile" y "l'abile"), de ahí la necesidad de un paso adicional congsub()
aquí.
2) enquanteda
No es posible eliminar las palabras vacías directamente en el texto antes de la tokenización. En mi ejemplo anterior, "l" y "un" tienen que eliminarse para no producir bigramas engañosas. Esto se puede manejar entm
contm_map(..., removeWords)
.
3) Tokenización
token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)
4) Crea el dfm:
dfm <- dfm(token)
5) Eliminar características dispersas
dfm <- trim(dfm, minCount = 5)