2015-11-08 6 views
0

Я использую следующий тм + RWeka код для извлечения наиболее часто ngrams в текстах:производительный способ извлечь наиболее часто ngrams с помощью 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)),])) 

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

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

Спасибо

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

+1

Вы можете использовать 'Сокращение ('+', DF)' или 'rowSums (DF)' – akrun

+0

Связанный, возможно дубликат: [Эффективное извлечение NGram из CPU и памяти с R] (http://stackoverflow.com/вопросы/31424687/CPU-и-память эффективно-Ngram-экстракция-с-р) – smci

ответ

0

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

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

Существует более простой и более эффективный способ, с помощью 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++ для скорости, поэтому она еще быстрее.