2013-08-02 4 views
3

R을 사용하여 텍스트 마이닝에서 학기 논문을 작성하고 있습니다. Google의 과제는 기사의 음색 (양/음)을 추측하는 것입니다. 기사는 각 폴더에 저장됩니다. 트레이닝 샘플을 통해 학습 할 분류 시스템을 만들어야합니다. 코드를 다시 사용했습니다. http://www.youtube.com/watch?v=j1V2McKbkLo 마지막 줄을 제외한 전체 코드가 성공적으로 실행되었습니다. 다음은 코드입니다. 내가 이것을 실행하려고 할 때 외국 함수 호출에서 NA/NaN/Inf (arg 6)

tone<- c("Positive", "Negative") 
folderpath <- "C:/Users/Tanmay/Desktop/R practice/Week8" 

options(stringAsFactors = FALSE) 

corpus<-Corpus(DirSource(folderpath)) 
corpuscopy<-corpus 
summary(corpus) 
inspect(corpus) 

#Clean data 
CleanCorpus <- function(corpus){ 

    corpustemp <- tm_map(corpus, removeNumbers) 
    corpustemp <- tm_map(corpus, removePunctuation) 
    corpustemp <- tm_map(corpus, tolower) 
    corpustemp <- tm_map(corpus, removeWords, stopwords("english")) 
    corpustemp <- tm_map(corpus, stemDocument,language="english") 
    corpustemp <- tm_map(corpus, stripWhitespace) 

    return(corpustemp) 
} 


#Document term matrix 
generateTDM <- function(tone,path) { 

    corpusdir <- sprintf("%s/%s",path,tone) 
    corpus<- Corpus(DirSource(directory=corpusdir ,encoding = "ANSI")) 
    corpustemp <- CleanCorpus(corpus) 
    corpusclean <- DocumentTermMatrix(corpustemp) 
    corpusclean <- removeSparseTerms(corpusclean , 0.7) 
    result <- list(Tone = tone, tdm = corpusclean) 
} 

tdm <- lapply(tone,generateTDM,path=folderpath) 

#Attach tone 
ToneBindTotdm <- function(tdm){ 
    temp.mat <- data.matrix(tdm[["tdm"]]) 
    temp.df <- as.data.frame(temp.mat) 
    temp.df <- cbind(temp.df,rep(tdm[["Tone"]]),nrow(temp.df)) 
    colnames(temp.df)[ncol(temp.df)] <- "PredictTone" 
    return(temp.df) 
} 
Tonetdm <- lapply(tdm,ToneBindTotdm) 


#Stack 
Stacktdm <- do.call(rbind.fill,Tonetdm) 
Stacktdm[is.na(Stacktdm)] <- 0 


#Holdout 

trainid <- sample(nrow(Stacktdm),ceiling(nrow(Stacktdm) * 0.7)) 
testid <- (1:nrow(Stacktdm)) [- trainid] 

#knn 
tdmone <- Stacktdm[,"PredictTone"] 
tdmone.nl <- Stacktdm[, !colnames(Stacktdm) %in% "PredictTone"] 

knnPredict <- knn(tdmone.nl[trainid,],tdmone.nl[testid,],tdmone[trainid],k=5) 

, 내가 마지막 줄 (KNN)에서 오류가 발생했습니다 :

