J'ajoute un problème similaire en utilisant tm
y ngram
paquets. Après le débogage mclapply
J'ai vu qu'il y avait des problèmes sur les documents de moins de 2 mots avec l'erreur suivante
input 'x' has nwords=1 and n=2; must have nwords >= n
J'ai donc ajouté un filtre pour supprimer les documents dont le nombre de mots est faible :
myCorpus.3 <- tm_filter(myCorpus.2, function (x) {
length(unlist(strsplit(stringr::str_trim(x$content), '[[:blank:]]+'))) > 1
})
Ma fonction de symbolisation ressemble alors à ce qui suit :
bigramTokenizer <- function(x) {
x <- as.character(x)
# Find words
one.list <- c()
tryCatch({
one.gram <- ngram::ngram(x, n = 1)
one.list <- ngram::get.ngrams(one.gram)
},
error = function(cond) { warning(cond) })
# Find 2-grams
two.list <- c()
tryCatch({
two.gram <- ngram::ngram(x, n = 2)
two.list <- ngram::get.ngrams(two.gram)
},
error = function(cond) { warning(cond) })
res <- unlist(c(one.list, two.list))
res[res != '']
}
Vous pouvez ensuite tester la fonction avec :
dtmTest <- lapply(myCorpus.3, bigramTokenizer)
Et enfin :
dtm <- DocumentTermMatrix(myCorpus.3, control = list(tokenize = bigramTokenizer))