R tm package vcorpus: ошибка в преобразовании корпуса в кадр данных

Я использую пакет tm для очистки некоторых данных с помощью следующего кода:

mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

Затем я хочу преобразовать корпус обратно в кадр данных, чтобы экспортировать текстовый файл, содержащий данные в исходном формате фрейма данных. Я пробовал следующее:

dataframe <- as.data.frame(mycorpus)

Но это возвращает ошибку:

"Ошибка в as.data.frame.default. (mycorpus): не может принуждать класс" c (vcorpus, > corpus ")" к data.frame

Как я могу преобразовать корпус в фрейм данных?

Ответы

Ответ 1

Ваш корпус действительно представляет собой вектор символов с некоторыми дополнительными атрибутами. Так что лучше всего преобразовать его в символ, тогда вы можете сохранить его в data.frame, например:

library(tm)
x <- c("Hello. Sir!","Tacos? On Tuesday?!?")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

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

который возвращает

              text
1        Hello Sir
2 Tacos On Tuesday

UPDATE: с более новой версией tm они, похоже, обновили метод as.list.SimpleCorpus, который действительно бесполезен с использованием sapply и lapply. Теперь, я думаю, вам придется использовать

dataframe <- data.frame(text=sapply(mycorpus, identity), 
    stringsAsFactors=F)

Ответ 2

Объект класса Corpus с объективом имеет атрибут content, доступный через get:

library("tm")

x <- c("Hello. Sir!","Tacos? On Tuesday?!?")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

attributes(mycorpus)
# $names
# [1] "content" "meta"    "dmeta"  
# 
# $class
# [1] "SimpleCorpus" "Corpus"      
# 

df <- data.frame(text = get("content", mycorpus))

head(df)
#               text
# 1        Hello Sir
# 2 Tacos On Tuesday

Ответ 3

Более старый ответ, отправленный MrFlick, работает только в предыдущей версии на tm, я смог исправить его, удалив контент из формулы.

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

Ответ 4

Вы можете конвертировать в data.frame, сортировать наиболее часто используемые слова и сюжет в wordcloud!

library(tm)
library("wordcloud")
library("RColorBrewer")

x <- c("Hello. Sir!","Tacos? On Tuesday?!?", "Hello")
mycorpus <- Corpus(VectorSource(x))
mycorpus <- tm_map(mycorpus, removePunctuation)

dtm <- TermDocumentMatrix(mycorpus)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 10)

#           word freq
#hello     hello    2
#sir         sir    1
#tacos     tacos    1
#tuesday tuesday    1

#plot in a wordcloud
set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

введите описание изображения здесь

Ответ 5

Это альтернативный подход, который я использовал в своей работе с текстовой аналитикой. По сути, вы ссылаетесь на матрицу терминов документа как на матрицу при преобразовании ее в фрейм данных, после чего вы можете запустить дополнительную строку, которая делает ваши имена переменных R-дружественными.

database < - as.data.frame(as.matrix(mycorpus))

colnames (database) < - make.names(colnames (database))

Я не уверен, как (или если) этот подход отличается от других ответов в терминах вывода, но я нахожу этот синтаксис гораздо более простым и простым в реализации. Надеюсь, это поможет!