您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

使用Python和OCR进行文档解析的完整代码演示

时间:2022-07-19 13:40:10  来源:  作者:deephub

在本文中将使用Python/ target=_blank class=infotextkey>Python演示如何解析文档(如pdf)并提取文本,图形,表格等信息。

文档解析涉及检查文档中的数据并提取有用的信息。它可以通过自动化减少了大量的手工工作。一种流行的解析策略是将文档转换为图像并使用计算机视觉进行识别。而文档图像分析(Document Image Analysis)是指从文档的图像的像素数据中获取信息的技术,在某些情况下,预期结果应该是什么样的没有明确的答案(文本、图像、图表、数字、表格、公式……)。

使用Python和OCR进行文档解析的完整代码演示

 

OCR (Optical Character Recognition,光学字符识别)是通过计算机视觉对图像中的文本进行检测和提取的过程。它是在第一次世界大战期间发明的,当时以色列科学家伊曼纽尔·戈德堡(Emanuel Goldberg)发明了一台能读取字符并将其转换为电报代码的机器。到了现在该领域已经达到了一个非常复杂的水平,混合图像处理、文本定位、字符分割和字符识别。基本上是一种针对文本的对象检测技术。

在本文中我将展示如何使用OCR进行文档解析。我将展示一些有用的Python代码,这些代码可以很容易地用于其他类似的情况(只需复制、粘贴、运行),并提供完整的源代码下载。

这里将以一家上市公司的PDF格式的财务报表为例

使用Python和OCR进行文档解析的完整代码演示

 

检测和提取该PDF中的 文本、图形和表格

环境设置

文档解析令人烦恼的部分是,有太多的工具用于不同类型的数据(文本、图形、表格),但没有一个能够完美地工作。下面是一些最流行方法和软件包:

  • 以文本方式处理文档:用PyPDF2提取文本,用Camelot或TabulaPy提取表,用PyMuPDF提取图形。
  • 将文档转换为图像(OCR):使用pdf2image进行转换,使用PyTesseract以及许多其他的库提取数据,或者只使用LayoutParser。

也许你会问:“为什么不直接处理PDF文件,而要把页面转换成图像呢?”你可以这么做。这种策略的主要缺点是编码问题:文档可以采用多种编码(即UTF-8、ASCII、Unicode),因此转换为文本可能会导致数据丢失。因此为了避免产生该问题,我将使用OCR,并用pdf2image将页面转换为图像,需要注意的是PDF渲染库Poppler是必需的。

# with pip 
pip install python-poppler 
# with conda 
conda install -c conda-forge poppler

你可以很容易地读取文件:

# READ AS IMAGE 
import pdf2imagedoc = pdf2image.convert_from_path("doc_Apple.pdf") 
len(doc) #<-- check num pages 
doc[0] #<-- visualize a page
使用Python和OCR进行文档解析的完整代码演示

 

跟我们的截图一模一样,如果想将页面图像保存在本地,可以使用以下代码:

# Save imgs 
import osfolder = "doc" 
if folder not in os.listdir(): 
os.makedirs(folder)p = 1 
for page in doc: 
image_name = "page_"+str(p)+".jpg" 
page.save(os.path.join(folder, image_name), "JPEG") 
p = p+1

最后,我们需要设置将要使用的CV引擎。LayoutParser似乎是第一个基于深度学习的OCR通用包。它使用了两个著名的模型来完成任务:

Detection: Facebook最先进的目标检测库(这里将使用第二个版本Detectron2)。

pip install layoutparser torchvision && pip install "git+https://github.com/facebookresearch/detectron2.git@v0.5#egg=detectron2"

Tesseract:最著名的OCR系统,由惠普公司在1985年创建,目前由谷歌开发。

pip install "layoutparser[ocr]"

现在已经准备好开始OCR程序进行信息检测和提取了。

import layoutparser as lp 
import cv2 
import numpy as np 
import io 
import pandas as pd 
import matplotlib.pyplot as plt

检测

(目标)检测是在图片中找到信息片段,然后用矩形边框将其包围的过程。对于文档解析,这些信息是标题、文本、图形、表……

让我们来看一个复杂的页面,它包含了一些东西:

使用Python和OCR进行文档解析的完整代码演示

 

