私が正しく理解していれば、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が含まれています)。
あなたが望む線に沿っているのですか?
(と私は私が持ってわからないんだけど、何を実証する再現可能な例なし:ここ
tm
についてはは、おそらく第二コーパスのためのDTM行列を再構築するためのもう一つの簡単な方法ですこれを行う最も簡単な方法は、すべてのデータを使用して用語 - 文書行列を作成し、その行列をテストとトレーニングのセットに分割することです。そうすれば、たとえ1つの行列に複数の項の零点しかない場合でも、両方の行列にすべての項を表すことができます。用語 - 文書行列を作成する前にデータを分割しているため、問題が発生しています。 – SchaunW
私はSchaunに同意しますが、私が現在持っているテストデータでのみ行うことができます。私は明日新しいデータを取得するときに動作するソリューションを探しています。それ以外の場合は、常に新しいデータを既存のデータに追加することは苦痛であり、DTMを再作成し、毎回モデルを再学習します。 – Godel
また、使用するサンプルデータを用意することで、質問に簡単に答えることができます。これについては、新しいデータをterm-document行列に変換し、 'plyr'パッケージの' rbind.fill'関数を使用して古いデータにバインドしてください。これにより元の両方の行列のすべての列を持つ新しい行列が作成されます。トレーニングデータに含まれていなかった新しいデータの用語については、トレーニングデータにはNAsの列が含まれます。それらの列を削除することができます。あなたの新しいデータはあなたのトレーニングデータに含まれていても新しいデータには含まれていませんが、それらのNAをゼロで置き換えることができます。 – SchaunW