R-Project não aplica método para ‘meta’ aplicado a um object de class “character”

Eu estou tentando executar este código (Ubuntu 12.04, R 3.1.1)

# Load requisite packages library(tm) library(ggplot2) library(lsa) # Place Enron email snippets into a single vector. text <- c( "To Mr. Ken Lay, I'm writing to urge you to donate the millions of dollars you made from selling Enron stock before the company declared bankruptcy.", "while you netted well over a $100 million, many of Enron's employees were financially devastated when the company declared bankruptcy and their retirement plans were wiped out", "you sold $101 million worth of Enron stock while aggressively urging the company's employees to keep buying it", "This is a reminder of Enron's Email retention policy. The Email retention policy provides as follows . . .", "Furthermore, it is against policy to store Email outside of your Outlook Mailbox and/or your Public Folders. Please do not copy Email onto floppy disks, zip disks, CDs or the network.", "Based on our receipt of various subpoenas, we will be preserving your past and future email. Please be prudent in the circulation of email relating to your work and activities.", "We have recognized over $550 million of fair value gains on stocks via our swaps with Raptor.", "The Raptor accounting treatment looks questionable. a. Enron booked a $500 million gain from equity derivatives from a related party.", "In the third quarter we have a $250 million problem with Raptor 3 if we don't “enhance” the capital structure of Raptor 3 to commit more ENE shares.") view <- factor(rep(c("view 1", "view 2", "view 3"), each = 3)) df <- data.frame(text, view, stringsAsFactors = FALSE) # Prepare mini-Enron corpus corpus <- Corpus(VectorSource(df$text)) corpus <- tm_map(corpus, tolower) corpus <- tm_map(corpus, removePunctuation) corpus <- tm_map(corpus, function(x) removeWords(x, stopwords("english"))) corpus <- tm_map(corpus, stemDocument, language = "english") corpus # check corpus # Mini-Enron corpus with 9 text documents # Compute a term-document matrix that contains occurrance of terms in each email # Compute distance between pairs of documents and scale the multidimentional semantic space (MDS) onto two dimensions td.mat <- as.matrix(TermDocumentMatrix(corpus)) dist.mat <- dist(t(as.matrix(td.mat))) dist.mat # check distance matrix # Compute distance between pairs of documents and scale the multidimentional semantic space onto two dimensions fit <- cmdscale(dist.mat, eig = TRUE, k = 2) points <- data.frame(x = fit$points[, 1], y = fit$points[, 2]) ggplot(points, aes(x = x, y = y)) + geom_point(data = points, aes(x = x, y = y, color = df$view)) + geom_text(data = points, aes(x = x, y = y - 0.2, label = row.names(df))) 

No entanto, quando eu executo, recebo este erro (na linha td.mat <- as.matrix(TermDocumentMatrix(corpus)) ):

 Error in UseMethod("meta", x) : no applicable method for 'meta' applied to an object of class "character" In addition: Warning message: In mclapply(unname(content(x)), termFreq, control) : all scheduled colors encountered errors in user code 

Não tenho certeza do que procurar – todos os módulos carregados.

A versão mais recente do tm (0.60) fez com que você não pudesse mais usar funções com o tm_map que operam em valores de caracteres simples. Portanto, o problema é seu passo mais tolower já que isso não é uma transformação “canônica” (Veja getTransformations() ). Basta substituí-lo por

 corpus < - tm_map(corpus, content_transformer(tolower)) 

O wrapper de function content_transformer irá converter tudo para o tipo de dados correto dentro do corpus. Você pode usar o content_transformer com qualquer function que tenha a intenção de manipular vetores de caracteres para que funcione em um pipeline tm_map .

Isso é um pouco antigo, mas apenas para fins posteriores de pesquisas no Google: há uma solução alternativa. Depois do corpus < - tm_map(corpus, tolower) você pode usar o corpus < - tm_map(corpus, PlainTextDocument) que volta ao tipo correto de dados.

Eu tive o mesmo problema e finalmente cheguei a uma solução:

Parece que as informações meta dentro do object corpus são corrompidas depois de aplicar as transformações nele.

O que eu fiz foi apenas criar novamente o corpus no final do processo, depois que ele estivesse completamente pronto. Tendo que superar outros problemas, escrevi também um loop para copiar o texto de volta ao meu dataframe:

 a< - list() for (i in seq_along(corpus)) { a[i] <- gettext(corpus[[i]][[1]]) #Do not use $content here! } df$text <- unlist(a) corpus <- Corpus(VectorSource(df$text)) #This action restores the corpus. 

A ordem das operações no texto é importante. Você deve remover palavras de parada antes de remover a pontuação.

Eu uso o seguinte para preparar o texto. Meu texto está contido em cleanData $ LikeMost.

Às vezes, dependendo da fonte, você precisa do seguinte primeiro:

 textData$LikeMost < - iconv(textData$LikeMost, to = "utf-8") 

Algumas palavras de parada são importantes, portanto, você pode criar um conjunto revisado.

 #create revised stopwords list newWords < - stopwords("english") keep <- c("no", "more", "not", "can't", "cannot", "isn't", "aren't", "wasn't", "weren't", "hasn't", "haven't", "hadn't", "doesn't", "don't", "didn't", "won't") newWords <- newWords [! newWords %in% keep] 

Então, você pode executar suas funções do tm:

 like < - Corpus(VectorSource(cleanData$LikeMost)) like <- tm_map(like,PlainTextDocument) like <- tm_map(like, removeWords, newWords) like <- tm_map(like, removePunctuation) like <- tm_map(like, removeNumbers) like <- tm_map(like, stripWhitespace)