0

次の tm+RWeka コードを使用して、テキスト内で最も頻繁に使用される ngram を抽出しています。

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

問題なく動作していますが、データが大きすぎる場合はどうなりますか? より効率的な計算方法はありますか?DF$sumsさらに、変数がより多い場合(例:100)、コード行をどのように記述できますか。確かに、次のものよりもエレガントなものがあります。

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

ありがとうございました

編集: TermDocumentMatrix から最も頻繁な ngram を抽出tdm し、値を使用してデータフレームを作成する方法があるかどうか疑問に思っています。私がやっていることは、すべての ngram を含むデータフレームを作成し、最も頻繁に使用される値を取得することです。これは最良の選択ではないようです。

4

2 に答える 2

1

テキスト分析に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++ で実装されているため、さらに高速です。

于 2015-11-09T17:59:25.933 に答える
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
于 2015-11-08T19:29:10.080 に答える