R – 将提取的文本数据(每个实例为一行)导出到data.frame格式

我正在尝试从i个标准化的.txt文件中提取/导出i个标准化实例的文本,并将其转换为每个实例为一行的数据框。然后我想将这些数据导出为.xlsx文件。到目前为止,我可以成功提取数据(尽管算法提取的数据比gregexpr()参数规定的略多),但只能以文本块的形式导出为.txt文件。

  1. 如何创建一个数据框,其中每个提取的.txt文件的文本实例都有一行?(一旦数据处于data.frame格式,我知道如何从那里导出为xlsx。)
  2. 如何仅提取我设定的参数内的数据?

在帮助下(特别是来自此帖评论中的Ben),这是我目前所做的:

# Txt Data Formattxt 1 <-"A. The First:  abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third:  abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz. A. The First:  abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third:  abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz."txt 2 <-"A. The First:  abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third:  abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz. A. The First:  abcdefg hijklmnop qrstuv wxyz. B. The Second: abcdefg hijklmnop qrstuv wxyz. C. The Third:  abcdefg hijklmnop qrstuv wxyz. D. The Fourth: abcdefg hijklmnop qrstuv wxyz."################################## Directory and Text Extraction ##################################dest <- "C:/Desktop/"docs_text <- list.files(path = dest, pattern = "txt",  full.names = TRUE)## Assumes that all the content I want to extract is between "A." and "C." in ## the text while ignoring "C." and "D." content.docs_list <- list.files(path = dest, pattern = "txt",  full.names = TRUE)docs_doc <- lapply(docs_list, function(i) {  j <- paste0(scan(i, what = character()), collapse = " ")  regmatches(j, gregexpr("(?<=A. The First).*?(?=C. The Third)", j, perl=TRUE))})lapply(1:length(docs_doc),  function(i) write.table(docs_doc[i], file=paste(docs_list[i], " ", " ", sep="."), quote = FALSE, row.names = FALSE, col.names = FALSE, eol = " " ))

当前输出看起来像这样,其中所有文本都在一行上,并且捕获的内容超出了”A.”和”C.”之间的范围:

当前输出

期望的输出应如下所示,其中仅捕获”A.”和”C.”之间的多行文本,并且每个多行捕获被分配为一行实例:

期望输出

任何你能提供的帮助都将非常有用!

我最终的目标是开发一个NLP模型,能够从数百个大型PDF中提取标准化表格数据,用于年度存储库。如果此帖子表明我没有有效/高效地思考如何解决这个问题,我愿意接受指导。

提前感谢!


回答:

我使用dplyr来利用tibble对象的便利性和非常有效的bind_rows命令:

dest <- "~"docs_text <- list.files(path = dest, pattern = "txt",  full.names = TRUE)library(dplyr)docs_df <- lapply(docs_text, function(f) {  lines <- readLines(f)  tibble(    file = basename(f),    line = seq_along(lines),    text = lines  )  }) %>%   bind_rows()

一旦你有了正确的data.frame,使用filtergrepl来查找匹配的文本就很容易了。我使用正则表达式"^A.|^B."来查找以A.或B.开头的行:

docs_df %>%   filter(grepl("^A.|^B.", text))#> # A tibble: 8 x 3#>   file       line text                                         #>   <chr>     <int> <chr>                                        #> 1 txt_1.txt     1 A. The First:  abcdefg hijklmnop qrstuv wxyz.#> 2 txt_1.txt     2 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 3 txt_1.txt     6 A. The First:  abcdefg hijklmnop qrstuv wxyz.#> 4 txt_1.txt     7 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 5 txt_2.txt     1 A. The First:  abcdefg hijklmnop qrstuv wxyz.#> 6 txt_2.txt     2 B. The Second: abcdefg hijklmnop qrstuv wxyz.#> 7 txt_2.txt     6 A. The First:  abcdefg hijklmnop qrstuv wxyz.#> 8 txt_2.txt     7 B. The Second: abcdefg hijklmnop qrstuv wxyz.

对于导出到Excel,我推荐使用rio::export()

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注