Unstructuredを試してみる
過去、LangChainとかLlamaIndexとか、何かしらのレイヤーを介してしか触っていないので、単体で触ってみる。
Unstructuredはオープンソースと商用サービスの両方を提供している様子。
エンタープライズ向けプラットフォーム(Coming soonっぽい)
サーバレスAPI
今回はオープンソース版で。
Unstructured オープンソース
unstructured
ライブラリは、画像やPDF、HTMLファイル、Word文書などのテキストベースの文書など、多様なデータ形式の取り込みと事前処理を簡素化するように設計されたオープンソースのツールキットを提供している。unstructured
は、大規模言語モデル(LLM)のデータワークフローの最適化に重点を置いており、モジュール機能とコネクタをシームレスに連携させる。この統合システムは、非構造化データを構造化フォーマットに効率的に変換することを保証し、同時にさまざまなプラットフォームやユースケースへの適応性も提供する。主な機能
- 正確な文書抽出: Unstructuredは、文書から要素やメタデータを抽出する高度な機能を備えている。これには、さまざまな文書要素タイプやメタデータが含まれる。文書要素とメタデータについて詳しくはこちら。
- 幅広いファイルのサポート: プラットフォームは、幅広い種類のファイルをサポートしており、PDF、画像、HTMLなど、さまざまな文書フォーマットを柔軟に処理できる。サポートされているファイルの種類についての詳細は、こちらを参照。
- 堅牢なコア機能: Unstructuredは、効率的なデータ処理に不可欠なコア機能のスイートを提供する。これには以下が含まれる。
- パーティショニング: Unstructuredのパーティショニング機能により、未加工の非構造化文書から構造化コンテンツを抽出することができる。この機能は、未整理のデータを使用可能な形式に変換し、効率的なデータ処理と分析を支援するために不可欠である。
- クリーニング: NLPモデル用のデータ準備では、品質を確保するためにクリーニングが必要になることが多い。Unstructuredライブラリには、出力のクリーンアップ、不要なコンテンツの削除、NLPモデルのパフォーマンス向上を支援するクリーニング機能が含まれている。このステップは、下流のアプリケーションに渡される前のデータの整合性を維持するために不可欠である。
- 抽出: この機能により、ドキュメント内の特定のエンティティを抽出することができる。関連する情報を識別し、分離するように設計されており、ユーザーはドキュメント内の最も関連性の高いデータに集中しやすくなる。
- ステージング: ステージング機能は、下流システムへの取り込みに備えてデータを準備するのに役立つ。この機能は、
Destination Connectors
に置き換わる予定であることに注意されたい。- チャンキング: Unstructuredのチャンキングプロセスは、従来の方法とは異なる。チャンクの形成にテキストベースの機能のみに頼るのではなく、Unstructuredはドキュメントフォーマットの深い理解を活用して、ドキュメントをセマンティックユニット(ドキュメント要素)に分割する。
- 高性能コネクタ: このプラットフォームには、効率的なデータ取り込みと出力のための最適化されたコネクタが含まれている。これには、データ入力用のソースコネクタと、データエクスポート用のデスティネーションコネクタが含まれる。
一般的なユースケース
- モデルの事前学習
- モデルの微調整
- 検索拡張生成(RAG)
- 伝統的なETL
制限
オープンソースライブラリには、Unstructured APIサービスおよびUnstructuredプラットフォームと比較して、以下の制限がある。
- 本番環境での使用を想定していない。
- ドキュメントおよびテーブル抽出時のパフォーマンスが大幅に低下する。
- 旧式で洗練度の低いビジョン・トランスフォーマー・モデルのみにアクセスできる。
- Unstructuredの微調整されたOCRモデルにアクセスできない。
- Unstructuredのページ別および類似性によるチャンキング戦略にアクセスできない。
- セキュリティとSOC2およびHIPAA準拠の欠如。
- 認証またはID管理なし。
- 増分データロードなし。
- ETLジョブのスケジュールまたはモニタリングなし。
- 文書からの画像抽出なし。
- 文書階層検出の精度が低い。
- PopplerやTesseractなどのライブラリなど、多くのコード依存関係を管理する必要がある。
- 並列化やその他のパフォーマンス最適化を含む、独自のインフラストラクチャを管理する必要がある。
テレメトリー
このオープンソースライブラリを使用すると、非構造化サーバーレスAPIサービスへの呼び出しが可能になる。このような呼び出しを行う予定の場合は、次の点に留意していただきたい。
弊社はScarfと提携し、匿名化されたユーザー統計を収集することで、コミュニティがどの機能を使用しているかを把握し、今後の製品決定の優先順位付けに役立てている。
このデータの収集および利用方法の詳細については、弊社のプライバシーポリシーをご参照ください。
このデータ収集を拒否するには、Unstructured Serverless APIサービスを呼び出すコマンドを実行する前に、環境変数
SCARF_NO_ANALYTICS=true
を設定する。
対応しているファイルタイプ一覧
インストール
インストール方法は、PythonパッケージとDockerイメージがある。普通に使う分にはPythonパッケージでいいと思うのだけど、いろいろ依存ライブラリが多くて面倒。1年ぐらい前にLangChainのPDF LoaderでUnstructuredを試した際にもいろいろライブラリのインストールをしている(今は変わっているかもしれない)
今回はUnstructuredのライブラリ単体としての使い方を試したいので、公式のDockerイメージを使おうと思う。どうやら必要なライブラリ等が全部セットアップされているように思うので。
$ docker run -it --rm -p 8888:8888 downloads.unstructured.io/unstructured-io/unstructured:latest bash
JupyterLabを使いたいので8888番ポートを開けている。
ということで、コンテナに入ったらJupyterLabのインストールと起動。
$ pip install jupyterlab ipywidgets
$ jupyter-lab --ip="0.0.0.0" --NotebookApp.token=""
ブラウザで8888番ポートにアクセスしてJupyterLabにアクセス
GitHubレポジトリにあるサンプルのデータが用意されている。
notebookを開く
サンプルのデータを読み込んでみる。以下をセルに入力して何もエラーが出なければOK
from unstructured.partition.pdf import partition_pdf
elements = partition_pdf(filename="example-docs/pdf/layout-parser-paper-fast.pdf")
from unstructured.partition.text import partition_text
elements = partition_text(filename="example-docs/fake-text.txt")
"Using Unstructured open source"に従って、Unstructuredのコア機能を見ていく。
コア機能
Unstructuredライブラリには、未加工のソース文書を分割、チャンク化、クリーンアップ、ステージングするための機能が含まれている。これらの機能はライブラリ内の主要な公開インターフェースとして機能する。
このセクションを読めば、以下の内容が理解できるはずである。
- ドキュメントをjsonまたはcsvに分割する方法。
- クリーニング機能を使用して、ドキュメント要素から不要なコンテンツを削除する方法。
- 抽出機能を使用して、ドキュメントからコンテンツを抽出する方法。
- ステージング機能を使用して、下流のユースケースで使用するためのデータを準備する方法
- 検索強化型生成(RAG)などのユースケースで使用するための分割されたドキュメントをチャンク化する方法。
パーティショニング
「パーティショニング」という表現がちょっとわかりにくいのだけども、おそらく
- 非構造化ドキュメントから、構造化されたコンテンツを抽出し
- タイトルやリストのアイテムといった「要素」単位に分割する
ということなので、非構造化ドキュメントを構造化コンテンツ、つまり要素単位で取り出せるフォーマットに「変換する」と意味に近いと思う。要素単位に「分割」するというのが「パーティショニング」という語感には近い気がするし、コア機能の中には「抽出」というのもあって、こちらは特定のエンティティを取り出す、というものらしい。うーん、表現が難しいな。
パーティショニングはpartition
関数にファイルを渡すことで行われる。内部では、libmagic
がファイルタイプを判別し、各ファイルタイプごとに用意されたpartition_XXX
関数が呼び出されるようになっているので、partition
関数はラッパーのようになっているっぽい。
サンプルにある"example-docs/pdf/layout-parser-paper-fast.pdf"を使ってみる。以下のようなもの。
ファイルを直接パーティショニング。
from unstructured.partition.auto import partition
elements = partition(
filename="example-docs/pdf/layout-parser-paper-fast.pdf"
)
print("\n----------\n".join([str(el) for el in elements][:10]))
ファイルオブジェクトとして読み込んでからパーティショニングすることもできる。
from unstructured.partition.auto import partition
with open("example-docs/pdf/layout-parser-paper-fast.pdf", "rb") as f:
elements = partition(file=f, include_page_breaks=True)
print("\n----------\n".join([str(el) for el in elements][:10]))
オプションとして、
-
content_type="application/pdf"
のようにファイルタイプを明示的に指定すると、ファイルタイプの判別をスキップする - 複数ページをサポートするファイルタイプの場合は
include_page_breaks=True
を指定すると、ページ区切り要素も含めたりできる。
などもあり、ファイルタイプによってオプションや振る舞いが変わるのだろうと思う。
from unstructured.partition.auto import partition
elements = partition(
filename="example-docs/pdf/layout-parser-paper-fast.pdf",
content_type="application/pdf",
include_page_breaks=True,
)
print("\n----------\n".join([str(el) for el in elements][10:20]))
ドキュメントのファイルタイプに合わせたpartition_XXX
関数を直接呼び出すこともできる。ファイルタイプがあらかじめ決まっている場合には、ファイル判別処理を省略できる・依存ライブラリを減らせる・ラッパーであるpartition
にはないファイルタイプ固有の機能を呼び出せる、というメリットがある。
例えばHTML向けのpartition_html
の場合、URLを直接指定することができる。
from unstructured.partition.html import partition_html
url = "https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1"
elements = partition_html(url=url)
print("\n----------\n".join([str(el) for el in elements[:15]]))
kun432
----------
(日本語訳) Vector databases (Part 1): What makes each one different?
----------
2023/09/21に公開
----------
2023/09/28
----------
1件
----------
VectorDB
----------
vectorsearch
----------
vectordatabase
----------
vectorstore
----------
tech
----------
日本語訳: ベクトルデータベース(パート1): それぞれの違いは?
----------
訳者前書き
----------
ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。
----------
全4回の記事の第1回目となります。
----------
https://thedataquarry.com/posts/vector-db-1/
一応partition
関数でもURLは渡せるようではあるし、URL先がPDFでも普通に使えたりはするが、うまくいかないときなどは個別の関数を呼び出すほうが確実なのかも。
from unstructured.partition.auto import partition
elements = partition(
url="https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1"
)
print("\n----------\n".join([str(el) for el in elements[:15]]))
上記以外にも各ファイルタイプ個別のパーティショニング関数がリストアップされている。
クリーニング
パーティショニング後に不要な部分を削除するのがクリーニング。このための関数が色々用意されている。
-
bytes_string_to_string
: バイト文字列を文字列に変換 -
clean
: 箇条書きの記号、余分な空白、ダッシュ、末尾の句読点を削除し、オプションで小文字に変換。 -
clean_bullets
: 箇条書きの記号を削除 -
clean_dashes
: ダッシュを削除 -
clean_non_ascii_chars
: 非ASCII文字を削除 -
clean_ordered_bullets
: 番号付きリストの数字を削除 -
clean_postfix
: パターンにマッチした文字列以後を削除 -
clean_prefix
: パターンにマッチした文字列以前を削除 -
clean_trailing_punctuation
: 末尾の句読点を削除 -
group_broken_paragraphs
: 段落を結合 -
remove_punctuation
: 句読点を削除 -
replace_unicode_quotes
: クォーテーションを削除 -
translate_text
: 文字を翻訳(Helsinki-NLPを使用した機械翻訳)
また、自分でクリーニング用の関数を用意して文字列に適用することもできる
import re
from unstructured.partition.auto import partition
elements = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97"
)
# 本文の最初の1行
target_element = elements[8]
print(f"クリーニング前: {target_element}")
# 脚注記号を削除する関数
remove_citations = lambda text: re.sub("\[\d{1,3}\]", "", text)
# 関数を適用
target_element.apply(remove_citations)
print(f"クリーニング後: {target_element}")
クリーニング前: オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬[1]。
クリーニング後: オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬。
適宜必要なものを使用すれば良い。
抽出
特定の要素を週出するための関数も色々用意されている。
-
extract_datetimetz
: メールのReceivedヘッダから、日時を抽出してdatetimeオブジェクトで返す -
extract_email_address
: メールアドレスを抽出 -
extract_ip_address
: IPv4/v6アドレスを抽出 -
extract_ip_address_name
: メールのReceivedヘッダから、IPv4/v6アドレスに紐づいたホスト名を抽出 -
extract_mapi_id
: メールのReceivedヘッダから、MAPI IDを抽出 -
extract_ordered_bullets
: 箇条書きを抽出する -
extract_text_after
: パターンにマッチした文字列以前の文字列を抽出 -
extract_text_before
: パターンにマッチした文字列以後の文字列を抽出 -
extract_us_phone_number
: アメリカの電話番号を抽出 -
group_broken_paragraphs
: 段落を結合 -
remove_punctuation
: 句読点を削除 -
replace_unicode_quotes
: クォーテーションを削除 -
translate_text
: 文字を翻訳(Helsinki-NLPを使用した機械翻訳)
なんとなくメール周りが多いのと、後半はクリーニングで出てきたものが含まれている感じ。と思ったら、extractはモジュール空間的にはcleaners
と同じみたいで、group_broken_paragraphs
はクリーニングで出てきたものと同じだった。
ここも必要なものを適宜使用すればいい感じかな?一応、サンプルのメールデータから取り出してみた。
from unstructured.partition.email import partition_email
from unstructured.cleaners.extract import (
extract_datetimetz,
extract_email_address,
extract_ip_address,
extract_ip_address_name,
extract_mapi_id,
extract_ordered_bullets,
)
with open("example-docs/eml/fake-email-header.eml", "r") as f:
text = f.read()
print(extract_datetimetz(text))
print(extract_email_address(text))
print(extract_ip_address(text))
print(extract_ip_address_name(text))
2023-02-20 10:03:18+12:00
['hello@unstructured.io', 'cadc-_xalb2fevq7mnsox+njb_7hajhbka_zet-rtgpgenj0uvw@mail.gmail.com', 'mrobinson@unstructured.io', 'mrobinson@unstructured.io', 'fake-email@unstructured.io', 'test@unstructured.io']
['00.0.0.00', 'ba23::58b5:2236:45g2:88h2']
['ABCDEFG-000.ABC.guide', 'ABCDEFG-000.ABC.guide', 'mail.gmail.com']
テキストとして読み込んでから抽出するのはできてるんだけども、パーティショニングした場合はある程度分割されて余計なものはないようには思うのだけど、どういう風に抽出と組み合わせるのか?のイメージが沸かなかった。なんというか、できなくはないんだけども、もうちょっとさらっと拾いたい感じ。
from unstructured.partition.email import partition_email
elements = partition_email(
filename="example-docs/eml/fake-email-header.eml",
include_headers=True,
)
print("\n----------\n".join([str(el) for el in elements]))
ABCDEFG-000.ABC.guide: 00.0.0.00
----------
ABCDEFG-000.ABC.guide: ba23::58b5:2236:45g2:88h2
----------
received_datetimetz: 2023-02-20 10:03:18+12:00
----------
MIME-Version: 1.0
----------
Date: Fri, 16 Dec 2022 17:04:16 -0500
----------
Hello: hello@unstructured.io
----------
Message-ID: CADc-_xaLB2FeVQ7mNsoX+NJb_7hAJhBKa_zet-rtgPGenj0uVw@mail.gmail.com
----------
Test Email
----------
Matthew Robinson: mrobinson@unstructured.io
----------
Matthew Robinson: mrobinson@unstructured.io
----------
Fake Email: fake-email@unstructured.io
----------
test: test@unstructured.io
----------
Content-Type: multipart/alternative; boundary="00000000000095c9b205eff92630"
----------
This is a test email to use for unit tests.
----------
Important points:
----------
Roses are red
----------
Violets are blue
ステージング
ここはOverviewにあったとおりデータの準備に関する機能なんだけども、
ステージング機能を使用して、下流のユースケースで使用するためのデータを準備する方法
ステージングはdeprecatedになっていて、データの処理フローみたいなものは、以下にあるsource connectors
/destination connectors
で行うみたい。
ということでここはスキップ。
チャンク分割
パーティショニングは要素単位での分割だったけども、こちらはセマンティックな単位での分割を指す。パーティショニングができるということは、ドキュメントの「要素」つまり「構造」もわかっているので、セマンティックな単位でも分割できるということになる。
基本的なコンセプトは以下とある。
- チャンク分割はドキュメントの要素に対して実行される。これは、パーティショニングの後に実行される個別のステップであり、パーティショニングによって生成された要素に対して実行される。(ただし、パーティショニングと組み合わせて1つのステップとして実行することも可能である。)
- 一般的に、チャンク分割では、連続する要素を結合して、最大チャンクサイズを超えない範囲で可能な限り大きなチャンクを形成する。
- 単独で最大チャンクサイズを超える要素は、テキスト分割を使用して2つ以上のチャンクに分割される。
- チャンク分割により、
CompositeElement
、Table
、またはTableChunk
要素のシーケンスが生成される。各「チャンク」は、これら3つのタイプのいずれかのインスタンスである。
プロセスとしては、パーティショニング後の分割された要素に対してチャンク分割するということらしい。
チャンク分割のパラメータ
-
max_characters: int (default=500)
- 1チャンクあたりの「ハード」な最大文字数。
-
new_after_n_chars: int (default=max_characters)
- 1チャンクあたりの「ソフト」な最大文字数。
- max_characters と組み合わせて「推奨」サイズを設定するために使用する。
- 例
- 1000文字程度のチャンクにしたいが、1500文字程度なら分割せずに1つのチャンクとしたい。
-
max_characters=1500, new_after_n_chars=1000
のように指定する。
- 例
-
overlap: int (default=0)
- チャンクが最大文字数を超える場合の分割に限り、一定の文字数を重複することで、コンテキストの分断を防ぐ。
-
overlap_all: book (default=False)
:- すべてのチャンクでオーバーラップさせる。
- 通常は、セマンティックな単位の要素からチャンクは形成されるため、このオプションを有効にすると複数のセマンティックな境界が含まれてしまう可能性がある
自分が今まで触れてきたチャンク分割とはちょっと違う、というかより細かい感じがする。このあたりは要素としてパーティショニングできる前提であるUnstructuredでは意味合いが違うのかもね。
ではやってみる。単純にパーティショニングをそのままチャンク分割として使う。
from unstructured.partition.auto import partition
chunks = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97",
chunking_strategy="basic"
)
print("\n----------\n".join([str(chunk) for chunk in chunks[:6]]))
オグリキャップ
English
한국어
中文
リンクを編集
出典: フリー百科事典『ウィキペディア(Wikipedia)』
----------
この記事は「 旧馬齢表記 」が採用されており、国際的な表記法や2001年以降の日本国内の表記とは異なっています。 詳しくは 馬齢#日本における馬齢表記 を参照してください。
----------
オグリキャップ 1994年8月、 優駿スタリオンステーション にて 現役期間 1987年 - 1990年 欧字表記 Oguri Cap [ 1 ] 品種 サラブレッド [ 1 ] 性別 牡 [ 1 ] 毛色 芦毛 [ 1 ] 生誕 1985年 3月27日 [ 1 ] 死没 2010年 7月3日 (25歳没) 父 ダンシングキャップ [ 1 ] 母 ホワイトナルビー [ 1 ]
----------
母の父 シルバーシャーク [ 1 ] 生国 日本 ( 北海道 三石町 ) [ 1 ] 生産者 稲葉不奈男 [ 1 ] 馬主 小栗孝一 → 佐橋五十雄 →近藤俊典 [ 1 ] 調教師 鷲見昌勇 ( 笠松 ) → 瀬戸口勉 ( 栗東 ) [ 1 ] 厩務員 三浦裕一(笠松) →川瀬友光(笠松) → 池江敏郎 (栗東) 競走成績 タイトル JRA賞年度代表馬 (1990年) 最優秀4歳牡馬 (1988年) JRA賞特別賞 (1989年) 最優秀5歳以上牡馬 (1990年) NARグランプリ特別表彰馬 (1990年) 顕彰馬 (1991年選出)
----------
生涯成績 32戦22勝 [ 1 ] 地方 :12戦10勝 中央 :20戦12勝 獲得賞金 9億1251万2000円 [ 1 ] 地方:2281万円 中央:8億8970万2000円 勝ち鞍 GI 有馬記念 1988年 ・ 1990年 GI マイルCS 1989年 GI 安田記念 1990年 GII NZT4歳S 1988年 GII 高松宮杯 1988年 GII 毎日王冠 1988年 ・ 1989年 GIII ペガサスS 1988年 GIII 毎日杯 1988年 GIII 京都4歳特別 1988年 GIII オールカマー 1989年 テンプレートを表示
----------
オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬[1]。
1987年5月に岐阜県の地方競馬・笠松競馬場でデビュー。8連勝、重賞5勝を含む12戦10勝を記録した後、1988年1月に中央競馬へ移籍し、重賞12勝(うちGI4勝)を記録した。1988年度のJRA賞最優秀4歳牡馬[† 1]、1989年度のJRA賞特別賞[† 1]、1990年度のJRA賞最優秀5歳以上牡馬および年度代表馬[† 1]。1991年、JRA顕彰馬に選出。愛称は「オグリ」「芦毛の怪物」「スーパーホース」など多数。
中央競馬時代はスーパークリーク、イナリワンの二頭とともに「平成三強」と総称され、自身と騎手である武豊の活躍を中心として起こった第二次競馬ブーム期において[2]、第一次競馬ブームの立役者とされるハイセイコーに比肩するとも評される高い人気を得た。 日本競馬史上屈指のアイドルホースである。 [3]。
パーティショニングの例とほとんど同じようにpartition
で分割しているのだけども、chunking_strategy="basic"
を付与しているので、結果が異なっている。
chunking_strategy
にはbasic
とby_title
がある。
-
basic
- 指定された
max_characters
とnew_after_n_chars
を両方踏まえつつ、各チャンクを最大限に埋めるためにシーケンシャルな要素を組み合わせる。 -
max_characters
を超える要素は複数のチャンクに分割される。ただし、次の要素と結合はされない。 -
Table
要素は常に単独のチャンクとなるが、max_characters
を超える場合は複数のTableChunk
要素に分割される -
overlap
が指定されている場合、max_characters
を超えて分割されたチャンクでオーバーラップが適用される。さらにoverlap_all: True
の場合はすべてのチャンクにオーバーラップが適用される。
- 指定された
-
by_title
-
basic
に加えて、文書のセクションやページなどの境界は保持されたまま、つまりここは複数のチャンクに分かれることはない。 - その他以下のような挙動になる
-
セクションの見出しを検出する。
-
Title
要素は新しいセクションの開始とみなされる。 -
Title
要素が検出された場合、そのTitle
要素が前のチャンクに収まる場合でも、前のチャンクは閉じられ、新しいチャンクが開始される。
-
-
ページ境界を尊重する。
- ページ境界は、
multipage_sections
を指定すると改ページは新しいチャンクを開始しない。 - デフォルトはTrueだが、False に設定すると異なるページにまたがる要素は別々のチャンクに分割される。
- ページ境界は、
-
小さなセクションを結合する。
- 一部の文書では、セクションの見出しとして適切でない場合でも、リスト項目やその他の短い段落がタイトル要素として識別されることがある。これにより、意図したよりもかなり小さいチャンクが生成される可能性がある。
-
combine_text_under_n_chars
を使用すると、連続する小さなセクションがチャンクウィンドウを最大限に埋めるように結合される。 - デフォルト値はmax_charactersと同じ値だが、0に設定するとセクション結合が無効になる。
-
セクションの見出しを検出する。
-
上のサンプルでchunking_strategy="by_title"
を指定してみたがあまり違いは見られなかった。文書によっては有用なケースが有るのかもしれない。
chunking_strategy
を使わずに、チャンク分割用の関数を適用するやり方もある。
chunking_strategy="basic"
のかわりに、chunk_elements
を使う。
from unstructured.partition.auto import partition
from unstructured.chunking.basic import chunk_elements
elements = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97",
)
chunks = chunk_elements(elements)
print("\n----------\n".join([str(chunk) for chunk in chunks[:10]]))
chunking_strategy="by_title"
のかわりに、chunk_by_title
を使う。
from unstructured.partition.auto import partition
from unstructured.chunking.title import chunk_by_title
elements = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97",
)
chunks = chunk_by_title(elements)
print("\n----------\n".join([str(chunk) for chunk in chunks[:10]]))
パーティショニングによって分割された要素は、実はそれぞれ要素としての情報を持っている。
from unstructured.partition.auto import partition
elements = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97",
)
for element in elements[8:11]:
print(element.to_dict())
print("----------")
{'type': 'Title', 'element_id': '75aa57cbf05659941d806823cc827646', 'text': 'オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬[1]。', 'metadata': {'category_depth': 0, 'emphasized_text_contents': ['オグリキャップ'], 'emphasized_text_tags': ['b'], 'link_texts': ['1985年', '3月27日', '2010年', '7月3日', '日本', '競走馬', '種牡馬', '[1]'], 'link_urls': ['/wiki/1985%E5%B9%B4', '/wiki/3%E6%9C%8827%E6%97%A5', '/wiki/2010%E5%B9%B4', '/wiki/7%E6%9C%883%E6%97%A5', '/wiki/%E6%97%A5%E6%9C%AC', '/wiki/%E7%AB%B6%E8%B5%B0%E9%A6%AC', '/wiki/%E7%A8%AE%E7%89%A1%E9%A6%AC', '#cite_note-jbis-1'], 'languages': ['jpn'], 'filetype': 'text/html', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
{'type': 'UncategorizedText', 'element_id': 'bab228e080c8e5bbf3edb50b301005c3', 'text': '1987年5月に岐阜県の地方競馬・笠松競馬場でデビュー。8連勝、重賞5勝を含む12戦10勝を記録した後、1988年1月に中央競馬へ移籍し、重賞12勝(うちGI4勝)を記録した。1988年度のJRA賞最優秀4歳牡馬[† 1]、1989年度のJRA賞特別賞[† 1]、1990年度のJRA賞最優秀5歳以上牡馬および年度代表馬[† 1]。1991年、JRA顕彰馬に選出。愛称は「オグリ」「芦毛の怪物」「スーパーホース」など多数。', 'metadata': {'link_texts': ['1987年', '岐阜県', '地方競馬', '笠松競馬場', '重賞', '1988年', '中央競馬', 'GI', '1988年', 'JRA賞最優秀4歳牡馬', '[† 1]', '1989年', 'JRA賞特別賞', '[† 1]', '1990年', 'JRA賞最優秀5歳以上牡馬', '[† 1]', '1991年', 'JRA顕彰馬', '芦毛'], 'link_urls': ['/wiki/1987%E5%B9%B4', '/wiki/%E5%B2%90%E9%98%9C%E7%9C%8C', '/wiki/%E5%9C%B0%E6%96%B9%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AC%A0%E6%9D%BE%E7%AB%B6%E9%A6%AC%E5%A0%B4', '/wiki/%E9%87%8D%E8%B3%9E', '/wiki/1988%E5%B9%B4', '/wiki/%E4%B8%AD%E5%A4%AE%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AB%B6%E9%A6%AC%E3%81%AE%E7%AB%B6%E8%B5%B0%E6%A0%BC%E4%BB%98%E3%81%91', '/wiki/1988%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%803%E6%AD%B3%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1989%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E7%89%B9%E5%88%A5%E8%B3%9E', '#cite_note-JRA-2', '/wiki/1990%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%804%E6%AD%B3%E4%BB%A5%E4%B8%8A%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1991%E5%B9%B4', '/wiki/JRA%E9%A1%95%E5%BD%B0%E9%A6%AC', '/wiki/%E8%8A%A6%E6%AF%9B'], 'languages': ['jpn'], 'filetype': 'text/html', 'parent_id': '75aa57cbf05659941d806823cc827646', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
{'type': 'Title', 'element_id': '7ed361e1bcbbefd5c5847f658738b46b', 'text': '中央競馬時代はスーパークリーク、イナリワンの二頭とともに「平成三強」と総称され、自身と騎手である武豊の活躍を中心として起こった第二次競馬ブーム期において[2]、第一次競馬ブームの立役者とされるハイセイコーに比肩するとも評される高い人気を得た。 日本競馬史上屈指のアイドルホースである。 [3]。', 'metadata': {'category_depth': 0, 'link_texts': ['スーパークリーク', 'イナリワン', '平成三強', '騎手', '武豊', '第二次競馬ブーム', '[2]', '第一次競馬ブーム', 'ハイセイコー', '[3]'], 'link_urls': ['/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF', '/wiki/%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AF%E3%83%B3', '/wiki/%E5%B9%B3%E6%88%90%E4%B8%89%E5%BC%B7', '/wiki/%E9%A8%8E%E6%89%8B', '/wiki/%E6%AD%A6%E8%B1%8A', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第二次競馬ブーム', '#cite_note-東邦出版(編)2005-131-132-3', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第一次競馬ブーム', '/wiki/%E3%83%8F%E3%82%A4%E3%82%BB%E3%82%A4%E3%82%B3%E3%83%BC', '#cite_note-関口2002-15-4'], 'languages': ['jpn'], 'filetype': 'text/html', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
チャンク分割すると、一次要素としてはこれらの情報は欠落するが、metadata.orig_elements
として取り出せるらしい。
from unstructured.partition.auto import partition
from unstructured.chunking.basic import chunk_elements
elements = partition(
# wikipediaの「オグリキャップ」
url="https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97",
)
chunks = chunk_elements(elements[8:11])
for chunk in chunks:
print(chunk.to_dict())
print("----------")
{'type': 'CompositeElement', 'element_id': 'e996a598-32ef-4823-992b-2660ef91dabc', 'text': 'オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬[1]。\n\n1987年5月に岐阜県の地方競馬・笠松競馬場でデビュー。8連勝、重賞5勝を含む12戦10勝を記録した後、1988年1月に中央競馬へ移籍し、重賞12勝(うちGI4勝)を記録した。1988年度のJRA賞最優秀4歳牡馬[† 1]、1989年度のJRA賞特別賞[† 1]、1990年度のJRA賞最優秀5歳以上牡馬および年度代表馬[† 1]。1991年、JRA顕彰馬に選出。愛称は「オグリ」「芦毛の怪物」「スーパーホース」など多数。\n\n中央競馬時代はスーパークリーク、イナリワンの二頭とともに「平成三強」と総称され、自身と騎手である武豊の活躍を中心として起こった第二次競馬ブーム期において[2]、第一次競馬ブームの立役者とされるハイセイコーに比肩するとも評される高い人気を得た。 日本競馬史上屈指のアイドルホースである。 [3]。', 'metadata': {'emphasized_text_contents': ['オグリキャップ'], 'emphasized_text_tags': ['b'], 'filetype': 'text/html', 'languages': ['jpn'], 'link_texts': ['1985年', '3月27日', '2010年', '7月3日', '日本', '競走馬', '種牡馬', '[1]', '1987年', '岐阜県', '地方競馬', '笠松競馬場', '重賞', '1988年', '中央競馬', 'GI', '1988年', 'JRA賞最優秀4歳牡馬', '[† 1]', '1989年', 'JRA賞特別賞', '[† 1]', '1990年', 'JRA賞最優秀5歳以上牡馬', '[† 1]', '1991年', 'JRA顕彰馬', '芦毛', 'スーパークリーク', 'イナリワン', '平成三強', '騎手', '武豊', '第二次競馬ブーム', '[2]', '第一次競馬ブーム', 'ハイセイコー', '[3]'], 'link_urls': ['/wiki/1985%E5%B9%B4', '/wiki/3%E6%9C%8827%E6%97%A5', '/wiki/2010%E5%B9%B4', '/wiki/7%E6%9C%883%E6%97%A5', '/wiki/%E6%97%A5%E6%9C%AC', '/wiki/%E7%AB%B6%E8%B5%B0%E9%A6%AC', '/wiki/%E7%A8%AE%E7%89%A1%E9%A6%AC', '#cite_note-jbis-1', '/wiki/1987%E5%B9%B4', '/wiki/%E5%B2%90%E9%98%9C%E7%9C%8C', '/wiki/%E5%9C%B0%E6%96%B9%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AC%A0%E6%9D%BE%E7%AB%B6%E9%A6%AC%E5%A0%B4', '/wiki/%E9%87%8D%E8%B3%9E', '/wiki/1988%E5%B9%B4', '/wiki/%E4%B8%AD%E5%A4%AE%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AB%B6%E9%A6%AC%E3%81%AE%E7%AB%B6%E8%B5%B0%E6%A0%BC%E4%BB%98%E3%81%91', '/wiki/1988%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%803%E6%AD%B3%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1989%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E7%89%B9%E5%88%A5%E8%B3%9E', '#cite_note-JRA-2', '/wiki/1990%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%804%E6%AD%B3%E4%BB%A5%E4%B8%8A%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1991%E5%B9%B4', '/wiki/JRA%E9%A1%95%E5%BD%B0%E9%A6%AC', '/wiki/%E8%8A%A6%E6%AF%9B', '/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF', '/wiki/%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AF%E3%83%B3', '/wiki/%E5%B9%B3%E6%88%90%E4%B8%89%E5%BC%B7', '/wiki/%E9%A8%8E%E6%89%8B', '/wiki/%E6%AD%A6%E8%B1%8A', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第二次競馬ブーム', '#cite_note-東邦出版(編)2005-131-132-3', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第一次競馬ブーム', '/wiki/%E3%83%8F%E3%82%A4%E3%82%BB%E3%82%A4%E3%82%B3%E3%83%BC', '#cite_note-関口2002-15-4'], 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97', 'orig_elements': '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'}}
----------
もともとは3つの要素だったものが1つのチャンクになっており、metadata.orig_elements
はシリアライズされた文字列のように見える。metadata.orig_elements
にアクセスしてみる。
for chunk in chunks:
for el in chunk.metadata.orig_elements:
print(el.to_dict())
print("----------")
{'type': 'Title', 'element_id': '75aa57cbf05659941d806823cc827646', 'text': 'オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬[1]。', 'metadata': {'category_depth': 0, 'emphasized_text_contents': ['オグリキャップ'], 'emphasized_text_tags': ['b'], 'link_texts': ['1985年', '3月27日', '2010年', '7月3日', '日本', '競走馬', '種牡馬', '[1]'], 'link_urls': ['/wiki/1985%E5%B9%B4', '/wiki/3%E6%9C%8827%E6%97%A5', '/wiki/2010%E5%B9%B4', '/wiki/7%E6%9C%883%E6%97%A5', '/wiki/%E6%97%A5%E6%9C%AC', '/wiki/%E7%AB%B6%E8%B5%B0%E9%A6%AC', '/wiki/%E7%A8%AE%E7%89%A1%E9%A6%AC', '#cite_note-jbis-1'], 'languages': ['jpn'], 'filetype': 'text/html', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
{'type': 'UncategorizedText', 'element_id': 'bab228e080c8e5bbf3edb50b301005c3', 'text': '1987年5月に岐阜県の地方競馬・笠松競馬場でデビュー。8連勝、重賞5勝を含む12戦10勝を記録した後、1988年1月に中央競馬へ移籍し、重賞12勝(うちGI4勝)を記録した。1988年度のJRA賞最優秀4歳牡馬[† 1]、1989年度のJRA賞特別賞[† 1]、1990年度のJRA賞最優秀5歳以上牡馬および年度代表馬[† 1]。1991年、JRA顕彰馬に選出。愛称は「オグリ」「芦毛の怪物」「スーパーホース」など多数。', 'metadata': {'link_texts': ['1987年', '岐阜県', '地方競馬', '笠松競馬場', '重賞', '1988年', '中央競馬', 'GI', '1988年', 'JRA賞最優秀4歳牡馬', '[† 1]', '1989年', 'JRA賞特別賞', '[† 1]', '1990年', 'JRA賞最優秀5歳以上牡馬', '[† 1]', '1991年', 'JRA顕彰馬', '芦毛'], 'link_urls': ['/wiki/1987%E5%B9%B4', '/wiki/%E5%B2%90%E9%98%9C%E7%9C%8C', '/wiki/%E5%9C%B0%E6%96%B9%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AC%A0%E6%9D%BE%E7%AB%B6%E9%A6%AC%E5%A0%B4', '/wiki/%E9%87%8D%E8%B3%9E', '/wiki/1988%E5%B9%B4', '/wiki/%E4%B8%AD%E5%A4%AE%E7%AB%B6%E9%A6%AC', '/wiki/%E7%AB%B6%E9%A6%AC%E3%81%AE%E7%AB%B6%E8%B5%B0%E6%A0%BC%E4%BB%98%E3%81%91', '/wiki/1988%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%803%E6%AD%B3%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1989%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E7%89%B9%E5%88%A5%E8%B3%9E', '#cite_note-JRA-2', '/wiki/1990%E5%B9%B4', '/wiki/JRA%E8%B3%9E%E6%9C%80%E5%84%AA%E7%A7%804%E6%AD%B3%E4%BB%A5%E4%B8%8A%E7%89%A1%E9%A6%AC', '#cite_note-JRA-2', '/wiki/1991%E5%B9%B4', '/wiki/JRA%E9%A1%95%E5%BD%B0%E9%A6%AC', '/wiki/%E8%8A%A6%E6%AF%9B'], 'languages': ['jpn'], 'filetype': 'text/html', 'parent_id': '75aa57cbf05659941d806823cc827646', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
{'type': 'Title', 'element_id': '7ed361e1bcbbefd5c5847f658738b46b', 'text': '中央競馬時代はスーパークリーク、イナリワンの二頭とともに「平成三強」と総称され、自身と騎手である武豊の活躍を中心として起こった第二次競馬ブーム期において[2]、第一次競馬ブームの立役者とされるハイセイコーに比肩するとも評される高い人気を得た。 日本競馬史上屈指のアイドルホースである。 [3]。', 'metadata': {'category_depth': 0, 'link_texts': ['スーパークリーク', 'イナリワン', '平成三強', '騎手', '武豊', '第二次競馬ブーム', '[2]', '第一次競馬ブーム', 'ハイセイコー', '[3]'], 'link_urls': ['/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%AF', '/wiki/%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AF%E3%83%B3', '/wiki/%E5%B9%B3%E6%88%90%E4%B8%89%E5%BC%B7', '/wiki/%E9%A8%8E%E6%89%8B', '/wiki/%E6%AD%A6%E8%B1%8A', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第二次競馬ブーム', '#cite_note-東邦出版(編)2005-131-132-3', '/wiki/%E7%AB%B6%E9%A6%AC%E3%83%95%E3%82%A1%E3%83%B3#第一次競馬ブーム', '/wiki/%E3%83%8F%E3%82%A4%E3%82%BB%E3%82%A4%E3%82%B3%E3%83%BC', '#cite_note-関口2002-15-4'], 'languages': ['jpn'], 'filetype': 'text/html', 'url': 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%B0%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97'}}
----------
チャンクの元になった要素がすべて取り出せる。
ここはちょっと現時点ではちょっと難しいな。
Embedding
Overviewにはなかったけど、ここの要素を取り出した後にEmbeddingを生成する流れについて書かれている。まあここはUnstructuredネイティブの機能ではないと思うので、スキップ。
一通りコア機能について見てみた。LangChain等のローダー等で触る場合には、こういったドキュメントやデータの「読み取り」「パース」に関するような低レベルAPIに近いところはそれほど意識しなくても良さそうではあるが、基本的な仕組みや挙動などは抑えておいて損はないと思う。
で、ドキュメントを色々見ていると、ステージングのところでも少し触れたように、ETLパイプライン的な機能もあるようで、まあ当然こういうところにも手は広がるよね。
このあたりは既存のETLパイプラインツールもたくさんあるし、最近はよりLLMネイティブなETLパイプラインツールも増えてきているので、競争もなかなか激しそうだけど、ドキュメントのパース部分をウリとしてライブラリとして使うか?、それともまるっと全部乗っかるか?はユースケースによって判断すればいいと思う。