这个页面以一个标题开始,有一个文本块,然后是一个图和一个表,因此我们需要一个经过训练的模型来识别这些对象。幸运的是,Detectron能够完成这项任务,我们只需从这里选择一个模型,并在代码中指定它的路径。

使用Python和OCR进行文档解析的完整代码演示

 

我将要使用的模型只能检测4个对象(文本、标题、列表、表格、图形)。因此,如果你需要识别其他东西(如方程),你就必须使用其他模型。

## load pre-trained model 
model = lp.Detectron2LayoutModel( 
"lp://PubLa.NET/mask_rcnn_X_101_32x8d_FPN_3x/config", 
extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8], 
label_map={0:"Text", 1:"Title", 2:"List", 3:"Table", 4:"Figure"}) 

## turn img into array 
i = 21 
img = np.asarray(doc[i]) 

## predict 
detected = model.detect(img) 

## plot 
lp.draw_box(img, detected, box_width=5, box_alpha=0.2, 
show_element_type=True)
使用Python和OCR进行文档解析的完整代码演示

 

结果包含每个检测到的布局的细节,例如边界框的坐标。 根据页面上显示的顺序对输出进行排序是很有用的:

## sort 
new_detected = detected.sort(key=lambda x: x.coordinates[1]) 
## assign ids 
detected = lp.Layout([block.set(id=idx) for idx,block in 
enumerate(new_detected)])## check 
for block in detected: 
print("---", str(block.id)+":", block.type, "---") 
print(block, end='nn')
使用Python和OCR进行文档解析的完整代码演示

 

完成OCR的下一步是正确提取检测到内容中的有用信息。

提取

我们已经对图像完成了分割,然后就需要使用另外一个模型处理分段的图像,并将提取的输出保存到字典中。

由于有不同类型的输出(文本,标题,图形,表格),所以这里准备了一个函数用来显示结果。

''' 
{'0-Title': '...', 
'1-Text': '...', 
'2-Figure': array([[ [0,0,0], ...]]), 
'3-Table': pd.DataFrame, 
} 
''' 
def parse_doc(dic): 
for k,v in dic.items(): 
if "Title" in k: 
print('x1b[1;31m'+ v +'x1b[0m') 
elif "Figure" in k: 
plt.figure(figsize=(10,5)) 
plt.imshow(v) 
plt.show() 
else: 
print(v) 
print(" ")

首先看看文字:

# load model 
model = lp.TesseractAgent(languages='eng') 
dic_predicted = {} 
for block in [block for block in detected if block.type in ["Title","Text"]]: 
## segmentation 
segmented = block.pad(left=15, right=15, top=5, 
bottom=5).crop_image(img) 
## extraction 
extracted = model.detect(segmented) 
## save 
dic_predicted[str(block.id)+"-"+block.type] = 
extracted.replace('n',' ').strip() 

# check 
parse_doc(dic_predicted)
使用Python和OCR进行文档解析的完整代码演示

 

再看看图形报表

for block in [block for block in detected if block.type == "Figure"]: 
## segmentation 
segmented = block.pad(left=15, right=15, top=5, 
bottom=5).crop_image(img) 
## save 
dic_predicted[str(block.id)+"-"+block.type] = segmented 

# check 
parse_doc(dic_predicted)
使用Python和OCR进行文档解析的完整代码演示

 

上面两个看着很不错,那是因为这两种类型相对简单,但是表格就要复杂得多。 尤其是我们上看看到的的这个,因为它的行和列都是进行了合并后产生的。

for block in [block for block in detected if block.type == "Table"]: 
## segmentation 
segmented = block.pad(left=15, right=15, top=5, 
bottom=5).crop_image(img) 
## extraction 
extracted = model.detect(segmented) 
## save 
dic_predicted[str(block.id)+"-"+block.type] = pd.read_csv( 
io.StringIO(extracted) ) 
# check 
parse_doc(dic_predicted)
使用Python和OCR进行文档解析的完整代码演示

 

正如我们的预料提取的表格不是很好。好在Python有专门处理表格的包,我们可以直接处理而不将其转换为图像。 这里使用TabulaPy 包:

import tabula 
tables = tabula.read_pdf("doc_apple.pdf", pages=i+1) 
tables[0]
使用Python和OCR进行文档解析的完整代码演示

 

结果要好一些,但是名称仍然错了,但是效果要比直接OCR好的多

总结

