欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+OCR實現文檔解析的示例代碼

 更新時間:2022年09月08日 11:29:04   作者:Python綠色通道  
本文是一個簡單教程,主要介紹了如何使用OCR進行文檔解析以及使用Layoutpars軟件包進行了整個檢測和提取過程,感興趣的可以了解一下

介紹

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

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

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

這里將以一家上市公司的PDF格式的財務報表為例(鏈接如下)。

https://s2.q4cdn.com/470004039/files/doc_financials/2021/q4/_10-K-2021-(As-Filed).pdf

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

環(huán)境設置

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

  •  以文本方式處理文檔:用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

跟我們的截圖一模一樣,如果想將頁面圖像保存在本地,可以使用以下代碼:

# 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系統(tǒng),由惠普公司在1985年創(chuàng)建,目前由谷歌開發(fā)。

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

檢測

(目標)檢測是在圖片中找到信息片段,然后用矩形邊框將其包圍的過程。對于文檔解析,這些信息是標題、文本、圖形、表……

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

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

我將要使用的模型只能檢測4個對象(文本、標題、列表、表格、圖形)。因此,如果你需要識別其他東西(如方程),你就必須使用其他模型。

## 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)

結果包含每個檢測到的布局的細節(jié),例如邊界框的坐標。根據頁面上顯示的順序對輸出進行排序是很有用的:

## 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')

完成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)

再看看圖形報表

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)

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

import tabula
tables = tabula.read_pdf("doc_apple.pdf", pages=i+1)
tables[0]

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

以上就是Python+OCR實現文檔解析的示例代碼的詳細內容,更多關于Python OCR文檔解析的資料請關注腳本之家其它相關文章!

相關文章

  • Django框架教程之正則表達式URL誤區(qū)詳解

    Django框架教程之正則表達式URL誤區(qū)詳解

    正則表達式對大家來說應該都不陌生,下面這篇文章主要給大家介紹了關于Django框架教程之正則表達式URL誤區(qū)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2018-01-01
  • python使用win32com庫播放mp3文件的方法

    python使用win32com庫播放mp3文件的方法

    這篇文章主要介紹了python使用win32com庫播放mp3文件的方法,涉及Python使用win32com庫操作音頻文件的相關技巧,需要的朋友可以參考下
    2015-05-05
  • pytest實現多種調用方式

    pytest實現多種調用方式

    pytest是一個非常成熟的全功能的Python測試框架,本文主要介紹了pytest多種調用方式,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • python3制作捧腹網段子頁爬蟲

    python3制作捧腹網段子頁爬蟲

    網上的Python教程大都是2.X版本的,python2.X和python3.X相比較改動比較大,好多庫的用法不太一樣,我安裝的是python3.X,我們來看看詳細的例子
    2017-02-02
  • python基于機器學習預測股票交易信號

    python基于機器學習預測股票交易信號

    近年來,隨著技術的發(fā)展,機器學習和深度學習在金融資產量化研究上的應用越來越廣泛和深入。目前,大量數據科學家在Kaggle網站上發(fā)布了使用機器學習/深度學習模型對股票、期貨、比特幣等金融資產做預測和分析的文章。本文就來看看如何用python預測股票交易信號
    2021-05-05
  • Selenium爬取b站主播頭像并以昵稱命名保存到本地

    Selenium爬取b站主播頭像并以昵稱命名保存到本地

    這篇文章主要介紹了使用Selenium自動化爬取b站主播頭像并以昵稱命名保存到本地的方法,代碼簡單完整,對于大家練習Selenium自動化有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • numpy的squeeze函數使用方法

    numpy的squeeze函數使用方法

    這篇文章主要介紹了numpy的squeeze函數使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Python 取numpy數組的某幾行某幾列方法

    Python 取numpy數組的某幾行某幾列方法

    這篇文章主要介紹了Python 取numpy數組的某幾行某幾列方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Object arrays cannot be loaded when allow_pickle=False的問題

    Object arrays cannot be loaded when

    這篇文章主要介紹了Object arrays cannot be loaded when allow_pickle=False,本文給大家分享問題解決思路,需要的朋友可以參考下
    2022-11-11
  • Python Opencv中基礎的知識點

    Python Opencv中基礎的知識點

    這篇文章主要介紹了Python Opencv中基礎的知識點,主要包括創(chuàng)建窗口、保存圖片、采集視頻、鼠標控制的代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論