2015-10-18 40 views
5

Przyjrzałem się innym podobnym pytaniom, które zostały tu opublikowane (np. this), ale problem nadal występuje.Nie można przekonwertować korpusu na ramkę danych w R

Mam ramkę danych z danymi tekstowymi, które muszę pobrać. Więc zamieniam go w korpus, kładąc go, a następnie kończąc słowa z łodyg, a następnie próbując uzyskać ramkę danych jako wynik.

myCorpus <- Corpus(VectorSource(textDf$text)) 
myCorpus <- tm_map(myCorpus, removeWords, stopwords('english')) 
myCorpus <- tm_map(myCorpus, content_transformer(tolower)) 
myCorpus <- tm_map(myCorpus, removePunctuation) 
dictCorpus <- myCorpus 
myCorpus <- tm_map(myCorpus, stemDocument) 
myCorpus <- tm_map(myCorpus, stemCompletion, dictionary=dictCorpus) 

Teraz próbuję pobrać ramkę danych z tego korpusu, więc wypróbowałem następujące polecenia.

dataframe<-data.frame(text=unlist(sapply(myCorpus, '[', "content")), stringsAsFactors=F)

i

dataframe<-data.frame(text=unlist(sapply(myCorpus, [)), stringsAsFactors=F)

a także

dataframe <- 
    data.frame(id=sapply(corpus, meta, "id"), 
       text=unlist(lapply(sapply(corpus, '[', "content"),paste,collapse="\n")), 
       stringsAsFactors=FALSE) 

z this Link

Wszystkie z nich produkują następujący błąd :

Error in UseMethod("meta", x) : 
    no applicable method for 'meta' applied to an object of class "character" 

Każda pomoc zostanie bardzo doceniona.

+1

Czy możesz podać jakieś przykładowe dane? – bramtayl

+0

'textDf $ text' to wektor znaków zawierający tweety. – wrahool

Odpowiedz

8

To powinno wystarczyć:

data.frame(text = sapply(myCorpus, as.character), stringsAsFactors = FALSE) 

edytowany roztworem pracy, używając crude jako przykład

Problem polega na tym, że nie można zastosować stemCompletion jako transformacja.

getTransformations() 
## [1] "removeNumbers"  "removePunctuation" "removeWords"  "stemDocument"  "stripWhitespace" 

nie obejmuje stemCompletion, która przyjmuje wektor wynikała tokenów jako wejście.

To powinno zrobić: najpierw wyodrębniasz przekształcone teksty i tokenizuj je, a następnie zakończ łodygi, a następnie sklej ponownie. Tutaj zilustrowałem rozwiązanie za pomocą wbudowanego korpusu crude.

data(crude) 
myCorpus <- crude 
myCorpus <- tm_map(myCorpus, removeWords, stopwords('english')) 
myCorpus <- tm_map(myCorpus, content_transformer(tolower)) 
myCorpus <- tm_map(myCorpus, removePunctuation) 
dictCorpus <- myCorpus 
myCorpus <- tm_map(myCorpus, stemDocument) 
# tokenize the corpus 
myCorpusTokenized <- lapply(myCorpus, scan_tokenizer) 
# stem complete each token vector 
myTokensStemCompleted <- lapply(myCorpusTokenized, stemCompletion, dictCorpus) 
# concatenate tokens by document, create data frame 
myDf <- data.frame(text = sapply(myTokensStemCompleted, paste, collapse = " "), stringsAsFactors = FALSE) 
+1

Dzięki! To się udało. – wrahool

2

Zrekonstruowałem część twojego wcześniejszego kodu za pomocą magrittr, po prostu przyczynę.

library(dplyr) 
library(tm) 


dictCorpus = 
    c("I love my cat", "Cullen bae is bae", "4ever alone :(") %>% 
    VectorSource %>% 
    Corpus %>% 
    tm_map(removeWords, stopwords('english')) %>% 
    tm_map(content_transformer(tolower)) %>% 
    tm_map(removePunctuation) 

myCorpus = 
    dictCorpus %>% 
    tm_map(stemDocument) %>% 
    tm_map(stemCompletion, dictionary=dictCorpus) 

data = 
    data_frame(object = 
       myCorpus %>% 
       `class<-`("list") %>% 
       use_series(content)) %>% 
    rowwise %>% 
    mutate(content = 
      object %>% 
      names %>% 
      extract(1)) 
0

Trzeba przekonwertować corpus w plaintextdocument.

myCorpus <- tm_map(myCorpus, PlainTextDocument) 
1

Inna opcja:

df <- as.data.frame(as.matrix(myCorpus))