本文是一个简单教程,演示了如何使用OCR进行文档解析。 使用Layoutpars软件包进行了整个检测和提取过程。 并展示了如何处理PDF文档中的文本,数字和表格。

作者:Mauro Di Pietro



Tags:OCR   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
这些年,随着移动互联网的的发展,越来越多的企业都推出了自己的移动APP,这些APP多数都涉及到个人身份证信息的输入认证(即实名认证),如果手动去输入身份证号码和姓名,速度非常慢,且用...【详细内容】
2022-08-12  Tags: OCR  点击:(57)  评论:(0)  加入收藏
在本文中将使用Python演示如何解析文档(如pdf)并提取文本,图形,表格等信息。文档解析涉及检查文档中的数据并提取有用的信息。它可以通过自动化减少了大量的手工工作。一种流...【详细内容】
2022-07-19  Tags: OCR  点击:(90)  评论:(0)  加入收藏
本文的目的是演示一个专门设计用于对收据照片执行OCR(光学字符识别)操作并自动从中提取关键业务信息的 API,例如企业名称和地址、电话号码、收据总额等等。在页面的下方,我提供...【详细内容】
2022-07-15  Tags: OCR  点击:(117)  评论:(0)  加入收藏
百度的OCR应该业界做的最好的,往往是竞品的对标对象。PaddleOCR是一套丰富、领先、且实用的OCR工具库,支持80+语言识别,提供数据标注和合成工具,支持服务器、移动、嵌入式和物联...【详细内容】
2022-05-18  Tags: OCR  点击:(256)  评论:(0)  加入收藏
Odoo是世界排名第一的免费开源ERP平台,采用模块化方法运行的 Odoo 平台为企业提供了一个专用的客户关系管理模块,该模块将执行所有客户服务管理操作。客户关系管理的目的,一是...【详细内容】
2022-04-13  Tags: OCR  点击:(141)  评论:(0)  加入收藏
作者/蔡锡生 简介 gocraft/work是一款使用go开发的任务处理软件,通过redis存储任务队列,可以使用工作池同时处理多个任务。本文主要介绍任务注册和任务消费的源代码。 功能特...【详细内容】
2022-03-15  Tags: OCR  点击:(109)  评论:(0)  加入收藏
超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M。开源项目中有web版本、android版本、PC版本,各种...【详细内容】
2022-03-14  Tags: OCR  点击:(226)  评论:(0)  加入收藏
一直在写东西,有时候会遇到这种需求,就是把图片上的文字拷贝到自己的文章中,所以写了这个小工具。 配合Snipaste使用天衣无缝,所有的东西都在剪切板里交换,即Snipaste截取的图片...【详细内容】
2021-08-30  Tags: OCR  点击:(312)  评论:(0)  加入收藏
文字 OCR 识别技术现在已经相当成熟了,无论 其 准确度还是识别速度 都能够满足我们的日常需要;今天给大家介绍一个 Python 包,该包的主要功能就是用于 OCR 识别的,包的名字叫 Py...【详细内容】
2021-04-16  Tags: OCR  点击:(401)  评论:(0)  加入收藏
们先聊聊中文OCR的发展历程:国家863计划信息领域课题组织了清华大学、北京信息工程学院、沈阳自动化所三家单位联合进行中文OCR软件的开发工作。至1989年,清华大学率先推出了...【详细内容】
2021-03-29  Tags: OCR  点击:(288)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Python进阶学习交流  今日头条  Tags:Python   点击:(4)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Pgabc    Tags:Python   点击:(8)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  VT漫步  今日头条  Tags:Python   点击:(6)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Python进阶者    Tags:Python   点击:(6)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  张先生870707  今日头条  Tags:Python   点击:(14)  评论:(0)  加入收藏
学习目标 了解分类器的任务和数据样式 掌握如何用Pytorch实现一个分类器分类器任务和数据介绍 构造一个将不同图像进行分类的神经网络分类器, 对输入的图片进行判别并完成分...【详细内容】
2022-10-25  传智教育官方账号  今日头条  Tags:Pytorch实   点击:(11)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  老K玩代码  今日头条  Tags:Python库   点击:(18)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  思铺学院    Tags:数学建模   点击:(2)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  念兮暮霞如烟    Tags:python   点击:(9)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24   嘻呱嘻呱大又圆     Tags:python   点击:(11)  评论:(0)  加入收藏
站内最新
站内热门
站内头条