このプラグインは Docling と統合し、 PDF 、 Word ドキュメント、その他の入力形式の構造化処理を spaCy パイプラインにもたらします。クリーンな構造化データをテキストベースの形式で出力し、spaCy の使い慣れたDoc
オブジェクトを作成します。これにより、セクションや見出しなどのラベル付きテキスト スパンや、データがpandas.DataFrame
に変換されたテーブルにアクセスできるようになります。
このワークフローにより、言語分析、固有表現認識、テキスト分類などを含む強力なNLP テクニックをドキュメントに簡単に適用できます。 RAG パイプラインのチャンク化の実装にも最適です。
️ このパッケージにはPython 3.10以降が必要です。
pip install spacy-layout
トークン化のためにnlp
オブジェクトを使用してspaCyLayout
プリプロセッサを初期化した後、それをドキュメント パス上で呼び出して構造化データに変換できます。結果として得られるDoc
オブジェクトには、元の生のテキストにマッピングされ、コンテンツ タイプやレイアウト機能を含むさまざまな属性を公開するレイアウト スパンが含まれます。
import spacy
from spacy_layout import spaCyLayout
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
# Process a document and create a spaCy Doc object
doc = layout ( "./starcraft.pdf" )
# The text-based contents of the document
print ( doc . text )
# Document layout including pages and page sizes
print ( doc . _ . layout )
# Tables in the document and their extracted data
print ( doc . _ . tables )
# Layout spans for different sections
for span in doc . spans [ "layout" ]:
# Document section and token and character offsets into the text
print ( span . text , span . start , span . end , span . start_char , span . end_char )
# Section type, e.g. "text", "title", "section_header" etc.
print ( span . label_ )
# Layout features of the section, including bounding box
print ( span . _ . layout )
# Closest heading to the span (accuracy depends on document structure)
print ( span . _ . heading )
大量のドキュメントを大規模に処理する必要がある場合は、 spaCyLayout.pipe
メソッドを使用できます。このメソッドは、代わりにパスまたはバイトの反復可能値を受け取り、 Doc
オブジェクトを生成します。
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
for doc in layout . pipe ( paths ):
print ( doc . _ . layout )
ドキュメントを処理した後、構造化されたDoc
オブジェクトを spaCy の効率的なバイナリ形式でシリアル化できるため、リソースを大量に消費する変換を再実行する必要がありません。
spaCy では、すでに作成されているDoc
でnlp
オブジェクトを呼び出すこともできるため、言語分析や固有表現認識のためのコンポーネントのパイプラインを簡単に適用したり、ルールベースのマッチングを使用したり、spaCy で実行できるその他のことを行うことができます。
# Load the transformer-based English pipeline
# Installation: python -m spacy download en_core_web_trf
nlp = spacy . load ( "en_core_web_trf" )
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
# Apply the pipeline to access POS tags, dependencies, entities etc.
doc = nlp ( doc )
テーブルは、レイアウト スパンに"table"
ラベルが付けられ、ショートカットDoc._.tables
の下に含まれます。これらは、 layout
拡張属性と、 pandas.DataFrame
に変換された表形式データを含む属性data
を公開します。
for table in doc . _ . tables :
# Token position and bounding box
print ( table . start , table . end , table . _ . layout )
# pandas.DataFrame of contents
print ( table . _ . data )
デフォルトでは、スパン テキストはプレースホルダーTABLE
ですが、データのpandas.DataFrame
を受け取るspaCyLayout
にdisplay_table
コールバックを提供することで、テーブルのレンダリング方法をカスタマイズできます。これにより、文書テキストに表の図を含めることができ、後で、たとえばトレーニングされた固有表現認識装置やテキスト分類子による情報抽出中にそれらを使用することができます。
def display_table ( df : pd . DataFrame ) -> str :
return f"Table with columns: { ', ' . join ( df . columns . tolist ()) } "
layout = spaCyLayout ( nlp , display_table = display_table )
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
print ( doc . _ . layout )
for span in doc . spans [ "layout" ]:
print ( span . label_ , span . _ . layout )
属性 | タイプ | 説明 |
---|---|---|
Doc._.layout | DocLayout | ドキュメントのレイアウト機能。 |
Doc._.pages | list[tuple[PageLayout, list[Span]]] | ドキュメント内のページとそこに含まれるスパン。 |
Doc._.tables | list[Span] | ドキュメント内のすべてのテーブル。 |
Doc.spans["layout"] | spacy.tokens.SpanGroup | レイアウトはドキュメント内にまたがります。 |
Span.label_ | str | 抽出されたレイアウト スパンのタイプ (例: "text" または"section_header" 。オプションについてはこちらをご覧ください。 |
Span.label | int | スパンラベルの整数ID。 |
Span.id | int | レイアウト スパンの実行インデックス。 |
Span._.layout | SpanLayout | None | レイアウト スパンのレイアウト機能。 |
Span._.heading | Span | None | 利用可能な場合、スパンに最も近い方位。 |
Span._.data | pandas.DataFrame | None | テーブル スパンの抽出されたデータ。 |
属性 | タイプ | 説明 |
---|---|---|
page_no | int | ページ番号 (1 から始まる)。 |
width | float | ピクセル単位のページ。 |
height | float | ページの高さ (ピクセル単位)。 |
属性 | タイプ | 説明 |
---|---|---|
pages | list[PageLayout] | ドキュメント内のページ。 |
属性 | タイプ | 説明 |
---|---|---|
x | float | 境界ボックスの水平オフセット (ピクセル単位)。 |
y | float | 境界ボックスの垂直オフセット (ピクセル単位)。 |
width | float | ピクセル単位の境界ボックスの幅。 |
height | float | 境界ボックスの高さ (ピクセル単位)。 |
page_no | int | スパンが存在するページの番号。 |
spaCyLayout
spaCyLayout.__init__
ドキュメントプロセッサを初期化します。
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
口論 | タイプ | 説明 |
---|---|---|
nlp | spacy.language.Language | トークン化に使用する初期化されたnlp オブジェクト。 |
separator | str | 作成されたDoc オブジェクト内のセクションを区切るために使用されるトークン。セパレータはレイアウト スパンの一部になりません。 None の場合、区切り文字は追加されません。デフォルトは"nn" です。 |
attrs | dict[str, str] | カスタム spaCy 属性をオーバーライドします。 "doc_layout" 、 "doc_pages" 、 "doc_tables" 、 "span_layout" 、 "span_data" 、 "span_heading" および"span_group" を含めることができます。 |
headings | list[str] | Span._.heading 検出で考慮する見出しのラベル。デフォルトは["section_header", "page_header", "title"] です。 |
display_table | Callable[[pandas.DataFrame], str] | str | Doc.text またはプレースホルダー テキスト内のテーブルのテキストベースの表現を生成する関数。デフォルトは"TABLE" です。 |
docling_options | dict[InputFormat, FormatOption] | Docling のDocumentConverter に渡される形式オプション。 |
返品 | spaCyLayout | 初期化されたオブジェクト。 |
spaCyLayout.__call__
ドキュメントを処理し、テキスト コンテンツとレイアウト スパンを含む spaCy Doc
オブジェクトを作成します。これは、デフォルトでDoc.spans["layout"]
経由で利用可能です。
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
口論 | タイプ | 説明 |
---|---|---|
source | str | Path | bytes | 処理するドキュメントのパスまたはバイト。 |
返品 | Doc | 処理された spaCy Doc オブジェクト。 |
spaCyLayout.pipe
複数のドキュメントを処理し、spaCy Doc
オブジェクトを作成します。大量のドキュメントを大規模に処理する場合は、この方法を使用する必要があります。
layout = spaCyLayout ( nlp )
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
docs = layout . pipe ( paths )
口論 | タイプ | 説明 |
---|---|---|
sources | Iterable[str | Path | bytes] | 処理するドキュメントまたはバイトのパス。 |
収量 | Doc | 処理された spaCy Doc オブジェクト。 |