我一直在阅读不同的问题/答案(特别是here和here)而没有设法应用于我的情况。
我有一个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
吗?
答案 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)