Errore DocumentTermMatrix sull’argomento Corpus

Ho il codice seguente:

# returns string w/o leading or trailing whitespace trim <- function (x) gsub("^\\s+|\\s+$", "", x) news_corpus <- Corpus(VectorSource(news_raw$text)) # a column of strings. corpus_clean <- tm_map(news_corpus, tolower) corpus_clean <- tm_map(corpus_clean, removeNumbers) corpus_clean <- tm_map(corpus_clean, removeWords, stopwords('english')) corpus_clean <- tm_map(corpus_clean, removePunctuation) corpus_clean <- tm_map(corpus_clean, stripWhitespace) corpus_clean <- tm_map(corpus_clean, trim) news_dtm <- DocumentTermMatrix(corpus_clean) # errors here 

Quando eseguo il metodo DocumentTermMatrix() , mi dà questo errore:

Errore: inherits (doc, “TextDocument”) non è VERO

Perché ottengo questo errore? Le mie righe non sono documenti di testo?

Ecco l’output dopo aver ispezionato corpus_clean :

     [[153]] [1] obama holds technical school model us [[154]] [1] oil boom produces jobs bonanza archaeologists [[155]] [1] islamic terrorist group expands territory captures tikrit [[156]] [1] republicans democrats feel eric cantors loss [[157]] [1] tea party candidates try build cantor loss [[158]] [1] vehicles materials stored delaware bridges [[159]] [1] hill testimony hagel defends bergdahl trade [[160]] [1] tweet selfpropagates tweetdeck [[161]] [1] blackwater guards face trial iraq shootings [[162]] [1] calif man among soldiers killed afghanistan [[163]] [1] stocks fall back world bank cuts growth outlook [[164]] [1] jabhat alnusra longer useful turkey [[165]] [1] catholic bishops keep focus abortion marriage [[166]] [1] barbra streisand visits hill heart disease [[167]] [1] rand paul cantors loss reason stop talking immigration [[168]] [1] israeli airstrike kills northern gaza 

    Modifica: ecco i miei dati:

     type,text neutral,The week in 32 photos neutral,Look at me! 22 selfies of the week neutral,Inside rebel tunnels in Homs neutral,Voices from Ukraine neutral,Water dries up ahead of World Cup positive,Who's your hero? Nominate them neutral,Anderson Cooper: Here's how positive,"At fire scene, she rescues the pet" neutral,Hunger in the land of plenty positive,Helping women escape 'the life' neutral,A tour of the sex underworld neutral,Miss Universe Thailand steps down neutral,China's 'naked officials' crackdown negative,More held over Pakistan stoning neutral,Watch landmark Cold War series neutral,In photos: History of the Cold War neutral,Turtle predicts World Cup winner neutral,What devoured great white? positive,Nun wins Italy's 'The Voice' neutral,Bride Price app sparks debate neutral,China to deport 'pork' artist negative,Lightning hits moving car neutral,Singer won't be silenced neutral,Poland's mini desert neutral,When monarchs retire negative,Murder on Street View? positive,Meet armless table tennis champ neutral,Incredible 400 year-old globes positive,Man saves falling baby neutral,World's most controversial foods 

    Quale recupero come:

     news_raw <- read.csv('news_csv.csv', stringsAsFactors = F) 

    Modifica: Ecco il traceback ():

     > news_dtm  traceback() 9: stop(sprintf(ngettext(length(r), "%s is not TRUE", "%s are not all TRUE"), ch), call. = FALSE, domain = NA) 8: stopifnot(inherits(doc, "TextDocument"), is.list(control)) 7: FUN(X[[1L]], ...) 6: lapply(X, FUN, ...) 5: mclapply(unname(content(x)), termFreq, control) 4: TermDocumentMatrix.VCorpus(x, control) 3: TermDocumentMatrix(x, control) 2: t(TermDocumentMatrix(x, control)) 1: DocumentTermMatrix(corpus_clean) 

    Quando inherits(corpus_clean, "TextDocument") è FALSE.

    Sembra che questo avrebbe funzionato bene in tm 0.5.10 ma i cambiamenti in tm 0.6.0 sembra averlo rotto. Il problema è che le funzioni tolower e trim non necessariamente restituiscono TextDocuments (sembra che la versione precedente potrebbe aver fatto automaticamente la conversione). Restituiscono invece caratteri e DocumentTermMatrix non è sicuro su come gestire un corpus di caratteri.

    Quindi potresti cambiare

     corpus_clean <- tm_map(news_corpus, content_transformer(tolower)) 

    Oppure puoi correre

     corpus_clean <- tm_map(corpus_clean, PlainTextDocument) 

    dopo tutte le trasformazioni non standard (quelle non in getTransformations() ) vengono eseguite e appena prima di creare DocumentTermMatrix. Ciò dovrebbe assicurarsi che tutti i tuoi dati siano in PlainTextDocument e rendere DocumentTermMatrix felice.

    Ho trovato un modo per risolvere questo problema in un articolo su TM.

    Un esempio in cui l’errore segue di seguito:

     getwd() require(tm) files <- DirSource(directory="texts/", encoding="latin1") # import files corpus <- VCorpus(x=files) # load files, create corpus summary(corpus) # get a summary corpus <- tm_map(corpus,removePunctuation) corpus <- tm_map(corpus,stripWhitespace) corpus <- tm_map(corpus,removePunctuation); matrix_terms <- DocumentTermMatrix(corpus) 

    Messaggi di avvertimento:

    In TermDocumentMatrix.VCorpus (x, control): identificatori di documento non validi

    Questo errore si verifica perché hai bisogno di un object della class Vector Source per fare la tua Document Document Matrix, ma le trasformazioni precedenti trasformano il tuo corpus di testi in carattere, quindi, cambiando una class che non è accettata dalla funzione.

    Tuttavia, se si aggiunge la funzione content_transformsr all'interno del comando tm_map, potrebbe non essere necessario un altro comando prima di utilizzare la funzione TermDocumentMatrix per continuare.

    Il codice seguente cambia la class (vedere la penultima riga) ed evita l'errore:

     getwd() require(tm) files <- DirSource(directory="texts/", encoding="latin1") corpus <- VCorpus(x=files) # load files, create corpus summary(corpus) # get a summary corpus <- tm_map(corpus,content_transformer(removePunctuation)) corpus <- tm_map(corpus,content_transformer(stripWhitespace)) corpus <- tm_map(corpus,content_transformer(removePunctuation)) corpus <- Corpus(VectorSource(corpus)) # change class matrix_term <- DocumentTermMatrix(corpus) 

    Cambia questo:

     corpus_clean <- tm_map(news_corpus, tolower) 

    Per questo:

     corpus_clean <- tm_map(news_corpus, content_transformer(tolower)) 

    Questo dovrebbe funzionare.

     remove.packages(tm) install.packages("http://cran.r-project.org/bin/windows/contrib/3.0/tm_0.5-10.zip",repos=NULL) library(tm)