R-Proyecto ningún método aplicable para ‘meta’ aplicado a un objeto de clase “personaje”

Estoy tratando de ejecutar 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))) 

Sin embargo, cuando lo ejecuto obtengo este error (en la línea 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 cores encountered errors in user code 

No estoy seguro de qué mirar: todos los módulos cargados.

    La última versión de tm (0.60) lo hizo para que no pueda usar funciones con tm_map que operan en valores de caracteres simples. Entonces, el problema es su paso más tolower ya que no se trata de una transformación “canónica” (consulte getTransformations() ). Solo reemplázalo con

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

    El contenedor de funciones content_transformer convertirá todo al tipo de datos correcto dentro del corpus. Puede usar content_transformer con cualquier función que esté destinada a manipular vectores de caracteres para que funcione en una tubería tm_map .

    Esto es un poco viejo, pero solo para fines de búsquedas posteriores en Google: hay una solución alternativa. Después de corpus < - tm_map(corpus, tolower) puede usar corpus < - tm_map(corpus, PlainTextDocument) que lo devuelve al tipo de datos correcto.

    Tuve el mismo problema, y ​​finalmente llegué a una solución:

    Parece que la metainformación dentro del objeto corpus se corrompe después de aplicar transformaciones en él.

    Lo que hice fue simplemente crear nuevamente el corpus al final del proceso, una vez que estuvo completamente listo. Al tener que superar otros problemas, escribí también un ciclo para copiar el texto a mi 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. 

    El orden de las operaciones en el texto importa. Debe eliminar las palabras de suspenso antes de eliminar la puntuación.

    Yo uso lo siguiente para preparar el texto. Mi texto está contenido en cleanData $ LikeMost.

    A veces, dependiendo de la fuente, primero necesita lo siguiente:

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

    Algunas palabras de detención son importantes, por lo que puede crear un 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] 

    Entonces, puedes ejecutar tus funciones 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)