我有一个包含以下变量的数据框:
doc_id文本URL作者日期论坛我跑的时候
samplecorpus< - Corpus(DataframeSource(sampledataframe))文件说我应该……
的文档 tm 如果你挖掘就解释了这一点(见 ??tm::DublicCore )。来自文档:
tm
??tm::DublicCore
语料库有两种类型的元数据。语料库元数据(“语料库”)包含标签 - 值对形式的语料库特定元数据。文档级元数据(“索引”)包含文档特定元数据,但作为数据帧存储在语料库中。文档级元数据通常用于语义原因(例如,由于诸如可能值的范围之类的一些高级信息,文档的分类形成自己的实体)或出于性能原因(单个访问而不是提取每个文档的元数据)。后者可以看作来自索引,因此名称为“索引”。文档元数据(“本地”)是直接存储在各个文档中的标记值对。
DataframeSource 自动只分配 文集 元数据*。例如,查看以下内容:
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 。所以稍微改变上面的内容,你可以做到:
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 在承诺的水平(如果有些模糊,因为他们从未指定 哪一个 文档级)。但是,文档还声称索引文档级别存储为数据框,本地存储为标记值对,但是 两者都存储为列表 。混乱。我只能得出结论,这是包实现中的错误或文档中的错误。
samplecorpus
samplecorpus[1]
samplecorpus[[1]]
除非联系包裹作者清除这一点(不是一个坏主意),我建议采取以下解决方法:
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) } }
您必须检查是否所有内容都已正确加载。我做了一个docs data.frame示例,这样你就可以看到它是如何工作的。我使用了相同的列名,并添加了1个额外的(标签)。根据此示例,您可以检查某个地方是否存在问题。
docs <- data.frame(doc_id = c("doc_1", "doc_2"), text = c("This is a text.", "This another one."), url = c("https://stackoverflow.com/questions/52433344/cant-get-metadata-from-dataframe-using-dataframesource-in-tm-for-r", "https://stackoverflow.com/questions/52433344/cant-get-metadata-from-dataframe-using-dataframesource-in-tm-for-r"), author = c("Emi", "Emi"), date = as.Date(c("2018-09-20", "2018-09-21")), forum = c("stackoverflow", "stackoverflow"), tags = c("r", "tm"), stringsAsFactors = T) # use Corpus or VCorpus my_corpus <- Corpus(DataframeSource(docs)) meta(my_corpus) url author date 1 https://stackoverflow.com/questions/52433344/cant-get-metadata-from-dataframe-using-dataframesource-in-tm-for-r Emi 2018-09-20 2 https://stackoverflow.com/questions/52433344/cant-get-metadata-from-dataframe-using-dataframesource-in-tm-for-r Emi 2018-09-21 forum tags 1 stackoverflow r 2 stackoverflow tm my_index <- meta(my_corpus, "tags") == "r" inspect(my_corpus[my_index]) <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 5 Content: documents: 1 doc_1 This is a text.
现在要注意meta的处理方式有所不同。如果你这样做 str(my_corpus) 你会看到以下内容:
str(my_corpus)
List of 2 $ doc_1:List of 2 ..$ content: chr "This is a text." ..$ meta :List of 7 .. ..$ author : chr(0) .. ..$ datetimestamp: POSIXlt[1:1], format: "2018-09-21 08:55:44" .. ..$ description : chr(0) .. ..$ heading : chr(0) .. ..$ id : chr "doc_1" .. ..$ language : chr "en" .. ..$ origin : chr(0) .. ..- attr(*, "class")= chr "TextDocumentMeta" ..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument" $ doc_2:List of 2 ......
您在此处看到的元信息来自 meta(my_corpus, type = "local") 。使用DataframeSource加载的元数据的类型为索引, meta(my_corpus, type = "indexed")
meta(my_corpus, type = "local")
meta(my_corpus, type = "indexed")
第5页 小插图 阅读和试验以查看meta和DublinCore的所有不同选项非常重要。