Skip to content

長文件擷取範例 📚

LangExtract 可以直接從 URL 處理完整文件,透過平行處理和增強敏感度特性高精度處理大型文本。

處理方式

LangExtract 自動處理長文件:

  1. 將文本分割成可管理的區塊
  2. 平行從每個區塊擷取
  3. 彙總並去除重複結果

程式碼範例:《羅密歐與茱麗葉》全文

WARNING

執行此範例會處理大型文件(約 44,000 tokens),將產生 API 費用。對於大規模使用,建議申請 Tier 2 Gemini 配額。

python
import langextract as lx
import textwrap

# 定義全面的 prompt 和範例
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 無關。