2014-08-28 15 views
12

Ich habe durch zahlreiche Online-Beispiele des Pakets {tm} in R gearbeitet und versucht, eine TermDocumentMatrix zu erstellen. Das Erstellen und Bereinigen eines Korpus war ziemlich einfach, aber ich erhalte immer wieder einen Fehler, wenn ich versuche, eine Matrix zu erstellen. Der Fehler ist:TermDocumentMatrix-Fehler in R

Fehler in UseMethod ("meta", x): kein anwendbares Verfahren für 'meta' auf ein Objekt der Klasse "character" angewandt Zusätzlich: Warnmeldung: In mclapply (unname (Gehalt (x)), termFreq, Kontrolle): alle geplanten Kerne sind Fehler aufgetreten in Benutzercode

Zum Beispiel, hier ist der Code von Jon Starkweather Text Mining example. Entschuldigung im Voraus für solch einen langen Code, aber dies erzeugt ein reproduzierbares Beispiel. Bitte beachten Sie, dass der Fehler am Ende mit der Funktion {tdm} kommt.

#Read in data 
policy.HTML.page <- readLines("http://policy.unt.edu/policy/3-5") 

#Obtain text and remove mark-up 
policy.HTML.page[186:202] 
id.1 <- 3 + which(policy.HTML.page == "     TOTAL UNIVERSITY  </div>") 
id.2 <- id.1 + 5 
text.data <- policy.HTML.page[id.1:id.2] 
td.1 <- gsub(pattern = "<p>", replacement = "", x = text.data, 
    ignore.case = TRUE, perl = FALSE, fixed = FALSE, useBytes = FALSE) 

td.2 <- gsub(pattern = "</p>", replacement = "", x = td.1, ignore.case = TRUE, 
    perl = FALSE, fixed = FALSE, useBytes = FALSE) 

text.d <- td.2; rm(text.data, td.1, td.2) 

#Create corpus and clean 
library(tm) 
library(SnowballC) 
txt <- VectorSource(text.d); rm(text.d) 
txt.corpus <- Corpus(txt) 
txt.corpus <- tm_map(txt.corpus, tolower) 
txt.corpus <- tm_map(txt.corpus, removeNumbers) 
txt.corpus <- tm_map(txt.corpus, removePunctuation) 
txt.corpus <- tm_map(txt.corpus, removeWords, stopwords("english")) 
txt.corpus <- tm_map(txt.corpus, stripWhitespace); #inspect(docs[1]) 
txt.corpus <- tm_map(txt.corpus, stemDocument) 

# NOTE ERROR WHEN CREATING TDM 
tdm <- TermDocumentMatrix(txt.corpus) 
+1

Ich habe diesen Beitrag gesehen, und Ihre Frage hat mich daran erinnert. Werfen Sie einen Blick auf [diesen Link] (http://stackoverflow.com/questions/24771165/r-project-no-applicable-method-for-meta-applied-to-an-object-of-class-charact). Dies kann nützlich sein. – jazzurro

+0

@jazzurro - vielen Dank für die Weiterleitung zu diesem Post! Hinzufügen von content_transformer zu der tolower in der tm_map-Funktion löste das Problem –

+1

Ich hatte eigentlich das gleiche Problem und sah diesen Beitrag. Ich bin froh, dass dein Skript jetzt funktioniert. – jazzurro

Antwort

27

Der von jazzurro bereitgestellte Link weist auf die Lösung hin. Die folgende Codezeile

txt.corpus <- tm_map(txt.corpus, tolower) 

muss

txt.corpus <- tm_map(txt.corpus, content_transformer(tolower)) 
5

für dieses Problem gibt es zwei Gründe, in tm v0.6 geändert werden.

  1. Wenn Sie Transformationen Begriff Ebene wie tolower usw. tm_map kehrt Zeichenvektor statt PlainTextDocument tun.
    Lösung: Rufen Sie tolower durch content_transformer oder tm_map(corpus, PlainTextDocument) sofort rufen nach tolower
  2. Wenn das SnowballC Paket nicht installiert ist und wenn Sie die Dokumente stammen versuchen dann auftreten, kann dies auch.
    Lösung: install.packages('SnowballC')
1

Es besteht keine Notwendigkeit content_transformer anzuwenden ist.

Erstellen Sie den Korpus auf diese Weise:

trainData_corpus <- Corpus((VectorSource(trainData$Comments))) 

es versuchen.