ホームページ  >  記事  >  バックエンド開発  >  Python と OCR を使用したドキュメント解析の完全なコード デモ (コードは添付)

Python と OCR を使用したドキュメント解析の完全なコード デモ (コードは添付)

王林
王林転載
2023-04-14 09:19:02888ブラウズ

Python と OCR を使用したドキュメント解析の完全なコード デモ (コードは添付)

ドキュメントの解析には、ドキュメント内のデータを調べて有用な情報を抽出することが含まれます。自動化により多くの手作業を削減できます。一般的な解析戦略は、文書を画像に変換し、認識にコンピューター ビジョンを使用することです。文書画像分析とは、文書の画像のピクセル データから情報を取得するテクノロジーを指しますが、場合によっては、期待される結果 (テキスト、画像、グラフ、数値、表、数式) について明確な答えがない場合があります。 ..)。

Python と OCR を使用したドキュメント解析の完全なコード デモ (コードは添付)

OCR (光学式文字認識) は、コンピューター ビジョンを通じて画像内のテキストを検出および抽出するプロセスです。第一次世界大戦中にイスラエルの科学者エマニュエル・ゴールドバーグが文字を読み取って電信コードに変換できる機械を開発したときに発明されました。現在この分野は、画像処理、テキストローカリゼーション、文字セグメンテーション、文字認識を組み合わせた非常に洗練されたレベルに達しています。基本的にはテキストのオブジェクト検出技術です。

この記事では、OCR を使用してドキュメントを解析する方法を説明します。他の同様の状況で簡単に使用できる (コピー、貼り付け、実行するだけ) 便利な Python コードをいくつか紹介し、完全なソース コードのダウンロードも提供します。

ここでは、上場企業のPDF形式の財務諸表を例に挙げます(下記リンク)。

#https://s2.q4cdn.com/470004039/files/doc_financials/2021/q4/_10-K-2021-(As-Filed).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

これはスクリーンショットとまったく同じです。ページの画像をローカルに保存したい場合は、次のコードを使用できます:

# 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 の最初の汎用パッケージと思われます。タスクを完了するために 2 つのよく知られたモデルを使用します:


Detection: Facebook の最も高度なオブジェクト検出ライブラリ (ここでは 2 番目のバージョンの Detectron2 を使用します)。


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

Tesseract: 最も有名な OCR システムは 1985 年に Hewlett-Packard によって作成され、現在は Google によって開発されています。


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://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)

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文档中的文本,数字和表格。

以上がPython と OCR を使用したドキュメント解析の完全なコード デモ (コードは添付)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。