2015-11-08 2 views
0

J'utilise le TM suivant + Code RWeka pour extraire dans les textes ngrams les plus fréquents:façon Performant pour extraire les plus fréquentes ngrams utilisant R

library("RWeka") 
library("tm") 

text <- c('I am good person','I am bad person','You are great','You are more great','todo learn english','He is ok') 
BigramTokenizer <- function(x) NGramTokenizer(x,Weka_control(min=2,max=2)) 
corpus <- Corpus(VectorSource(text)) 
tdm <- TermDocumentMatrix(corpus,control = list(tokenize = BigramTokenizer)) 

DF <- data.frame(inspect(tdm)) 
DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6 
MostFreqNgrams <- rownames(head(DF[with(DF,order(-sums)),])) 

Il fonctionne bien, mais si les données est bien plus ? Y a-t-il un moyen de calcul plus efficace? De plus, si les variables sont plus (ex: 100), comment puis-je écrire la ligne de code DF$sums? Bien sûr il y a quelque chose de plus élégant que le followin:

DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6+...+DF$X99+DF$X100 

Merci

EDIT: Je me demande s'il y a un moyen d'extraire les ngrams les plus fréquents de tdm TermDocumentMatrix et après créer une trame de données avec les valeurs. Ce que je fais est de créer un dataframe avec tous les ngrams et après prendre les valeurs les plus fréquentes qui ne semblent pas être le meilleur choix.

+1

Vous pouvez utiliser 'Reduce ('+', DF)' ou 'rowSums (DF)' – akrun

+0

Relié, éventuellement dupliqué: [Extraction NGram efficace avec CPU et mémoire avec R] (http://stackoverflow.com/questions/31424687/cpu-et-memory-efficient-ngram-extraction-avec-r) – smci

Répondre

0

fonction de vos modifications, vous pouvez utiliser les éléments suivants:

my_matrix <- as.matrix(tdm[findFreqTerms(tdm, lowfreq = 2),]) 
DF <- data.frame(my_matrix, sums = rowSums(my_matrix)) 
DF 
     X1 X2 X3 X4 X5 X6 sums 
i am  1 1 0 0 0 0 2 
you are 0 0 1 1 0 0 2 
2

Il y a un moyen plus facile et plus efficace, en utilisant le quanteda package pour l'analyse de texte.

> require(quanteda) 
> dtm <- dfm(text, ngrams = 2) 
Creating a dfm from a character vector ... 
    ... lowercasing 
    ... tokenizing 
    ... indexing documents: 6 documents 
    ... indexing features: 13 feature types 
    ... created a 6 x 13 sparse dfm 
    ... complete. 
Elapsed time: 0.007 seconds. 
> topfeatures(dtm, n = 10) 
     i_am  you_are  am_good good_person  am_bad bad_person are_great are_more 
      2   2   1   1   1   1   1   1 
more_great todo_learn 
      1   1 

La matrice résultante est clairsemée et très efficace. Dans la version GitHub, la fonction ngrams() (appelée par dfm()) est implémentée en C++ pour la vitesse, donc c'est encore plus rapide.