web-dev-qa-db-fra.com

Erreur DocumentTermMatrix sur l'argument Corpus

J'ai le code suivant:

# 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

Lorsque j'exécute la méthode DocumentTermMatrix(), cela me donne l'erreur suivante:

Erreur: hérite (doc, "TextDocument") n'est pas VRAI

Pourquoi ai-je cette erreur? Mes lignes ne sont-elles pas des documents texte?

Voici la sortie lors de l'inspection 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

Edit: Voici mes données:

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

Que je récupère comme:

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

Edit: Voici le suivi ():

> news_dtm <- DocumentTermMatrix(corpus_clean)
Error: inherits(doc, "TextDocument") is not TRUE
> 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)

Quand j’évalue inherits(corpus_clean, "TextDocument"), c’est FAUX.

56
user1477388

Il semble que cela aurait très bien fonctionné dans tm 0.5.10, mais des modifications dans tm 0.6.0 semblent l’avoir brisé. Le problème est que les fonctions tolower et trim ne renverront pas nécessairement TextDocuments (il semble que l'ancienne version ait pu automatiquement effectuer la conversion). Au lieu de cela, ils renvoient des caractères et DocumentTermMatrix n'est pas sûr de savoir comment gérer un corpus de caractères.

Afin que vous puissiez changer à 

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

Ou tu peux courir 

corpus_clean <- tm_map(corpus_clean, PlainTextDocument)

toutes vos transformations non standard (celles qui ne sont pas dans getTransformations()) sont terminées et juste avant la création de DocumentTermMatrix. Cela devrait vous assurer que toutes vos données sont dans PlainTextDocument et rendre heureux DocumentTermMatrix.

126
MrFlick

J'ai trouvé un moyen de résoudre ce problème dans un article sur la MT. 

Un exemple dans lequel l'erreur suit ci-dessous:

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)

Messages d'avertissement:

Dans TermDocumentMatrix.VCorpus (x, control): identificateurs de document non valides

Cette erreur se produit car vous avez besoin d'un objet de la classe Vector Source pour réaliser votre matrice de document à terme, mais les transformations précédentes transforment votre corpus de textes en caractères, modifiant ainsi une classe qui n'est pas acceptée par la fonction.

Cependant, si vous ajoutez la fonction content_transformer à l'intérieur de la commande tm_map, vous n'aurez peut-être pas besoin d'une commande supplémentaire avant d'utiliser la fonction TermDocumentMatrix pour continuer.

Le code ci-dessous change la classe (voir l'avant dernière ligne) et évite l'erreur:

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)
9
Rodrigo Araujo

Change ça:

corpus_clean <- tm_map(news_corpus, tolower)

Pour ça:

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

Cela devrait marcher. 

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