笔者之前的文章提到,老师会把班上周考的成绩单,发送到家长群里。成绩单包含了每位同学的学号和分数。成绩单的格式为图片即 png 或者 jpg 格式。
开学已经一个月了,老师把最近考试成绩发到了微信群里,我用 ChatGPT 简单分析一下
我用 ChatGPT 识别这些图片,把里面的信息提取出来,然后配上简单的指令,就能分析出一些我感兴趣的信息,比如孩子在班上的排名,孩子这一个月内的分数是上升还是下降趋势等等。
其实类似这种将图片等非结构化数据进行分析和信息提取,解析成结构化数据的工具,除了 ChatGPT 之外还有不少,比如我也经常用下面这个工具,帮助老婆实现办公自动化方面的一些需求:
说到从非结构化文档中提取数据
, 这个领域的王者之一就是 SAP BTP 上的 Document Information Extraction Service.
这个基于机器学习且部署在 SAP BTP 云端的服务,旨在帮助企业自动化从非结构化文档中提取数据的过程。这一服务特别适用于处理海量的 PDF、图像扫描件、发票、订单等文档,通过自动化的方式提取出关键数据字段,减少了手动输入和人为错误的风险,同时提高了文档处理的效率。
文档信息提取服务能够处理各种格式的文档,例如 PDF、图像(JPG、PNG 等),并通过 OCR(Optical Character Recognition,光学字符识别)技术读取文档中的内容。然后,借助自然语言处理 (NLP) 和机器学习模型,它能够智能地识别并提取出特定的业务相关信息,例如发票中的发票号、日期、金额等。
这一过程极大地简化了手动录入数据的繁琐工作,并提升了业务流程的自动化水平。
SAP BTP 经过多年的发展,如今订阅和消费各种服务的步骤已经大大简化,再也没有了过去繁复的配置,进一步降低了使用者的学习门槛。
在 BTP Cockpit 的 Boosters 区域,根据关键字 document 搜索,找到 Document Information Extraction 的 Boosters 即配置加速器,点击 Start 按钮就可以一键配置。
短短数秒之后即可完成配置,点击 Go to Application 进入 Document Information Extraction 的控制台。
从 Select Document 弹出对话框 Document Type 的下拉选项里,我们可以看出,Document Information Service 预制的文档信息提取场景,支持 Invoice,Paument Advice 和 Purchase Order 这些订单类型。
当然,我们也可以选择 Custom,即自定义文档类型。
要进行自定义文档类型的信息提取,我们先得创建一个自定义 Schema.
Custom Schema 允许用户根据自身业务的需求,定制数据提取的逻辑和输出格式。
以发票信息提取场景为例,在标准的文档信息提取过程中,系统会自动识别常见的字段,比如发票号、日期、金额等。
然而,实际业务中,不同企业或不同行业可能有不同的文档格式和特定的字段。
因此 Custom Schema 类似 ABAP 标准程序里植入的 BAdI 增强出口,其必要性源自于文档的多样性与业务场景的复杂性,因为单一的通用数据模式往往无法完全满足特定企业的需求。
通过 Custom Schema,用户可以根据其特定的业务需求,自定义所需提取的字段。
假设我的业务需求就是把下面这张 PDF 格式的成绩单,里面的信息提取出来。
成绩单包含三部分:成绩单抬头名称,表格的抬头和具体的 6 条行项目。
因此我新建一个 Schema,名称为 student_score_schema, OCR Engine Type 为 Document:
在这个 Schema 的明细编辑界面,我根据 PDF 的布局,依次创建了两个 Header Fields 和 两个 Line Item Fields.
- title 负责提取成绩单抬头名称,类型为 string
- table_header 负责提取表格抬头名称,类型为 string
- student_number 负责提取行项目的学号,类型为 number
- student_score 负责提取行项目的成绩分数,类型为 number
激活这个创建好的 Schema.
创建一个新的 Document Extraction 任务,选择刚刚创建好的 Schema,再上传本地的成绩单 PDF 文件,点击 Confirm:
很快这个成绩单内的信息就按照期望的方式被提取出来了,存储到了 Custom Schema 里定义的对应字段中去。
在提取结果里,从上到下依次显示了 Custom Schema 里定义的字段名称,和实际从文档中提取到的字段值。
另外在左侧的文档预览区域,鼠标放到文档上,能自动显示该区域的内容,到底通过 Custom Schema 里哪个字段存储的内容。
除了手动在 SAP BTP 控制台里通过 GUI 的方式操作之外,Document Information Extraction 也支持通过代码调用 API 的方式消费。
我们在 SAP BTP Document Information Extraction Service Key 里,能找到 swagger 也就是服务 API 的调用控制台的 url.
用浏览器访问这个 url,能进入 SAP BTP Document Information Extraction 的 API 调用控制台,相当于一个专属的浏览器版本的 Postman,可以在浏览器里通过 API 的方式执行文档信息提取的各种操作。
在实际调用 API 之前首先要进行身份认证。
记录下上图 Service Key 里包含的 clientid
和 clientsecret
字段。我们需要用这两个字段,换取 API 调用所需的 Access Token.
使用 Postman 访问如下 url, 其中 host 占位符可以在 Service Key 里找到。
https://<host>/oauth/token?grant_type=client_credentials
认证方式选择 Basic Auth,将 Username 和 Password,分别维护成 clientid 和 clientsecret.
执行这个 HTTP GET 请求,从 Response 里得到 Access Token.
回到 SAP BTP Document Information Extraction Swagger 控制台,在 token value 字段输入 Bearer
再加上刚才得到的 Access Token,点击 Authorize 按钮即可完成认证。
接下来我们就可以使用 API 的方式来消费 SAP BTP Document Information Extraction 服务了。
因为我们是进行文档类型的操作,所以展开 Document 类型来浏览其内的 API 列表。
使用 API /document/jobs
来提交一个新的文档信息提取作业。点击 Try it out 按钮:
在请求 Payload 区域,给 file 字段指定成本地 PDF 文件,options 区域的内容如下,其实就是指定我们之前创建的 Custom Schema.
{
"schemaName": "student_score_schema",
"clientld": "default",
"documentType": "Custom"
}
点击 Execute 按钮发送请求,收到 HTTP 201 Created 的服务器端响应,说明一个新的文档信息提取作业,在服务器端创建成功了。
服务器端返回了这个作业的 id 和状态。文档信息提取是异步过程,状态为 Pending,说明提取尚未结束。
{
"status": "PENDING",
"id": "82933acd-5971-46ec-9b56-d0774cb3f175",
"processedTime": "2024-09-05T06:07:54.507003+00:00"
}
稍等片刻,使用另一个 /document/jobs/{id}
API,将服务器端返回的 job id 传入,就可以查询这个 job 对应的提取任务的执行结果了。
提取结果是 JSON 格式。
可以看到,SAP BTP Document Information Extraction 服务基于机器学习的方式进行的文档信息提取。
提取出的信息,智能匹配到 Custom Schema 的字段中去。
因此提取结果里,不仅包含了提取出来的值,还包含一个 condifence 值,即 Document Information Extraction 服务从文档里提取出来的字段,与 Custom Schema 里定义的字段,二者匹配程度的一个预测得分值,范围在 0 到 1 之间。越接近 1,结果越可信。
字段 coordinates 为文档里被识别出的字段的边界框的坐标。
当然用 SAP BTP Document Information Extraction 服务来处理学生的成绩单,简直是杀鸡用牛刀了。
目前业界流行的做法,是 Document Information Extraction 与机器人流程自动化 (RPA) 技术的集成。二者强强结合的方式,能够进一步提高业务流程的自动化水平。
除了 SAP 系统外,文档信息提取服务也将越来越多地与企业的其他业务系统进行集成,这将为企业提供更加灵活和广泛的应用场景,帮助企业实现数字化转型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。