利用OpenAI API从PDF文件中提取信息
#openai #java #pdf

为什么很难从PDF文件中提取信息?

pdf或便携式文档格式是一种流行的文件格式,广泛用于文档,例如发票,采购订单和其他业务文档。但是,从PDF中提取信息对于开发人员来说可能是一项具有挑战性的任务。

很难从PDF中提取信息的原因之一是格式不是构造的。与HTML不同,它具有针对表和标题的特定格式,开发人员可以轻松识别,PDF没有一个一致的信息布局。这使开发人员更难知道在哪里可以找到所需的特定信息。

很难从PDF中提取信息的另一个原因是没有标准布局用于信息。每个系统的生成发票和采购订单不同,因此开发人员必须经常编写自定义代码以从每个单独的文档中提取信息。这可能是一个耗时且容易出错的过程。

此外,PDF可以同时包含文本和图像,从而使开发人员难以从文档中提取信息。 OCR(光学字符识别)可用于从图像中提取文本,但这会增加该过程的复杂性,如果OCR软件不准确,可能会导致错误。

现有解决方案

从PDF中提取信息的现有解决方案包括:

  • 使用REGEX:将PDF转换为纯文本后,匹配文本中的模式。示例包括invoice2datatraprange-invoice。但是,此方法需要了解数据字段的格式。

  • 基于AI的云服务:利用机器学习从PDF提取结构化数据。示例包括pdftablesdocparser,但这些不友好。

但是,PDF数据提取的另一个解决方案:使用OpenAI

从PDF文件中提取信息的一种解决方案是使用OpenAI的自然语言处理功能来了解文档的内容。但是,OpenAI无法直接使用PDF或图像格式,因此第一步是将PDF转换为文本,同时保留文本项目的相对位置。

实现此目的的一种方法是使用PDFlayOutTextStripper库,该库使用PDFBox读取PDF文件中的所有文本项目并将其整理,并保持相对位置与原始PDF文件中的相同位置相同。这很重要,因为例如,在发票的项目表中,如果金额与数量相同,则在查询总量和总量时会导致不正确的值。这是脱衣舞娘的输出的示例:


                                                                                                *PO-003847945*                                           

                                                                                      Page.........................: 1    of    1                        





                Address...........:     Aeeee  Consumer  Good  Co.(QSC)            Purchase       Order                                                  
                                        P.O.Box 1234                                                                                                     
                                        Dooo,                                      PO-003847945                                                          
                                        ABC                                       TL-00074                                   

                Telephone........:                                                 USR\S.Morato         5/10/2020 3:40 PM                                
                Fax...................:                                                                                                                  


               100225                Aaaaaa  Eeeeee                                 Date...................................: 5/10/2020                   
                                                                                    Expected  DeliveryDate...:  5/10/2020                                
               Phone........:                                                       Attention Information                                                
               Fax.............:                                                                                                                         
               Vendor :    TL-00074                                                                                                                      
               AAAA BBBB CCCCCAAI    W.L.L.                                         Payment  Terms     Current month  plus  60  days                     


                                                                                                                         Discount                        
          Barcode           Item number     Description                  Quantity   Unit     Unit price       Amount                  Discount           
          5449000165336     304100          CRET ZERO 350ML  PET             5.00 PACK24          54.00        270.00         0.00         0.00          
                                                     350                                                                                                 
          5449000105394     300742          CEEOCE  EOE SOFT DRINKS                                                                                      
                                            1.25LTR                          5.00  PACK6          27.00        135.00         0.00         0.00          

                                                1.25                                                                                                                        
(truncated...)

一旦将PDF转换为文本,下一步就是调用OpenAI API并将文本和诸如“提取字段:'po number”,“总量'”之类的查询一起传递。响应将以JSON格式进行,GSON可用于解析并提取最终结果。将PDF转换为文本然后使用OpenAI的自然语言处理功能的两个步骤过程可以是从PDF文件中提取信息的有效解决方案。

查询很简单,如下所示,%s被po文本内容替代:

private static final String QUERY = """
    Want to extract fields: "PO Number", "Total Amount" and "Delivery Address".
    Return result in JSON format without any explanation. 
    The PO content is as follows:
    %s
    """;

查询由两个组件组成:

  • 指定所需字段
  • 将字段值格式化为JSON数据,以便于从API响应中轻松检索。

这是Openai的示例响应:

{
  "object": "text_completion",
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\\n{\\n  \\"PO Number\\": \\"PO-003847945\\",\\n  \\"Total Amount\\": \\"1,485.00\\",\\n  \\"Delivery Address\\": \\"Peera Consumer Good Co.(QSC), P.O.Box 3371, Dohe, QAT\\"\\n}",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  // ... some more fields
}

解码text字段的JSON字符串产生以下所需字段:

{
  "PO Number": "PO-003847945",
  "Total Amount": "1,485.00",
  "Delivery Address": "Peera Consumer Good Co.(QSC), P.O.Box 3371, Dohe, QAT"
}

运行示例代码

先决条件:

  • Java 16+
  • Maven

步骤:

  • 创建一个OpenAI帐户
  • 登录并生成一个API键
  • 用您的钥匙替换在main.java中
  • 更新SAMPLE_PDF_FILE(如果需要)
  • 执行代码并查看输出的结果

在此处查看代码https://github.com/thoqbk/openai-pdf