【问题标题】:Can't get metadata from dataframe using DataframeSource in tm for R无法使用 R 的 tm 中的 DataframeSource 从数据帧中获取元数据
【发布时间】:2019-02-25 06:01:02
【问题描述】:

我有一个包含以下变量的数据框:

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

相反,我得到了一个语料库,其中所有正确的文档都按正确的顺序排列,但它们的所有元数据都是空白的。我需要此元数据来过滤文档以供将来分析。

有人问过类似的问题,但从未得到回答... In tm version a readTabular() replacement tm package DataframeSource () ignores my other columns as metadata

有人对如何解决这个问题有任何想法吗?

谢谢!

【问题讨论】:

    标签: r dataframe metadata tm corpus


    【解决方案1】:

    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 的评论),我同意文档不是对包观察到的行为的完全准确描述。上面引用的文档指的是三个级别(语料库、索引文档级别和本地文档级别),在我的示例中,它们似乎分别对应于samplecorpussamplecorpus[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)
        }
    }
    

    【讨论】:

    • 您好!感谢您的帮助,我确实在文档中看到了这一点,但这并不完全符合我所问的问题 ...我一直在寻找(以及帖子中链接的内容)是这个--> "数据框源将数据框 x 的每一行解释为一个文档。第一列必须命名为“doc_id”,并包含每个文档的唯一字符串标识符。第二列必须命名为“text”。可选的附加列用作文档级元数据。”所以额外的列应该按行输出为文档级元数据,而不是语料库级元数据。但他们不是。
    • 嗨,Emi,我同意这里有问题 - 它可能就像包创建者在描述索引与本地文档级元数据的数据结构时有点模糊一样简单,但这已经足够了把我彻底甩掉。我对答案进行了一些修改 - 这有帮助吗?
    • 嗨!非常感谢,我想下面的人明白了 - 我正在寻找创建的语料库中的元数据(比如自动生成的带有下拉菜单的视觉语料库),但它不存在,但是当我使用代码时用索引类型而不是本地类型来寻找它,它应该在哪里。感谢您的帮助!
    【解决方案2】:

    您必须检查所有内容是否正确加载。我制作了一个示例文档 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. 
    

    现在请注意,元数据的处理方式有所不同。如果您执行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")

    the vignette 的第 5 页对于阅读和试验以了解 meta 和 DublinCore 的所有不同选项非常重要。

    【讨论】:

    • 这回答了我的问题,谢谢!坦率地说,我不太了解小插图中列出的组织,或者为什么创建的视觉语料库有空的下拉列表,没有元数据,然后我可以使用类型索引代码找到这些元数据,但这是开始研究的好地方来自,我非常感谢您的解释:)
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2022-01-03
    • 2021-03-26
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多