4

いくつかのコンテキスト: R でのテキスト分類と大きな疎行列の操作

私は、text2vecパッケージとcaret. 計画はtext2vec、ドキュメント用語マトリックスの構築、ボキャブラリの削除、およびあらゆる種類の前処理に使用することです。その後、さまざまなモデルを試しcaretますが、トレーニング時にキャレットが次のようなエラーをスローするため、結果を得ることができません。 :

+ Fold02.Rep1: cost=0.25 
predictions failed for Fold01.Rep1: cost=0.25 Error in as.vector(data) : 
no method for coercing this S4 class to a vector

これは、すべての折り畳みと繰り返しで発生します。キャレットがいくつかの計算を行う必要があるため、生成されるドキュメント用語マトリックスをベクトルに変換するときに問題があると思いtext2vecますが、正直なところよくわかりません。それがこの質問の主な理由です。

いくつかのスキップされた部分を含む、使用されたコードは次のようになります。caret返されるドキュメント用語マトリックスの直接の結果をフィードすることに注意してくださいtext2vec。これが問題ないかどうかは完全にはわかりません。

library(text2vec)
library(caret)
data("movie_review")
train = movie_review[1:4000, ]
test = movie_review[4001:5000, ]

it <- itoken(train$review, preprocess_function = tolower, tokenizer = word_tokenizer)
vocab <- create_vocabulary(it, stopwords = tokenizers::stopwords())
pruned_vocab <- prune_vocabulary(vocab, term_count_min = 10, doc_proportion_max = 0.5, doc_proportion_min = 0.001)

vectorizer <- vocab_vectorizer(pruned_vocab)
it = itoken(train$review, tokenizer = word_tokenizer, ids = train$id)
dtm_train = create_dtm(it, vectorizer)
it = itoken(test$review, tokenizer = word_tokenizer, ids = test$id)
dtm_test = create_dtm(it, vectorizer)

ctrl.svm.1 <- trainControl(method="repeatedcv",
                           number=10,
                           repeats=5,
                           summaryFunction = multiClassSummary,
                           verboseIter = TRUE)

fit.svm.1 <- train(x = dtm_train, y= as.factor(train$sentiment), 
                   method="svmLinear2",  
                   metric="Accuracy", 
                   trControl = ctrl.svm.1, 
                   scale = FALSE, verbose = TRUE)

私が言ったように、train() 関数を起動すると問題が発生します。dtm_train オブジェクトのクラスは次のとおりです。

[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

そして、構造は次のようになります。

str(dtm_train)
> Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:368047] 2582 2995 3879 3233 2118 2416 2468 2471 3044 3669 ...
  ..@ p       : int [1:6566] 0 0 3 4 4 10 10 14 14 22 ...
  ..@ Dim     : int [1:2] 4000 6565
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:4000] "5814_8" "2381_9" "7759_3" "3630_4" ...
  .. ..$ : chr [1:6565] "floriane" "lil" "elm" "kolchak" ...
  ..@ x       : num [1:368047] 1 1 1 1 1 1 2 2 1 3 ...
  ..@ factors : list()

私は何を間違っていますか?ドキュメントでキャレットができることを意味しているのに、なぜキャレットはこの種のデータを操作できないのですか?

4

1 に答える 1

4

S4 クラス dtm_train を単純な行列に変換すると、コードが機能します。

fit.svm.1 <- train(x = as.matrix(dtm_train), y= as.factor(train$sentiment), 
                   method="svmLinear2",  
                   metric="Accuracy", 
                   trControl = ctrl.svm.1, 
                   scale = FALSE, verbose = TRUE)

dtm_test に対しても同じことを行うことを忘れないでください。そうしないと、予測関数も文句を言います。

pred <- predict(fit.svm.1, newdata = as.matrix(dtm_test)

于 2016-08-06T08:15:18.460 に答える