2017-05-07 13 views
0

私の仕事はコーパスの文書を余弦類似度で比較することです。私はtmパッケージを使用し、TermDocumentMatrix(td-idf形式)tdmを取得します。次のタスクは、heretmのTermDocumentMatrixの2つの文書間の余弦類似度を計算する

d <- dist(tdm, method="cosine") 

または

cosine_dist_mat <- 1 - crossprod_simple_triplet_matrix(tdm)/(sqrt(col_sums(tdm^2) %*% t(col_sums(tdm^2)))) 

に述べたような単純なしかし、私のTDMにおける用語の数は、(周りに50,000の文書で)、12万以上の非常に大きいはずです。このような行列を扱うことはRの能力を超えている。 私のRStudioが数回クラッシュしました。

私の質問は1)どうすればこのような大きな行列を扱い、ペアワイズ(120,000 * 120,000)のコサイン類似度を得ることができますか? 2)不可能な場合は、一度に2つの文書のコサイン類似度を得るにはどうすればよいですか?

sim10_21<-cosine_similarity(tdm, d1=10,d2=21) 

のようなものTDMは、単純マトリクスであれば、私はTDMで計算を行うことができます[、C(10,21)]、その後、私は文書10と21の間の類似性をするとします。しかし、tdmを行列に変換することはまさに私が扱うことができないものです。私の質問は、最終的に、tdmでの行列のような計算を行う方法にまでわかります。

答えて

0

120,000 x 120,000マトリックス* 8バイト(dbl float)= 115.2ギガバイト。これは必ずしもRの能力を超えているわけではありませんが、使用する言語に関係なく、少なくともその多くのメモリが必要です。現実的には、Sqlなどのデータベース(RSQLiteパッケージなど)を使用してディスクに書き込むか、解析にRのみを使用する場合は、「ff」パッケージを使用して格納する方がよいでしょう/ディスク上の大きな行列にアクセスする。

これを繰り返し実行して、マルチスレッドして計算速度を向上させることができます。

dist(t(tdm[,1]), t(tdm[,2]), method='cosine') 

あなたはこのような何かを行うことができ、2つのドキュメント間の距離を見つけるには
関連する問題