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

Cpt*_*emo 2 r apply tm

我一直在阅读不同的问题/答案(特别是在这里这里),而没有设法适用于我的情况.

我有一个11,390行矩阵,其中包含属性id,作者,文本,例如:

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"))
Run Code Online (Sandbox Code Playgroud)

我想用它创建一个tm语料库.我可以快速创建我的语料库

tm_corpus <- Corpus(VectorSource(m[,3]))
Run Code Online (Sandbox Code Playgroud)

它终止了我的11,390行矩阵的执行

   user  system elapsed 
  2.383   0.175   2.557 
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将元数据添加到语料库中时

meta(tm_corpus, type="local", tag="Author") <- m[,2]
Run Code Online (Sandbox Code Playgroud)

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

根据这里的讨论,可能会大大减少处理语料库的时间tm_map; 就像是

tm_corpus <- tm_map(tm_corpus, addMeta, m[,2])
Run Code Online (Sandbox Code Playgroud)

我仍然不知道该怎么做.可能它会是这样的

addMeta <- function(text, vector) {
  meta(text, tag="Author") = vector[??]
  text
}
Run Code Online (Sandbox Code Playgroud)

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

Den*_*sch 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")
Run Code Online (Sandbox Code Playgroud)

现在你的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"))
Run Code Online (Sandbox Code Playgroud)

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

## create the corpus
tm_corpus <- DataframeSource(matrix)
tm_corpus <- Corpus(tm_corpus,
    readerControl = list(reader=myReader))
Run Code Online (Sandbox Code Playgroud)

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

lapply(tm_corpus, as.character)
lapply(tm_corpus, meta)
## output just as expected.
Run Code Online (Sandbox Code Playgroud)

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

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