2014-03-03 2 views
1

문서 분류 작업에 지원 벡터 머신을 사용하고 있습니다! 그것은 훈련 세트에있는 모든 나의 기사를 분류하고, 그러나 나의 시험 세트에있는 그들을 분류하지 못한다! trainDTM은 교육 세트의 문서 용어 매트릭스입니다. testDTM은 테스트 세트를위한 것입니다.지원 벡터 기계는 R (e1071 사용)의 테스트 세트가 아닌 교육 세트에서 작동합니다.

# create data.frame with labelled sentences 

labeled <- as.data.frame(read.xlsx("C:\\Users\\LABELED.xlsx", 1, header=T)) 

# create training set and test set 
traindata <- as.data.frame(labeled[1:700,c("ARTICLE","CLASS")]) 
testdata <- as.data.frame(labeled[701:1000, c("ARTICLE","CLASS")]) 

# Vector, Source Transformation 
trainvector <- as.vector(traindata$"ARTICLE") 
testvector <- as.vector(testdata$"ARTICLE") 
trainsource <- VectorSource(trainvector) 
testsource <- VectorSource(testvector) 

# CREATE CORPUS FOR DATA 
traincorpus <- Corpus(trainsource) 
testcorpus <- Corpus(testsource) 

# my own stopwords 
sw <- c("i", "me", "my") 

## CLEAN TEXT 

# FUNCTION FOR CLEANING 
cleanCorpus <- function(corpus){ 
    corpus.tmp <- tm_map(corpus, removePunctuation) 
    corpus.tmp <- tm_map(corpus.tmp,stripWhitespace) 
    corpus.tmp <- tm_map(corpus.tmp,tolower) 
    corpus.tmp <- tm_map(corpus.tmp, removeWords, sw) 
    corpus.tmp <- tm_map(corpus.tmp, removeNumbers) 
    corpus.tmp <- tm_map(corpus.tmp, stemDocument, language="en") 
    return(corpus.tmp)} 

# CLEAN CORP WITH ABOVE FUNCTION 
traincorpus.cln <- cleanCorpus(traincorpus) 
testcorpus.cln <- cleanCorpus(testcorpus) 

## CREATE N-GRAM DOCUMENT TERM MATRIX 
# CREATE N-GRAM TOKENIZER 

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 1)) 

# CREATE DTM 
trainmatrix.cln.bi <- DocumentTermMatrix(traincorpus.cln, control = list(tokenize = BigramTokenizer)) 
testmatrix.cln.bi <- DocumentTermMatrix(testcorpus.cln, control = list(tokenize = BigramTokenizer)) 

# REMOVE SPARSE TERMS 
trainDTM <- removeSparseTerms(trainmatrix.cln.bi, 0.98) 
testDTM <- removeSparseTerms(testmatrix.cln.bi, 0.98) 

# train the model 
SVM <- svm(as.matrix(trainDTM), as.factor(traindata$CLASS)) 

# get classifications for training-set 
results.train <- predict(SVM, as.matrix(trainDTM)) # works fine! 

# get classifications for test-set 
results <- predict(SVM,as.matrix(testDTM)) 

Error in scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", : 
    length of 'center' must equal the number of columns of 'x' 

내가이 오류를 이해하지 않습니다 여기 내 (너무 아름답 지) 코드입니다. '중심'이란 무엇입니까?

감사합니다.

+0

왜 그것이 과도한 문제라고 생각합니까? 모델이 너무 많아도 새 데이터를 분류 할 수 있어야합니다. – cptn

답변

4

기차 및 시험 데이터는 동일한 지형 공간 내에 있어야합니다. 그런 식으로 두 건물을 분리하면 DTM이 작동하지 않습니다.

사용 RTextTools있는 솔루션 :

DocTermMatrix <- create_matrix(labeled, language="english", removeNumbers=TRUE, stemWords=TRUE, ...) 
container <- create_container(DocTermMatrix, labels, trainSize=1:700, testSize=701:1000, virgin=FALSE) 
models <- train_models(container, "SVM") 
results <- classify_models(container, models) 

또는, 당신은 프로젝션 ('기능') (DocumentTermMatrix를) 어휘를 지정할 수 있습니다 (e1071)와 함께 귀하의 질문에 대답하기 :

DocTermMatrixTrain <- DocumentTermMatrix(Corpus(VectorSource(trainDoc))); 
Features <- DocTermMatrixTrain$dimnames$Terms; 

DocTermMatrixTest <- DocumentTermMatrix(Corpus(VectorSource(testDoc)),control=list(dictionary=Features)); 
+0

전체 코드를 추가 했으므로 TDM 빌드 방법을 볼 수 있습니다 – cptn

+0

@ brobertie : 감사합니다. 접근 방식이 효과가 있습니다! 나는 RTextTools를 너무 많이 사용하는 것을 좋아하지 않는다. 스톱 워드 제거, 부정 처리, n-grams 등과 같은 전처리 단계를 제어 (또는 내가 제어 할 수 없다)라고 생각하지 않기 때문이다. btw. 두 개의 분리 된 TDM으로 기사를 분할하는 것은 순진한 Bayes 분류자를 사용하면 효과가있는 것 같습니다. 하지만 어떻게 든 SVM을 사용하여 작동하게 만들 수는 없습니다. – cptn

+0

@ brobertie : e1071을 사용하여 SVM을 작성하는 방법을 알고 있습니까? – cptn

관련 문제