R-Project nessun metodo applicabile per “meta” applicato a un object di class “carattere”

Sto cercando di eseguire questo codice (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))) 

Tuttavia, quando lo td.mat <- as.matrix(TermDocumentMatrix(corpus)) ottengo questo errore (nella 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 

Non sono sicuro di cosa guardare – tutti i moduli caricati.

L’ultima versione di tm (0.60) lo ha reso così che non puoi più usare le funzioni con tm_map che operano su valori di caratteri semplici. Quindi il problema è il tuo passo di tolower dato che non è una trasformazione “canonica” (vedi getTransformations() ). Basta sostituirlo con

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

Il wrapper della funzione content_transformsr convertirà tutto nel tipo di dati corretto all'interno del corpus. Puoi utilizzare content_transformsr con qualsiasi funzione intesa a manipolare i vettori di caratteri in modo che funzioni in una pipeline tm_map .

Questo è un po ‘vecchio, ma solo per scopi di ricerche successive su google: c’è una soluzione alternativa. Dopo il corpus <- tm_map(corpus, tolower) è ansible utilizzare corpus <- tm_map(corpus, PlainTextDocument) che lo corpus <- tm_map(corpus, PlainTextDocument) nel tipo di dati corretto.

Ho avuto lo stesso problema e alla fine ho trovato una soluzione:

Sembra che la meta informazione all’interno dell’object corpus venga corrotta dopo aver applicato le trasformazioni su di esso.

Quello che ho fatto è solo creare di nuovo il corpus alla fine del processo, dopo che è stato completamente pronto. Dovendo superare altri problemi, ho scritto anche un ciclo per copiare il testo nel mio 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. 

L’ordine delle operazioni su testo è importante. È necessario rimuovere le parole di arresto prima di rimuovere la punteggiatura.

Io uso il seguente per preparare il testo. Il mio testo è contenuto in cleanData $ LikeMost.

A volte, a seconda della fonte, è necessario quanto segue:

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

Alcune parole di stop sono importanti, quindi puoi creare un set rivisto.

 #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] 

Quindi, è ansible eseguire le funzioni di 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)