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 ...
  ...        .......

だから私は試してみます

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

これは1000ドキュメントで機能します。

しかし、私が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 * ncNA

そこで、as.matrixを調べたところ、関数がそれを行列ではなくas.vectorを使用したベクトルに変換していることがわかりました。ベクトルへの変換は機能しますが、ベクトルからマトリックスへの変換は機能しません。

何が問題になるのか、何か提案はありますか?

ありがとう、キャプテン

4

3 に答える 3

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)
   ...
}

これは、エラーメッセージによって参照される行です。何が起こっているのか、次の方法で簡単にシミュレートできます。

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

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

結論:あなたはRの限界に直面しています。今のところ、64ビットでの作業は役に立ちません。別の方法に頼る必要があります。1つの可能性は、リスト操作(dtmはリスト)を使用して作業を続行し、リスト操作を使用して必要なデータを選択し、そこから移動することです。

PS:私はdtmオブジェクトを作成しました

require(tm)
data("crude")
dtm <- TermDocumentMatrix(crude,
                          control = list(weighting = weightTfIdf,
                                         stopwords = TRUE))
于 2011-07-28T14:53:26.297 に答える
4

これは私が最近発見した非常に単純な解決策です

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を転置することは絶対にオプションであることに注意してください。このようにマトリックスで遊ぶのは、私の個人的な好みです。

私は大学に入学したばかりだったので、PSCは4年前に質問に答えることができませんでした

于 2015-10-08T11:59:58.893 に答える
0

Joris Meysの回答に基づいて、私は解決策を見つけました。「長さ」引数に関する「vector()」ドキュメント

...長いベクトル、つまり長さ> .Machine $ integer.maxの場合、タイプは「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
}
于 2016-08-19T10:35:28.763 に答える