日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

文檔解析涉及檢查文檔中的數(shù)據(jù)并提取有用的信息。它可以通過自動化減少了大量的手工工作。一種流行的解析策略是將文檔轉(zhuǎn)換為圖像并使用計算機視覺進行識別。而文檔圖像分析(Document Image Analysis)是指從文檔的圖像的像素數(shù)據(jù)中獲取信息的技術(shù),在某些情況下,預(yù)期結(jié)果應(yīng)該是什么樣的沒有明確的答案(文本、圖像、圖表、數(shù)字、表格、公式……)。

使用Python和OCR進行文檔解析的完整代碼演示

 

OCR (Optical Character Recognition,光學(xué)字符識別)是通過計算機視覺對圖像中的文本進行檢測和提取的過程。它是在第一次世界大戰(zhàn)期間發(fā)明的,當時以色列科學(xué)家伊曼紐爾·戈德堡(Emanuel Goldberg)發(fā)明了一臺能讀取字符并將其轉(zhuǎn)換為電報代碼的機器。到了現(xiàn)在該領(lǐng)域已經(jīng)達到了一個非常復(fù)雜的水平,混合圖像處理、文本定位、字符分割和字符識別。基本上是一種針對文本的對象檢測技術(shù)。

在本文中我將展示如何使用OCR進行文檔解析。我將展示一些有用的Python代碼,這些代碼可以很容易地用于其他類似的情況(只需復(fù)制、粘貼、運行),并提供完整的源代碼下載。

這里將以一家上市公司的PDF格式的財務(wù)報表為例

使用Python和OCR進行文檔解析的完整代碼演示

 

檢測和提取該PDF中的 文本、圖形和表格

環(huán)境設(shè)置

文檔解析令人煩惱的部分是,有太多的工具用于不同類型的數(shù)據(jù)(文本、圖形、表格),但沒有一個能夠完美地工作。下面是一些最流行方法和軟件包:

  • 以文本方式處理文檔:用PyPDF2提取文本,用Camelot或TabulaPy提取表,用PyMuPDF提取圖形。
  • 將文檔轉(zhuǎn)換為圖像(OCR):使用pdf2image進行轉(zhuǎn)換,使用PyTesseract以及許多其他的庫提取數(shù)據(jù),或者只使用LayoutParser。

也許你會問:“為什么不直接處理PDF文件,而要把頁面轉(zhuǎn)換成圖像呢?”你可以這么做。這種策略的主要缺點是編碼問題:文檔可以采用多種編碼(即UTF-8、ASCII、Unicode),因此轉(zhuǎn)換為文本可能會導(dǎo)致數(shù)據(jù)丟失。因此為了避免產(chǎn)生該問題,我將使用OCR,并用pdf2image將頁面轉(zhuǎn)換為圖像,需要注意的是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

最后,我們需要設(shè)置將要使用的CV引擎。LayoutParser似乎是第一個基于深度學(xué)習的OCR通用包。它使用了兩個著名的模型來完成任務(wù):

Detection: Facebook最先進的目標檢測庫(這里將使用第二個版本Detectron2)。

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

Tesseract:最著名的OCR系統(tǒng),由惠普公司在1985年創(chuàng)建,目前由谷歌開發(fā)。

pip install "layoutparser[ocr]"

現(xiàn)在已經(jīng)準備好開始OCR程序進行信息檢測和提取了。

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

檢測

(目標)檢測是在圖片中找到信息片段,然后用矩形邊框?qū)⑵浒鼑倪^程。對于文檔解析,這些信息是標題、文本、圖形、表……

讓我們來看一個復(fù)雜的頁面,它包含了一些東西:

使用Python和OCR進行文檔解析的完整代碼演示

 

這個頁面以一個標題開始,有一個文本塊,然后是一個圖和一個表,因此我們需要一個經(jīng)過訓(xùn)練的模型來識別這些對象。幸運的是,Detectron能夠完成這項任務(wù),我們只需從這里選擇一個模型,并在代碼中指定它的路徑。

使用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進行文檔解析的完整代碼演示

 

結(jié)果包含每個檢測到的布局的細節(jié),例如邊界框的坐標。 根據(jù)頁面上顯示的順序?qū)敵鲞M行排序是很有用的:

## 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的下一步是正確提取檢測到內(nèi)容中的有用信息。

提取

我們已經(jīng)對圖像完成了分割,然后就需要使用另外一個模型處理分段的圖像,并將提取的輸出保存到字典中。

由于有不同類型的輸出(文本,標題,圖形,表格),所以這里準備了一個函數(shù)用來顯示結(jié)果。

''' 
{'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進行文檔解析的完整代碼演示

 

上面兩個看著很不錯,那是因為這兩種類型相對簡單,但是表格就要復(fù)雜得多。 尤其是我們上看看到的的這個,因為它的行和列都是進行了合并后產(chǎn)生的。

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進行文檔解析的完整代碼演示

 

正如我們的預(yù)料提取的表格不是很好。好在Python有專門處理表格的包,我們可以直接處理而不將其轉(zhuǎn)換為圖像。 這里使用TabulaPy 包:

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

 

結(jié)果要好一些,但是名稱仍然錯了,但是效果要比直接OCR好的多

總結(jié)

本文是一個簡單教程,演示了如何使用OCR進行文檔解析。 使用Layoutpars軟件包進行了整個檢測和提取過程。 并展示了如何處理PDF文檔中的文本,數(shù)字和表格。

作者:Mauro Di Pietro

分享到:
標簽:OCR
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定