使用Python和OCR进行文档解析的完整代码演示(附代码)
数据派THU
共 5205字,需浏览 11分钟
· 2022-07-30
![](https://filescdn.proginn.com/341558039eed3721571645ca76c569d5/5186552b4f15e2666db71d46c6642a52.webp)
来源:DeepHub IMBA 本文约2300字,建议阅读5分钟 本文中将使用Python演示如何解析文档(如pdf)并提取文本,图形,表格等信息。
![](https://filescdn.proginn.com/65cc3038dea309461908906c1e866819/8e1319b12b84d157c828073e4b2a3b90.webp)
https://s2.q4cdn.com/470004039/files/doc_financials/2021/q4/_10-K-2021-(As-Filed).pdf
![](https://filescdn.proginn.com/7f7e4b898180509f0f7330186baa3058/336754b45528c9f74b01c058607bd443.webp)
环境设置
以文本方式处理文档:用PyPDF2提取文本,用Camelot或TabulaPy提取表,用PyMuPDF提取图形。 将文档转换为图像(OCR):使用pdf2image进行转换,使用PyTesseract以及许多其他的库提取数据,或者只使用LayoutParser。
# 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
# 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
pip install layoutparser torchvision && pip install "git+https://github.com/facebookresearch/detectron2.git@v0.5#egg=detectron2"
pip install "layoutparser[ocr]"
import layoutparser as lp
import cv2
import numpy as np
import io
import pandas as pd
import matplotlib.pyplot as plt
检测
![](https://filescdn.proginn.com/b9d4961fa7a5285eccb954b17977bf17/64902035073919683a725f2c3f4ab115.webp)
![](https://filescdn.proginn.com/538da252e09496186f474be8b09752dc/2217598cd526c0539e6cb34d11a0cb89.webp)
## load pre-trained model
model = lp.Detectron2LayoutModel(
"lp://PubLayNet/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)
![](https://filescdn.proginn.com/ef1be853b00bfd3d7a58a2ea122d3d2e/a4289e40e6c39866a057ca59d4ecee11.webp)
## 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='\n\n')
![](https://filescdn.proginn.com/996dc1c980c6fd39ab7af4eebc6e08ed/f47fa789272ebfc402e0272d845f593e.webp)
提取
'''
{'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)
![](https://filescdn.proginn.com/ba09daccabce4a57371e5ed7ea60a177/dbb05de8dd824aabe2cb76a72ffc2dcf.webp)
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)
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)
![](https://filescdn.proginn.com/20d57ab21bf72223273cdddf21a1fd0c/d5eeadc2d396b75adebd8a20e1d9c58d.webp)
import tabula
tables = tabula.read_pdf("doc_apple.pdf", pages=i+1)
tables[0]
![](https://filescdn.proginn.com/7a2b12caf1fbd8ea05e820507e27c438/c9ea69f91fa859fd9251cf573e443251.webp)
总结
本文的源代码:
https://github.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/blob/master/computer_vision/example_ocr_parsing.ipynb
如果你安装Tesseract有问题的话,请看这个帖子
https://stackoverflow.com/questions/50951955/pytesseract-tesseractnotfound-error-tesseract-is-not-installed-or-its-not-i
编辑:于腾凯
评论
AI-Intelligent-RecognitionAI 智能识物小程序
AI智能识物(AI-Intelligent-Recognition),是一款实用的小程序。可以拍照智能识物,可识别地标、车型、花卉、植物、动物、果蔬、货币、红酒、食材等等,AI智能技术识别准确度高。更
AI-Intelligent-RecognitionAI 智能识物小程序
0
文字识别的软件
在如今这个快节奏、高速发展的社会,无论做什么都需要讲究效率,工作、学习、办理业务等等,一切以效率为王。OCR文字识别软件,则在科技成果的催化下应运而生。简单好用的OCR文字识别软件,让一切像开挂一样。
中安未来OCR文字识别技术有着多年成熟发展的历史,到如今产业化、战略化的发展,一路走来,其识别准确率、识别速度,得到广泛认可。以核心OCR技术为基础,根据不同行业领域不同需求,研发出护照阅读器智能硬件,以及银行卡识别、身份证识别、行驶证识别、车牌识别、名片识别等识别
在文字识别领域,中安未来支持中文、日文、阿拉伯文、英文、德文、韩文、意大利文、法文、藏文、维吾尔文等几十种语言文字识别。支持自动矫正、旋转,同时可直接导入
周雨波
0
文字识别的优点
文字识别,是所有衍生识别应用的根基,依托强大的研发团队和数十载技术积累,专为智能化而生。无论是资料检索、文字检测,还是内容监管、视频内容分析等,基于业界领先的OCR识别技术,能为您提供多场景、多语言、高精度的图文检测识别服务。其中中文、英文、日文、阿拉伯文的识别精准性,在业内有着较高的知名度。
中安未来文字识别产品的五大优点:
准确性高:
中安未来文字识别OCR,可识别中文、英文、日文、韩文、阿拉伯文、意大利文、维吾尔文等几十种文字。其核心OCR自主研发技术,经过不断的完善和更新,已相当成熟,识别准确率高。
稳定性强:
文字识别OCR核心早已成功应用于Microsoft、Nuance、OPENTEXT、中国工商
周雨波
0
文字识别的应用
是否有过这样的经历,在网上发现一篇好文,却没办法复制,怎么办?手动抄录吗,我想如果没有OCR,大部分人会这么做。
OCR是一种图像处理技术,又叫文字识别,能够将图像中不可复制的文字转换成可编辑的文字形式,简单来说,用户对无法复制的文本进行拍照,通过文档识别软件进行识别,即可获得可编辑、可保存的电子文档信息。
工作生活中,经常会遇到档案录入、纸质信息读取、客户名片资料存储等工作,如果单纯使用人工去录入信息,繁琐复杂没有效果,OCR、文字识别、数字化路程就这样慢慢形成了。中安未来,文字识别技术,可以这这些实现,提高工作效率。中安未来的OCR文字识别技术,将纸质文档数字化,相比一个字一个字的录入,这种批量识别存储的方法不仅提高了纸质文
中安未来OCR识别
0