文本挖掘PDF - 将字符向量列表(字符串)转换为数据帧

时间:2017-09-22 15:45:47

标签: r dataframe text-mining

我正在使用文本挖掘包将一组PDF文档读成纯文本,我想将此明文导出为dataframe / CSV / text文件 (为了便于使用RTextTools进行进一步分析)

首先,我使用 tm 包将PDF文档拖入VCorpus。 tm包的VCorpus对象存储包含元数据和明文的“PlainTextDocument”和“TextDocument”对象的列表。即“元数据:DocumentName1”......和内容,“X的条款是......”。

   library(tm)

    docs <- VCorpus(DirSource(getwd()),readerControl = list(reader = readPDF))
    # Creates large VCorpus containing ~700 PlainTextDocuments 
    # (which contain strings/character vectors)

不清楚如何将其处理成数据帧,因此我设法使用实用程序函数搜索包,将其转换为字符串列表。

   library(textreg)
   strings <- convert.tm.to.character(docs)
   # Converts VCorpus to large list of strings with document content

从VCorpus或这个字符串列表中,我想创建一个只有一行的数据框,每行包含一个文档的文本,其列名对应于它们的原始文件名。

首先,我查看了此页Export a list into a CSV or TXT file in R,并尝试使用 sapply

df <- data.frame(text = sapply(docs, as.character), stringsAsFactors = FALSE)
    ^Error during wrapup: arguments imply differing number of rows: 1, 5, 3, 3889, 3366

我也发现了相关的主题(R tm package vcorpus: Error in converting corpus to data frame),但发现它们很难,因为它们倾向于使用更简单的语料库对象。

有没有更简单的方法可以将我的字符串列表或VCorpus转换为数据帧,比如使用dplyr / tidyr / purrr?

任何关于改进我的黑客攻击解决方案的建议都非常赞赏。

编辑:数据样本

我的列表中的每个元素都包含一个字符串(/ chr向量),其中包含文本中的完整文档。例如,

 strings[3] 

产生此输出

[16]“目录”
  [17]“Page”
  [18]“”   [19]“缔约方”
  [20]“”   [21]“5”
。 。

[379]“'Affiliate'表示:”  [380]“(a)”
 [381]“”  [382]“任何一方直接或间接持有绝对”的公司或任何其他实体  [383]“股东大会上的多数票,或是超过百分之五十(50%)权利的持有人”  [384]“和赋予该公司或实体管理权力或具有”权力“的权益  [385]“管理和控制该公司或实体;”

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

#dummy data generation: file names and a list of strings (your corpus)    
files <- paste("file", 1:6)

strings <- list("a","b","c", "d","e","f")
names(strings) <-files
t(as.data.frame(unlist(strings)))

#             file 1 file 2 file 3 file 4 file 5 file 6
# unlist(strings) "a"    "b"    "c"    "d"    "e"    "f"  

基于数据结构编辑

进行编辑
files <- paste("file", 1:6)

strings <- list(c("a","b"),c("c", "d"),c("e","f"),
                c("g","h"), c("i","j"), c("k", "l"))

names(strings) <-files
t(data.frame(Doc=sapply(strings, paste0, collapse = " "))) 

#     file 1 file 2 file 3 file 4 file 5 file 6
# Doc "a b"  "c d"  "e f"  "g h"  "i j"  "k l"