2013-08-02 49 views
3

我正在使用R進行文本挖掘中的術語表。我們的任務是猜測文章的語調(正面/負面)。文章存儲在相應的文件夾中。我需要創建一個分類系統,通過訓練樣本學習。 我重用了http://www.youtube.com/watch?v=j1V2McKbkLo的代碼 除最後一行外的所有代碼都已成功執行。以下是代碼。國外函數調用中的NA/NaN/Inf(參數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的值作爲發言次數的平方根,最好是一個奇數。並忽略測試和訓練集分配的冗餘。它不是在我的機器上的一條線上工作,所以它在兩條線上。