11

テキストベースのトレーニング データとテスト データがあるとします。より具体的に言うと、トレーニングとテストの 2 つのデータ セットがあり、どちらにも、テキストを含む 1 つの列があり、目前の仕事に関心があります。

R の tm パッケージを使用して、トレーニング データ セットのテキスト列を処理しました。空白、句読点、ストップ ワードを削除した後、コーパスをステミングし、最終的に各ドキュメント内の単語の頻度/カウントを含む 1 グラムのドキュメント用語マトリックスを作成しました。次に、たとえば 50 の事前定義されたカットオフを取り、50 を超えるカウントを持つ用語のみを保持しました。

これに続いて、DTM と従属変数 (トレーニング データに存在していた) を使用して、たとえば GLMNET モデルをトレーニングします。これまでのところ、すべてがスムーズかつ簡単に実行されます。

ただし、テスト データまたは将来発生する可能性のある新しいデータでモデルをスコアリング/予測したい場合は、どうすればよいですか?

具体的には、新しいデータで正確な DTM を作成するにはどうすればよいですか?

新しいデータ セットに元のトレーニング データと同様の単語がない場合は、すべての用語のカウントが 0 になるはずです (これで問題ありません)。しかし、新しいコーパスで (構造に関して) まったく同じ DTM を複製できるようにしたいと考えています。

アイデア/考えはありますか?

4

2 に答える 2

16

tm非常に多くの落とし穴があります...質問に完全に答える、はるかに効率的なtext2vecベクトル化ビネットを参照してください。

これはtmおそらく、2 番目のコーパスの DTM マトリックスを再構築するもう 1 つの簡単な方法です。

crude2.dtm <- DocumentTermMatrix(crude2, control = list
               (dictionary=Terms(crude1.dtm), wordLengths = c(3,10)) )
于 2013-12-27T14:35:08.333 に答える
11

私の理解が正しければ、あなたは dtm を作成しており、最初の dtm と同じ列 (つまり用語) を持つ新しいドキュメントから新しい dtm を作成したいと考えています。その場合は、2 番目の dtm を最初の用語でサブセット化する必要があります。おそらく次のようになります。

最初に再現可能なデータを設定します...

これはあなたの訓練データです...

library(tm)
# make corpus for text mining (data comes from package, for reproducibility) 
data("crude")
corpus1 <- Corpus(VectorSource(crude[1:10]))    
# process text (your methods may differ)
skipWords <- function(x) removeWords(x, stopwords("english"))
funcs <- list(tolower, removePunctuation, removeNumbers,
              stripWhitespace, skipWords)
crude1 <- tm_map(corpus1, FUN = tm_reduce, tmFuns = funcs)
crude1.dtm <- DocumentTermMatrix(crude1, control = list(wordLengths = c(3,10))) 

そして、これはあなたのテストデータです...

corpus2 <- Corpus(VectorSource(crude[15:20]))  
# process text (your methods may differ)
skipWords <- function(x) removeWords(x, stopwords("english"))
funcs <- list(tolower, removePunctuation, removeNumbers,
              stripWhitespace, skipWords)
crude2 <- tm_map(corpus2, FUN = tm_reduce, tmFuns = funcs)
crude2.dtm <- DocumentTermMatrix(crude2, control = list(wordLengths = c(3,10))) 

これがあなたが望むことをするビットです:

ここで、トレーニング データに存在するテスト データの項のみを保持します...

# convert to matrices for subsetting
crude1.dtm.mat <- as.matrix(crude1.dtm) # training
crude2.dtm.mat <- as.matrix(crude2.dtm) # testing

# subset testing data by colnames (ie. terms) or training data
xx <- data.frame(crude2.dtm.mat[,intersect(colnames(crude2.dtm.mat),
                                           colnames(crude1.dtm.mat))])

最後に、テスト データにないトレーニング データの用語のすべての空の列をテスト データに追加します...

# make an empty data frame with the colnames of the training data
yy <- read.table(textConnection(""), col.names = colnames(crude1.dtm.mat),
                 colClasses = "integer")

# add incols of NAs for terms absent in the 
# testing data but present # in the training data
# following SchaunW's suggestion in the comments above
library(plyr)
zz <- rbind.fill(xx, yy)

zzテスト ドキュメントのデータ フレームも同様ですが、トレーニング ドキュメントと同じ構造です (つまり、SchaunW が指摘しているように、多くの列には NA が含まれていますが、同じ列です) 。

それはあなたが望むものに沿っていますか?

于 2013-05-20T05:55:16.313 に答える