tm 的文档解释了这一点,如果您深入了解(请参阅??tm::DublicCore)。来自文档:
语料库有两种元数据。语料库元数据(“语料库”)包含标签值对形式的语料库特定元数据。文档级元数据(“索引”)包含文档特定的元数据,但作为数据框存储在语料库中。文档级元数据通常用于语义原因(例如,由于可能值范围等一些高级信息,文档分类形成一个自己的实体)或性能原因(单次访问而不是提取每个文档的元数据)。后者可以看作是索引的来源,因此得名“索引”。文档元数据(“本地”)是直接存储在各个文档本地的标记值对。
DataframeSource 仅自动分配 语料库 元数据*。例如,查看以下打印的内容:
library(tm)
data <- data.frame(doc_id = c(234345345, 1299),
text = c("The Prince and the Pauper",
"Little Women"),
author = c('Mark Twain', 'Louisa May Alcott'),
date = c(1881, 1868),
stringsAsFactors = FALSE)
samplecorpus <- Corpus(DataframeSource(data))
meta(samplecorpus)
# Or even
meta(samplecorpus[1], tag = 'author')
为了在文档级别分配元数据,您可以使用meta 更改标签。奇怪的是,这仅在您使用 VCorpus 时才有效。所以稍微改变上面的,你可以这样做:
samplecorpus <- VCorpus(DataframeSource(data))
# Can now set document metadata tags
meta(samplecorpus[[1]], tag = 'author') <- 'Mark Twain'
*编辑:
进一步考虑(并回应 OP 的评论),我同意文档不是对包观察到的行为的完全准确描述。上面引用的文档指的是三个级别(语料库、索引文档级别和本地文档级别),在我的示例中,它们似乎分别对应于samplecorpus、samplecorpus[1] 和samplecorpus[[1]]。如果这正确,则元数据 由DataframeSource 在承诺级别分配(如果有些模糊,因为他们从未指定 which 文档级别)。但是,文档还声称索引文档级别存储为数据框,本地存储为标记值对,但 两者都存储为列表。令人困惑。我只能得出结论,这要么是包实现中的错误,要么是文档中的错误。
除非联系包作者来解决这个问题(这不是一个坏主意),否则我会提出以下解决方法:
samplecorpus <- VCorpus(DataframeSource(data))
transfer_metadata <- function(x, i, tag){
return(meta(x[i], tag=tag)[[tag]])
}
tags <- colnames(data)
tags <- tags[! tags %in% c('doc_id', 'text')]
for(i in 1:length(samplecorpus)){
for (tag in tags){
meta(samplecorpus[[i]], tag=tag) <- transfer_metadata(samplecorpus, i=i, tag=tag)
}
}