最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+OCR實(shí)現(xiàn)文檔解析的示例代碼

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

介紹

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

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

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

這里將以一家上市公司的PDF格式的財(cái)務(wù)報(bào)表為例(鏈接如下)。

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

檢測(cè)和提取該P(yáng)DF中的 文本、圖形和表格

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

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

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

也許你會(huì)問:“為什么不直接處理PDF文件,而要把頁面轉(zhuǎn)換成圖像呢?”你可以這么做。這種策略的主要缺點(diǎn)是編碼問題:文檔可以采用多種編碼(即UTF-8、ASCII、Unicode),因此轉(zhuǎn)換為文本可能會(huì)導(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

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

# 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似乎是第一個(gè)基于深度學(xué)習(xí)的OCR通用包。它使用了兩個(gè)著名的模型來完成任務(wù):

Detection: Facebook最先進(jìn)的目標(biāo)檢測(cè)庫(這里將使用第二個(gè)版本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)準(zhǔn)備好開始OCR程序進(jìn)行信息檢測(cè)和提取了。

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

檢測(cè)

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

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

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

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

## 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é)果包含每個(gè)檢測(cè)到的布局的細(xì)節(jié),例如邊界框的坐標(biāo)。根據(jù)頁面上顯示的順序?qū)敵鲞M(jìn)行排序是很有用的:

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

提取

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

由于有不同類型的輸出(文本,標(biāo)題,圖形,表格),所以這里準(zhǔn)備了一個(gè)函數(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)

再看看圖形報(bào)表

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)

上面兩個(gè)看著很不錯(cuò),那是因?yàn)檫@兩種類型相對(duì)簡(jiǎn)單,但是表格就要復(fù)雜得多。尤其是我們上看看到的的這個(gè),因?yàn)樗男泻土卸际沁M(jìn)行了合并后產(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)

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

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

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

以上就是Python+OCR實(shí)現(xiàn)文檔解析的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python OCR文檔解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中重定向輸出流實(shí)現(xiàn)用文件記錄程序日志

    Java中重定向輸出流實(shí)現(xiàn)用文件記錄程序日志

    這篇文章主要介紹了Java中重定向輸出流實(shí)現(xiàn)用文件記錄程序日志,本文直接給出代碼實(shí)例,并對(duì)代碼做了詳細(xì)注解,需要的朋友可以參考下
    2015-06-06
  • Python Matplotlib繪制箱線圖的全過程

    Python Matplotlib繪制箱線圖的全過程

    又稱箱形圖(boxplot)或盒式圖,數(shù)據(jù)大小、占比、趨勢(shì)等等的呈現(xiàn)其包含一些統(tǒng)計(jì)學(xué)的均值、分位數(shù)、極值等等統(tǒng)計(jì)量,因此該圖信息量較大,下面這篇文章主要給大家介紹了關(guān)于Python Matplotlib繪制箱線圖的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)

    python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python內(nèi)置函數(shù)及功能簡(jiǎn)介匯總

    Python內(nèi)置函數(shù)及功能簡(jiǎn)介匯總

    這篇文章主要介紹了Python內(nèi)置函數(shù)及功能簡(jiǎn)介匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • python創(chuàng)建一個(gè)最簡(jiǎn)單http webserver服務(wù)器的方法

    python創(chuàng)建一個(gè)最簡(jiǎn)單http webserver服務(wù)器的方法

    這篇文章主要介紹了python創(chuàng)建一個(gè)最簡(jiǎn)單http webserver服務(wù)器的方法,實(shí)例分析了Python操作http創(chuàng)建服務(wù)器端的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式

    文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式

    這篇文章主要介紹了文件上傳服務(wù)器-jupyter 中python解壓及壓縮方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 書單|人生苦短,你還不用python!

    書單|人生苦短,你還不用python!

    Python 誕生之初就被譽(yù)為最容易上手的編程語言。進(jìn)入火熱的 AI 人工智能時(shí)代后,它也逐漸取代 Java,成為編程界的頭牌語言。下面這篇文章主要給大家總結(jié)介紹了一些關(guān)于python的書單,需要的朋友可以參考下。
    2017-12-12
  • pycharm+PyQt5+python最新開發(fā)環(huán)境配置(踩坑)

    pycharm+PyQt5+python最新開發(fā)環(huán)境配置(踩坑)

    這篇文章主要介紹了pycharm+PyQt5+python最新開發(fā)環(huán)境配置(踩坑),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • python實(shí)現(xiàn)貪吃蛇游戲源碼

    python實(shí)現(xiàn)貪吃蛇游戲源碼

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python實(shí)現(xiàn)從ftp服務(wù)器下載文件

    python實(shí)現(xiàn)從ftp服務(wù)器下載文件

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)從ftp服務(wù)器下載文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論

东乌珠穆沁旗| 阿克陶县| 府谷县| 砚山县| 涞水县| 大港区| 浑源县| 黄大仙区| 滦南县| 黄陵县| 托里县| 嘉黎县| 从江县| 郑州市| 洮南市| 师宗县| 永福县| 瑞安市| 安新县| 宿迁市| 泾源县| 绍兴县| 宁晋县| 赤水市| 正宁县| 六安市| 同德县| 鄂托克前旗| 南靖县| 姚安县| 敦化市| 武乡县| 建阳市| 进贤县| 东至县| 阳山县| 疏勒县| 高雄市| 青海省| 余庆县| 阳江市|