**Error in knn(tdmone.nl[trainid, ], tdmone.nl[testid, ], tdmone[trainid], : 
    NA/NaN/Inf in foreign function call (arg 6) 
In addition: Warning messages: 
1: In knn(tdmone.nl[trainid, ], tdmone.nl[testid, ], tdmone[trainid], : 
    NAs introduced by coercion 
2: In knn(tdmone.nl[trainid, ], tdmone.nl[testid, ], tdmone[trainid], : 
    NAs introduced by coercion** 

사람이 나를 도와 주 시겠어요. 또한 분류하는 다른 더 간단하고 더 나은 방법이있는 경우에 저에게 그 (것)들을 가르치십시오. 긴 게시물에 대해 고맙고 미안합니다.

+0

"강요에 의해 도입 된 NAs"는 종종 함수에 전달한 객체가 생각한 것과 다른 유형이라는 것을 의미합니다. 그러나, [재현 가능한 예] (http://stackoverflow.com/q/5963269/1412059)가 없으면 조언을하기가 어렵습니다. – Roland

+0

그러나 그것은 단지 경고의 권리입니다. 오류 메시지에 더 관심이있었습니다. – user2647221

+0

글쎄, 하나의 함수는 그것이 'NA'값을 반환했다는 경고를합니다. 나는 당신이 그것이 적절하다고 생각하지 않는 이유를 이해하지 못합니다. 결국 오류 메시지는 다른 함수가 NA/NaN/Inf를 전달한다는 것을 알려줍니다. – Roland

답변

1

같은 문제가 붙어 있습니다. 그러나 모든 NA 값을 제거하기 위해 수정했습니다. 내 코드를 검사하고 코드의 문제점을 비교할 수 있습니다.

#init 
libs <- c("tm" , "plyr" , "class") 
lapply(libs,require, character.only=TRUE) 

#set options 
options(stringsAsFactors = FALSE) 

#set parameters 

candidates <- c("user1" , "user2" ,"test") 
pathname <- "C:/Users/prabhjot.rai/Documents/Project_r/textMining" 

#clean text 

cleanCorpus <- function(corpus) 
{ 
    corpus.tmp <- tm_map(corpus, removePunctuation) 
    corpus.tmp <- tm_map(corpus.tmp, stripWhitespace) 
    corpus.tmp <- tm_map(corpus.tmp, content_transformer(tolower)) 
    corpus.tmp <- tm_map(corpus.tmp, removeWords, stopwords("english")) 
    corpus.tmp <- tm_map(corpus.tmp, PlainTextDocument) 
} 

#build TDM 

generateTDM <- function(cand,path) 
{ 
    s.dir <- sprintf("%s/%s", path, cand) 
    s.cor <- Corpus(DirSource(directory = s.dir)) 
    s.cor.cl <- cleanCorpus(s.cor) 
    s.tdm <- TermDocumentMatrix(s.cor.cl) 

    s.tdm <- removeSparseTerms(s.tdm, 0.7) 
    result <- list(name = cand , tdm = s.tdm) 
} 



tdm <- lapply(candidates, generateTDM, path = pathname) 


test <- t(data.matrix(tdm[[1]]$tdm)) 
rownames(test) <- c(1:nrow(test)) 

#attach name and convert to dataframe 
makeMatrix <- function(thisTDM){ 

    test <- t(data.matrix(thisTDM$tdm)) 
    rownames(test) <- c(1:nrow(test)) 
    test <- as.data.frame(test, stringsAsFactors = F , na.rm = T) 
    test$candidateName <- thisTDM$name 
    test <- as.data.frame(test, stringsAsFactors = F , na.rm = T) 
} 

candTDM <- lapply(tdm, makeMatrix) 

# stack all the speeches together 

tdm.stack <- do.call(rbind.fill, candTDM) 
tdm.stack[is.na(tdm.stack)] <- as.numeric(0) 

#testing and training sets 
train <- tdm.stack[ tdm.stack$candidateName!= 'test' , ] 
train <- train[, names(train) != 'candidateName'] 
test <- tdm.stack[ tdm.stack$candidateName == 'test' , ] 
test <- test[, names(test) != 'candidateName'] 
classes <- tdm.stack [ tdm.stack$candidateName != 'test' , 'candidateName'] 
classes <- as.factor(classes) 

myknn <- knn(train=train, test = test , cl = classes , k=1) 
myknn 

user1 및 user2 폴더 옆의 테스트 폴더에 테스트 파일을 보관하여이 알고리즘의 출력을 확인하십시오. 그리고 k의 값을 연설 수의 제곱근, 바람직하게는 홀수로 유지하십시오. 테스트 및 교육 세트 할당의 중복을 무시하십시오. 그것은 내 컴퓨터에서 한 줄로 작동하지 않았으므로 두 줄로 처리했습니다.