在r中检查字符串匹配中的多个单词以进行文本搜索

时间:2017-09-26 07:21:47

标签: r search dataframe ocr

目前我有一个用于单词搜索的代码,我们可以搜索多个单词并在数据帧中写出这些匹配的单词吗? (澄清,请参阅此post)这是akrun's解决方案,适用于一个单词。 这是代码:

 library(pdftools)
 library(tesseract)

 All_files <- Sys.glob("*.pdf")
 v1     <- numeric(length(All_files))
 word   <- "school"
 df     <- data.frame()
 Status <- "Present"

for (i in seq_along(All_files)){
  file_name <- All_files[i]

  cnt <- pdf_info(All_files[i])$pages
  print(cnt)
  for(j in seq_len(cnt)){
      img_file <- pdftools::pdf_convert(All_files[i], format = 'tiff', pages = j, dpi = 400)
      text     <- ocr(img_file)
      ocr_text <- capture.output(cat(text))
      check    <- sapply(ocr_text, paste, collapse="")
      junk     <- dir(path= paste0(path, "/tiff"), pattern="tiff")
      file.remove(junk)
      br <-if(length(which(stri_detect_fixed(tolower(check),tolower(word)))) <= 0) "Not Present"  
              else "Present" 
      print(br)       
      if(br=="Present") {
         v1[i] <- j
         break}
    }

    Status <- if(v1[i] == 0) "Not Present" else "Present"
    pages  <- if(v1[i] == 0) "-" else 
      paste0(tools::file_path_sans_ext(basename(file_name)), "_", v1[i])
    words  <- if(v1[i] == 0) "-" else word
    df     <- rbind(df, cbind(file_name = basename(file_name),
                    Status, pages = pages, words = words))
}

这里我们只搜索一个单词,school。我们可以搜索多个字词,例如schoolgymswimming pool吗?

预期的O / P

fileName   Status        Page             Words                    TEXT
test.pdf   Present     test_1             gym            I go gym regularly  
test.pdf   Present     test_3             school     Here is the next school
test1.pdf  Present     test1_4            swimming pool  In swimming pool
test1.pdf  Present     test1_7            gym         next to Gold gym
test2.pdf  Not Present    -               -

fileName =文件名称

状态 =如果找到任何字词,则“显示”否则“不存在”

Page =此处“_1”,“_ 3”定义找到该单词的页码;;页面上显示“test_1”字样“健身房”,并在页面“test_3”上找到“学校”字样。

单词 =找到所有单词;;在test.pdf文件的第1页和第3页只找到“健身房”和“学校”,在test1.pdf文件的第4页和第7页只找到“游泳池”和“健身房”。

TEXT =这是找到单词的文字

对此相关的任何建议都会有所帮助。

由于

1 个答案:

答案 0 :(得分:1)

使用外部循环浏览目录中的每个PDF。然后,您将浏览PDF的所有页面并在内部循环中提取文本。您想检查每个文档是否至少有一个页面包含//ajax request function tampilkan() { var data_table = ""; var head_table = ""; $.ajax({ url: "showkaryawan/da", dataType: "json", success: function(data) { $('#oo').empty(); head_table +="<thead><tr class='bg-info'><th width='10%'>ID Karyawan</th><th width='30%'>Nama Karyawan</th><th width='15%'>Action</th></tr></thead>"; for (var i =0; i<data.length; i++) { var id = data[i].id; var nama = data[i].nama; data_table +="<tr>"; data_table +="<td>"+id+"</td>"; data_table += "<td>"+nama+"</td>"; data_table += "<button data-id ="+id+" data-nama="+nama+" class="detailButton">Detail</button>"; data_table += "<td></td></tr>"; } $('#oo').append(head_table); $('#oo').append(data_table); } }); } //click event handler $('.detailButton').click(function() { var id = $(this).data('id') var nama = $(this).data('nama'); alert(id); alert(name); }); schoolgym。您要使用的返回值是:

  1. 包含swimming poolPresent的PDF文档数量的长度向量。
  2. 带有一些字符串的三个向量,包含有关哪个单词出现在何时何地的信息。
  3. 右?

    您可以跳过循环中的几个步骤,尤其是在将PDF转换为TIFF并使用Not present从它们中读取文本时:

    ocr

    它不像我想的那样可读。可能是因为很少要求w.r.t.输出需要较小的中间步骤,使代码看起来有点混乱。它运作良好,但