Skip to content

長文ドキュメント抽出 📚

LangExtractはURLから直接ドキュメント全体を処理し、並列処理と感度向上機能により大規模テキストを高精度で処理できます。

アプローチ

LangExtractは長文ドキュメントを自動的に処理します:

  1. テキストを管理可能なチャンクに分割
  2. 各チャンクから並列で抽出
  3. 結果を集約して重複を排除

コード例:『ロミオとジュリエット』全文

WARNING

この例を実行すると大規模ドキュメント(約44,000トークン)を処理し、API料金が発生します。大規模使用にはTier 2 Geminiクォータが推奨されます。

python
import langextract as lx
import textwrap

# 複雑な文学テキスト用の包括的なプロンプトと例を定義
prompt = textwrap.dedent("""\
    与えられたテキストからキャラクター、感情、関係を抽出してください。

    すべてのエンティティに意味のある属性を提供し、コンテキストと深みを追加してください。

    重要:extraction_textには入力の正確なテキストを使用してください。言い換えないでください。
    出現順序でエンティティを抽出し、テキスト範囲は重複しないようにしてください。

    注:劇のスクリプトでは、話者名は全大文字で表示され、ピリオドが続きます。""")

examples = [
    lx.data.ExampleData(
        text=textwrap.dedent("""\
            ROMEO. But soft! What light through yonder window breaks?
            It is the east, and Juliet is the sun.
            JULIET. O Romeo, Romeo! Wherefore art thou Romeo?"""),
        extractions=[
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="ROMEO",
                attributes={"emotional_state": "wonder"}
            ),
            lx.data.Extraction(
                extraction_class="emotion",
                extraction_text="But soft!",
                attributes={"feeling": "gentle awe", "character": "Romeo"}
            ),
            lx.data.Extraction(
                extraction_class="relationship",
                extraction_text="Juliet is the sun",
                attributes={"type": "metaphor", "character_1": "Romeo", "character_2": "Juliet"}
            ),
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="JULIET",
                attributes={"emotional_state": "yearning"}
            ),
            lx.data.Extraction(
                extraction_class="emotion",
                extraction_text="Wherefore art thou Romeo?",
                attributes={"feeling": "longing question", "character": "Juliet"}
            ),
        ]
    )
]

# Project Gutenbergから『ロミオとジュリエット』を直接処理
print("Project Gutenbergから『ロミオとジュリエット』をダウンロードして処理中...")

result = lx.extract(
    text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,      # 複数パスで再現率を向上
    max_workers=20,           # 並列処理で高速化
    max_char_buffer=1000      # 小さいコンテキストで精度向上
)

print(f"{len(result.text):,}文字から{len(result.extractions)}エンティティを抽出しました")

# 結果を保存して可視化
lx.io.save_annotated_documents([result], output_name="romeo_juliet_extractions.jsonl", output_dir=".")

# インタラクティブな可視化を生成
html_content = lx.visualize("romeo_juliet_extractions.jsonl")
with open("romeo_juliet_visualization.html", "w") as f:
    if hasattr(html_content, 'data'):
        f.write(html_content.data)
    else:
        f.write(html_content)

print("インタラクティブな可視化を romeo_juliet_visualization.html に保存しました")

長文ドキュメントの主な特徴

  • URL処理: URLから直接ドキュメントを処理
  • 複数パス抽出: 複雑なテキストの再現率を向上
  • 並列処理: max_workersパラメータで同時チャンク処理
  • 最適なチャンキング: max_char_bufferでコンテキストサイズを制御し精度を向上
  • JSONL出力: ポータブルで相互運用可能なデータ形式
  • インタラクティブな可視化: 大規模にコンテキスト内のエンティティを探索

非公式ガイド。Google とは関係ありません。