2

tm パッケージ自体は、文書と用語のマトリックスを結合する組み込みの方法を提供しますか?

同じコーパスで、それぞれ 1、2、3、4 グラムの 4 つの文書用語マトリックスを生成しました。それらはすべて非常に大きい: 200k*10k であるため、それらをデータ フレームに変換してから cbinding することは問題外です。各行列のゼロ以外の要素を記録するプログラムを作成し、スパース行列を構築できることは知っていますが、それは大変な作業です。tm パッケージがこの機能を提供するのは当然のことです。もしそうなら、私はすでに構築されたものを再構築したくありません。

そうでない場合、プログラムを作成して dtms のゼロ以外の要素のインデックスを記録してから疎行列を作成するよりも、dtms を組み合わせる便利な方法はありますか?

4

2 に答える 2

4

試しましたtm_combineか?c次のようなジェネリック関数を介して使用できます。

require(tm)
data("acq")
data("crude")
summary(c(acq, crude))
summary(c(acq[[30]], crude[[10]]))
c(TermDocumentMatrix(acq), TermDocumentMatrix(crude))
于 2013-11-15T05:14:07.067 に答える
0

例として、 corpus に対して 2 つのドキュメント用語マトリックス (1 つはユニグラム用、もう 1 つはバイグラム用) を作成しますacq

library(tm)
data(acq)

tokenize_bigrams <- function(x) {
  rownames(as.data.frame(unclass(tau::textcnt(x$content, method="string", n=2))))
}

m1 <- DocumentTermMatrix(acq)
m2 <- DocumentTermMatrix(acq, control=list(tokenize=tokenize_bigrams))

dim(m1)
# [1]   50 2103

dim(m2)
# [1]   50 5100

を使用してそれらを結合しますcbind。これは、単純なトリプレット行列のメソッドを提供するtmpackage に依存しているため機能します。slamcbind

m <- cbind(m1, m2)

dim(m)
# [1]   50 7203

予想どおり、結果の行列mには 50 行 ( の 50 ドキュメントの場合acq) と 7203 列 (ユニグラムの場合は 2103 + バイグラムの場合は 5100) があります。

mは単純なトリプレット行列であることに注意してください。

m
# A 50x7203 simple triplet matrix.

これを文書用語マトリックスとして使用する場合は、次のようにします。

attributes(m) <- attributes(m1)

それで:

m
# <<DocumentTermMatrix (documents: 50, terms: 7203)>>
# Non-/sparse entries: 10706/349444
# Sparsity           : 97%
# Maximal term length: 29
# Weighting          : term frequency (tf)
于 2017-10-20T13:38:02.673 に答える