Эффективный способ извлечения наиболее частых энграмм с помощью R

Я использую следующий код tm+RWeka для извлечения наиболее часто встречающихся энграмм в текстах:

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)),]))

Он работает нормально, но что, если данных намного больше? Есть ли вычислительный более эффективный способ? Кроме того, если переменных больше (например, 100), как я могу написать строку кода DF$sums. Наверняка есть что-то более элегантное, чем следующее:

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

Спасибо

EDIT: мне интересно, есть ли способ извлечь наиболее часто встречающиеся ngrams из tdm TermDocumentMatrix и после создать фрейм данных со значениями. Что я делаю, так это создаю фрейм данных со всеми нграммами и после этого беру наиболее частые значения, что кажется не лучшим выбором.


person Mpizos Dimitris    schedule 08.11.2015    source источник
comment
Вы можете использовать либо Reduce('+', DF), либо rowSums(DF)   -  person akrun    schedule 08.11.2015


Ответы (2)


На основе вашего редактирования вы можете использовать следующее:

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
person phiver    schedule 08.11.2015

Есть более простой и эффективный способ — использование пакета quanteda для анализа текста.

> 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 

Полученная матрица является разреженной и очень эффективной. В версии GitHub функция ngrams() (которая вызывается dfm()) реализована на C++ для ускорения, поэтому она работает еще быстрее.

person Ken Benoit    schedule 09.11.2015