如何使用tm_map向tm Corpus对象添加元数据

时间:2014-01-10 04:07:47

标签: r apply tm

我一直在阅读不同的问题/答案(特别是herehere)而没有设法应用于我的情况。

我有一个11,390行矩阵,其中包含属性id,author,text,如:

library(tm)

m <- cbind(c("01","02","03","04","05","06"),
           c("Author1","Author2","Author2","Author3","Author3","Auhtor4"),
           c("Text1","Text2","Text3","Text4","Text5","Text6"))

我想用它创建一个tm语料库。我可以用

快速创建语料库
tm_corpus <- Corpus(VectorSource(m[,3]))

终止

中我的11,390行矩阵的执行
   user  system elapsed 
  2.383   0.175   2.557 

但是当我尝试使用

将元数据添加到语料库时
meta(tm_corpus, type="local", tag="Author") <- m[,2]

执行时间超过15分钟并计数(然后我停止执行)。

根据讨论here,有可能大大减少使用tm_map处理语料库的时间;

之类的东西
tm_corpus <- tm_map(tm_corpus, addMeta, m[,2])

仍然我不知道该怎么做。可能它会像

addMeta <- function(text, vector) {
  meta(text, tag="Author") = vector[??]
  text
}

首先,如何将tm_map传递给要分配给语料库每个文本的值向量?我应该在循环中调用该函数吗?我应该将tm_map函数括在vapply吗?

3 个答案:

答案 0 :(得分:7)

您是否已尝试过优秀的readTabular

## your sample data
matrix <- cbind(c("01","02","03","04","05","06"),
       c("Author1","Author2","Author2","Author3","Author3","Auhtor4"),
       c("Text1","Text2","Text3","Text4","Text5","Text6"))

## simple transformations
matrix <- as.data.frame(matrix)
names(matrix) <- c("id", "author", "content")

现在你的ex-matrix now data.frame可以使用readTabular作为语料库轻松阅读。 ReadTabular希望您定义一个本身采用映射的Reader。在您的映射中,“内容”指向文本数据和其他名称 - 好 - 指向元。

## define myReader, which will be used in creation of Corpus
myReader <- readTabular(mapping=list(id="id", author="author", content="content"))

现在除了小小的变化之外,语料库的创建与以往一样:

## create the corpus
tm_corpus <- DataframeSource(matrix)
tm_corpus <- Corpus(tm_corpus,
    readerControl = list(reader=myReader))

现在看一下第一项的内容和元数据:

lapply(tm_corpus, as.character)
lapply(tm_corpus, meta)
## output just as expected.

这应该很快,因为它是包的一部分,极易适应。在我自己的项目中,我在一个带有大约20个变量的data.table上使用它 - 它就像一个魅力。

但是,我无法为您已经批准的答案提供基准测试。我只是觉得它更快更有效。

答案 1 :(得分:3)

tm_map更快,这是可行的方法。你应该在这里使用全球计数器。

auths <- paste0('Author',seq(11390))
i <- 0
tm_corpus = tm_map(tm_corpus, function(x) {
   i <<- i +1
   meta(x, "Author") <- m[i,2]
   x
})

答案 2 :(得分:0)

由于不建议使用tm包中的readTabular,因此现在的解决方案可能是这样的:

matrix <- cbind(c("Author1","Author2","Author2","Author3","Author3","Auhtor4"),
                c("Text1","Text2","Text3","Text4","Text5","Text6"))
matrix <- as.data.frame(matrix)
names(matrix) <- c("doc_id", "text")
tm_corpus <- DataframeSource(matrix)
tm_corpus <- Corpus(tm_corpus)
inspect(tm_corpus)
meta(tm_corpus)