Документация для 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'
* РЕДАКТИРОВАТЬ:
Размышляя дальше (и отвечая на комментарий ОП), я согласен с тем, что документацияне совсем точное описание наблюдаемого поведения пакета.Приведенная выше документация относится к трем уровням (корпус, уровень проиндексированного документа и уровень локального документа), которые в моем примере соответствуют samplecorpus
, samplecorpus[1]
и samplecorpus[[1]]
соответственно.Если это правильно, то метаданные - это , назначаемые DataframeSource
на обещанном уровне (хотя и немного расплывчато, поскольку они никогда не указывали , что уровень документа).Однако в документах также утверждается, что индексированный уровень документа хранится в виде фрейма данных, а локальный - в виде пар тег-значение, но оба хранятся в виде списков .Смешение.Я могу только заключить, что это либо ошибка в реализации пакета, либо ошибка в документации.
Запрет на установление связи с авторами пакета для выяснения этого (неплохая идея), я бы предложил следующий обходной путь:
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)
}
}