2011-07-28 3 views
14

は私が行うとき、私は(tmパッケージからの)文書の用語行列データのたくさんのマトリックスにドキュメントタームマトリックスを変換すると、オーバーフロー

dtm <- TermDocumentMatrix(
    myCorpus, 
    control = list(
     weight = weightTfIdf, 
     tolower=TRUE, 
     removeNumbers = TRUE, 
     minWordLength = 2, 
     removePunctuation = TRUE, 
     stopwords=stopwords("german") 
    )) 

に立つのは、ここではいくつかのテキストマイニング

をやってみましょう引き起こし私はそれが「リスト」で、構造が

のように見えることがわかり

typeof(dtm) 

Docs 
Terms  1 2 ... 
    lorem  0 0 ... 
    ipsum  0 0 ... 
    ...  ....... 

だから私は、1000のドキュメントのために働く

wordMatrix = as.data.frame(t(as.matrix( dtm))) 

を試してみてください。

しかし、私が40000を使用しようとすると、もはやそれはありません。

が、私はこのエラーを取得:ベクトルで

Fehler in vector(typeof(x$v), nr * nc) : Vektorgröße kann nicht NA sein 
Zusätzlich: Warnmeldung: 
In nr * nc : NAs durch Ganzzahlüberlauf erzeugt 

エラーを...:ベクトルは、NA 追加することはできません。

だから、整数オーバーフローにより作成されたNR * NCのNAで I as.matrixを見て、何とか関数がas.vectorと行列よりもベクトルに変換することが判明しました。 ベクトルへの変換は機能しますが、ベクトルから行列への変換は機能しません。

何か問題がありますか?

おかげで、キャプテン

+2

メモリの制限の下で、あなたのDTMを取得する簡単な方法'TM :: removeSparseTerms'機能 – Ben

+1

を使用して、スパース用語を削除することであってもよい最初の場所で非常に稀または単独に発生する用語を含む回避するための簡単な方法は=' DocumentTermMatrix(...、コントロール(...境界を使用することですリスト(グローバル=のC(N、INF)))) 'と例えばにNを設定します2,3,4 ...サイズが十分に小さくなるまで。明確化のため – smci

答えて

17

整数オーバーフローの問題があり、正確に何を告げる:40000の文書で、あなたはあまりにも多くのデータを持っています。それはあなたが基本的な機能のコードを見れば見ることができる問題はところで始まる行列、への変換である:

class(dtm) 
[1] "TermDocumentMatrix" "simple_triplet_matrix" 

getAnywhere(as.matrix.simple_triplet_matrix) 

A single object matching ‘as.matrix.simple_triplet_matrix’ was found 
... 
function (x, ...) 
{ 
    nr <- x$nrow 
    nc <- x$ncol 
    y <- matrix(vector(typeof(x$v), nr * nc), nr, nc) 
    ... 
} 

これは、エラーメッセージが参照するラインです。何が起こっている、簡単でシミュレートすることができます。これはAPPXよりも大きい場合

as.integer(40000 * 60000) # 40000 documents is 40000 rows in the resulting frame 
[1] NA 
Warning message: 
NAs introduced by coercion 

機能vector()は、この場合nr*ncには、長さの引数を取ります。 2e9(.Machine$integer.max)は、NAに置き換えられます。このNAはvector()の引数としては無効です。

ボトムライン:あなたはRの限界に走っています。今のところ、64ビットで作業することは役に立ちません。さまざまな方法に頼らざるを得なくなります。 1つの可能性は、あなたが持っているリスト(dtmはリストです)で作業を続行し、リスト操作を使用して必要なデータを選択し、そこから移動することです。

PS:私は、ここで私は最近

DTM=t(TDM)#taking the transpose of Term-Document Matrix though not necessary but I prefer DTM over TDM 
M=as.big.matrix(x=as.matrix(DTM))#convert the DTM into a bigmemory object using the bigmemory package 
M=as.matrix(M)#convert the bigmemory object again to a regular matrix 
M=t(M)#take the transpose again to get TDM 

DTMは絶対に任意であり得るためにTDMの撮影転置を注意してください発見は非常に、非常に簡単な解決策がある

require(tm) 
data("crude") 
dtm <- TermDocumentMatrix(crude, 
          control = list(weighting = weightTfIdf, 
             stopwords = TRUE)) 
+0

感謝。私はDTMを疎しようと、私はconvertionを実行することができるよということを願っています。 –

3

でDTMオブジェクトを作りましたそれは私が私の大学でちょうど新鮮なエントリーだったようPSCouldは4年前の質問に答えていない

マトリックスと、このように再生するには、私の個人的な好みです

0

ヨリスMeysの回答に基づいて、私は解決策を見つけました。 「ベクター()」マニュアルに関する「長さ」引数

... For a long vector, i.e., length > .Machine$integer.max, it has to be of type "double"...

だから我々は(as.matrixの小さな修正を行うことができます):

as.big.matrix <- function(x) { 
    nr <- x$nrow 
    nc <- x$ncol 
    # nr and nc are integers. 1 is double. Double * integer -> double 
    y <- matrix(vector(typeof(x$v), 1 * nr * nc), nr, nc) 
    y[cbind(x$i, x$j)] <- x$v 
    dimnames(y) <- x$dimnames 
    y 
} 
関連する問題