今日のようにデータが豊富な世界では、詳細な臨床記録、長文の法的文書、顧客フィードバックのスレッド、更新され続けるニュース レポートなど、構造化されていないテキストに貴重な洞察が埋もれてしまいがちです。こうした情報を手動でふるい分けたり、そのデータを処理するための特別なコードをビルドしたりするのは時間がかかり、エラーが発生しやすくなります。また最新の大規模言語モデル(LLM)を単純に使用すると、エラーを誘発する可能性があります。ならば、出力が構造化され、ソースと確かに結びついていることを確保しながら、必要とする情報をプログラムで正確に抽出できたらどうなるでしょうか?
そこで本日ご紹介するのが新たなオープンソース Python ライブラリの LangExtract です。まさに上記の処理をデベロッパーが実行できるよう開発されています。LangExtract は、Google の Gemini モデルなどさまざまな LLM の軽量インターフェースを備えており、柔軟性とトレーサビリティの両方を確保しながら、大量の非構造化テキストをカスタム指示に従って構造化テキストに処理できます。
扱うのが医療報告や財務サマリーであれ、またはその他の文書量が多い分野であれ、その中に含まれるデータを柔軟かつ強力に引き出す方法を LangExtract は提供してくれます。
LangExtract では情報抽出に役立つ次のような機能を独自に組み合わせています。
ここではシェイクスピアの 1 節から登場人物の詳細情報を抽出してみます。
最初に、ライブラリをインストールします。
仮想環境や API キーの設定など、セットアップ手順の詳細については、このプロジェクトの README を参照してください。
pip install langextract
次に、抽出タスクを定義します。モデルを導くための具体的なプロンプトと質の高い「フューショット」例を入力します。
import textwrap
import langextract as lx
# 1. Define a concise prompt
prompt = textwrap.dedent("""\
Extract characters, emotions, and relationships in order of appearance.
Use exact text for extractions. Do not paraphrase or overlap entities.
Provide meaningful attributes for each entity to add context.""")
# 2. Provide a high-quality example to guide the model
examples = [
lx.data.ExampleData(
text=(
"ROMEO. But soft! What light through yonder window breaks? It is"
" the east, and Juliet is the sun."
),
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"},
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="Juliet is the sun",
attributes={"type": "metaphor"},
),
],
)
]
# 3. Run the extraction on your input text
input_text = (
"Lady Juliet gazed longingly at the stars, her heart aching for Romeo"
)
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-pro",
)
結果のオブジェクトに含まれる抽出されたエンティティは JSONL ファイルに保存できます。このファイルから、インタラクティブな HTML ファイルを作成してアノテーションを表示できます。この視覚化はデモや抽出の質を評価するのに最適で、貴重な時間を節約できます。Google Colab などの環境とシームレスに連携させることも、単体の HTML ファイルとして保存しブラウザで表示することも可能です。
# Save the results to a JSONL file
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
# Generate the interactive visualization from the file
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
f.write(html_content)
医療、金融、工学、法律などの専門領域に対しても上記と同じ原則が当てはまります。LangExtract を支えるアイデアが最初に適用されたのは医療情報の抽出でしたが、これは臨床テキストの処理にも効果的です。たとえば、医薬品と分量、その他医薬品の属性を特定して、それぞれの関係性をマッピングできます。この機能は今回のライブラリの研究につながる重要な部分となっています。詳細は、医療情報の抽出の迅速化に関する論文をご覧ください。
以下のアニメーションでは LangExtract が臨床テキストを処理して医薬品に関するエンティティを抽出し、ソースの医薬品にグループ化する様子を示しています。
専門領域での LangExtract の力を示すため、Hugging Face に RadExtract という、構造化された放射線治療レポートのインタラクティブなデモを作成しました。このデモでは、LangExtract でフリーテキストの放射線治療レポートを処理し、主な検出項目を構造化されたフォーマットに変換すると同時に、重要な項目をハイライト表示します。このアプローチは、レポートの構造化によって明瞭さを高め、完全性を確保し、研究と臨床ケアにおけるデータの互換性を高めるという点で、放射線治療において重要です。
免責事項: 上記の医薬品の抽出例と構造化されたレポートのデモは、あくまで LangExtract の基盤となる機能を説明するためのものです。完成または承認されたプロダクトを表すものではなく、病気や症状を診断したり治療を推奨したりすることを意図したものでもありません。これを使用して医学的なアドバイスを行うことはできません。
今後デベロッパーの皆さんが、革新的な方法で LangExtract を使ってテキストから知見を引き出すことを期待しています。ドキュメントを詳しくご覧いただき、GitHub リポジトリ の例を調べ、さっそく非構造化データの変換を始めてみましょう。