R tm包 vcorpus: 将语料库转换为数据框时出错

17

我正在使用tm包来清理一些数据,使用以下代码:

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

我之后想将语料库转换回数据框以便导出文本文件,其中包含原始数据框的格式。我尝试了以下方法:

dataframe <- as.data.frame(mycorpus)

但是这会返回一个错误:

"Error in as.data.frame.default.(mycorpus) : cannot coerce class "c(vcorpus, > corpus")" to a data.frame

我该如何将语料库转换为数据框?


4
library(qdap); as.data.frame(mycorpus) 可能会有用。 - Tyler Rinker
6个回答

25

你的语料库实际上只是一个带有一些额外属性的字符向量。因此,最好将其转换为字符,然后可以将其保存到数据框中,如下所示:

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

更新:使用较新版本的tm时,他们似乎已经更新了as.list.SimpleCorpus方法,这会使得使用sapplylapply变得非常混乱。现在我想你可能需要使用

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

谢谢!我看到返回的是一个数据框,其中包含第一实例中包含摘要数据的列表?(1 list(list(content = "Hello Sir", meta = list(author...) - lmcshane

5

Corpus类对象有一个通过get访问的content属性:

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
你可以转换为数据框,对最常见的单词进行排序,并在词云中绘制!
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"))

enter image description here


3

之前的回答只在早期的tm版本中有效,我通过从公式中删除内容来解决了问题。

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

奇怪,我正在使用tm版本0.6(目前在CRAN上),Flick的答案对我有效。 - Tyler Rinker
你好 - 我在转换过程中遇到了这个错误。有什么想法吗?> data.frame(text = unlist(sapply(ccorpus_clean, [, "content")), stringsAsFactors = F) UseMethod("meta", x)的错误: 对于“try-error”类的对象,没有适用的'meta'方法 - myloginid

0

这是我在文本分析工作中使用的另一种方法。基本上,您将文档术语矩阵转换为数据框时,将其称为矩阵 - 然后可以运行附加行,使您的变量名称符合 R 的命名规则。

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

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

我不确定这种方法在输出方面是否与其他答案有所不同,但我发现这种语法更直观和更简单易行。希望这可以帮到您!


0
现在有一个叫做 textreg 的包,其中有一个很好的函数可以实现这个功能:
library(textreg)
df <- data.frame(text = convert.tm.to.character(mycorpus))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接