Не удается получить метаданные из фрейма данных, используя DataframeSource в tm для R - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть фрейм данных со следующими переменными:

doc_id  text  URL  author  date  forum 

Когда я запускаю

samplecorpus <- Corpus(DataframeSource(sampledataframe))

, в документации говорится, что я должен получить корпус со всеми дополнительными переменными, добавленными в качестве документаметаданныеhttps://rdrr.io/rforge/tm/man/DataframeSource.html http://finzi.psych.upenn.edu/R/library/tm/html/DataframeSource.html

Вместо этого я получаю корпус, в котором все нужные документы расположены в правильном порядке, но все их метаданные пустые.Мне нужны эти метаданные для фильтрации документов для последующего анализа.

Кто-то задал похожий вопрос, но на него так и не ответили ... В версии tm замена пакета tm readTabular () DataframeSource () игнорирует другие мои столбцы как метаданные

У кого-нибудь есть идеи как это исправить?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы должны проверить, все ли загружено правильно.Я сделал пример документа data.frame, чтобы вы могли увидеть, как он работает.Я использовал те же имена столбцов, что и у вас, и добавил 1 дополнительный (теги).На основании этого примера вы можете проверить, есть ли где-то проблема.

docs <- data.frame(doc_id = c("doc_1", "doc_2"),
                   text = c("This is a text.", "This another one."),
                   url = c("/11229538/ne-udaetsya-poluchit-metadannye-iz-freima-dannyh-ispolzuya-dataframesource-v-tm-dlya-r",
                           "/11229538/ne-udaetsya-poluchit-metadannye-iz-freima-dannyh-ispolzuya-dataframesource-v-tm-dlya-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 /11229538/ne-udaetsya-poluchit-metadannye-iz-freima-dannyh-ispolzuya-dataframesource-v-tm-dlya-r    Emi 2018-09-20
2 /11229538/ne-udaetsya-poluchit-metadannye-iz-freima-dannyh-ispolzuya-dataframesource-v-tm-dlya-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. 

Теперь учтите, что в мета-обработке есть разница.Если вы сделаете 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")

Страница 5 из виньетка , которую важно прочитать и поэкспериментировать, чтобы увидеть все различные опции, которые есть у meta и DublinCore.

0 голосов
/ 21 сентября 2018

Документация для 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)
    }
}
...