返回文章列表

Python 提取 PDF 中繼資料與作者資訊

本文示範如何使用 Python 從 PDF 檔案中提取中繼資料,包含標準欄位如作者、日期等,並結合 PyPDF2 函式庫及大語言模型 (LLM) 擷取額外資訊,例如頁數、檔案大小以及利用 Pydantic 模型結構化作者聯絡資訊,提升後續向量資料函式庫搜尋效率。

資料處理 Python

利用 PyPDF2 函式庫讀取 PDF 檔案,能有效萃取內建的中繼資料,例如作者、建立日期、檔案標題等。然而,某些關鍵資訊可能缺失或隱藏於檔案中。為此,我們可運用大語言模型 (LLM) 深入分析檔案內容,找出如作者姓名、公司等額外資訊,並使用 Pydantic 模型驗證資料格式,確保資料的完整性和一致性。此外,計算檔案大小、頁數等補充資訊,有助於後續在向量資料函式庫中更精準地搜尋和過濾檔案,提升檢索效率。

步驟1:提取檔案中的中繼資料

首先,我們使用PyPDF2函式庫來載入PDF檔案並提取其中儲存的中繼資料。常見的中繼資料欄位包括作者、建立日期、最後修改日期、建立者(用於建立檔案的軟體)和生產者(用於將檔案轉換為PDF的軟體)、標題和主題。並非所有檔案都會包含所有這些欄位,但這是一個良好的起點來檢視哪些資訊可用。

import PyPDF2
import os

file_path = "../../datasets/pdf_files/attention_is_all_you_need_paper.pdf"

with open(file_path, "rb") as file:
    reader = PyPDF2.PdfReader(file)
    metadata = reader.metadata
    text = ""
    for page in reader.pages:
        text += page.extract_text()

步驟2:新增額外的中繼資料

除了標準的中繼資料欄位外,我們還可以包含其他有用的資訊。例如,我們可以新增有關PDF頁數、檔案大小、檔名稱、檔案路徑和提取文字長度的資訊。

metadata = dict(metadata)
metadata["page_count"] = len(reader.pages)
metadata["file_size"] = os.path.getsize(file_path)
metadata["file_name"] = os.path.basename(file_path)
metadata["file_path"] = file_path
metadata["text_length"] = len(text)

步驟3:使用LLM生成新的中繼資料

在某些情況下,作者的姓名欄位可能是空的,但這些資訊通常存在於檔案文字中,尤其是在科學論文中。為了提取這些資訊,我們需要直接分析檔案文字。以下示範如何使用大語言模型(LLM)來查詢和填充這些中繼資料。

# 載入整個文字並讓LLM搜尋相關資訊
# 這裡省略了具體的LLM實作細節

圖2-2:如何提取和生成中繼資料欄位

前置條件

  • 使用PyPDF2函式庫來提取PDF中的中繼資料。
  • 使用OpenAI API來從檔案文字中提取中繼資料。

步驟

  1. 提取檔案中的中繼資料:使用PyPDF2函式庫載入PDF並提取其中儲存的中繼資料。
  2. 新增額外的中繼資料:包含其他有用的資訊,如頁數、檔案大小等。
  3. 使用LLM生成新的中繼資料:分析檔案文字以提取缺失的中繼資料,如作者姓名。

透過這些步驟,我們可以建立一個全面性的中繼資料字典,從而更好地理解和管理檔案。

使用 Pydantic 模型提取檔案中的作者聯絡資訊

為了確保 LLM 僅提供所需的後設資料並避免任何不相關的細節,我們使用 OpenAI 的結構化輸出功能。這涉及定義一個 Pydantic 模型,以指定預期的資料欄位及其格式。Pydantic 是一個流行的資料驗證工具,幫助我們清晰地概述預期的值和格式。

定義 Pydantic 模型

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class AuthorContact(BaseModel):
    name: str
    company: str
    email: list[str]

class Contacts(BaseModel):
    entries: list[AuthorContact]

提取作者聯絡資訊

system_message = """提取所有作者的聯絡資訊。"""
model = "gpt-4o-2024-08-06"
messages = [
    {
        "role": "system",
        "content": system_message,
    },
    {
        "role": "user",
        "content": text,
    },
]
response_format = Contacts
completion = client.create_completion(
    model=model,
    messages=messages,
    response_format=response_format,
)
author_contacts = completion.choices[0].message.parsed
metadata["author_contacts"] = author_contacts

這段程式碼傳回一個包含作者聯絡資訊的字典列表。每個字典包含作者的姓名、公司和電子郵件地址等詳細資訊。這個列表然後被新增到後設資料字典中。

討論

後設資料有助於我們在向量資料函式庫中縮小搜尋空間,然後再進行向量搜尋。這可以加速搜尋並過濾掉不相關的資訊。不所有顯示出高語義相似度的文字塊都真正相關。

從技術架構視角來看,本文提出的PDF檔案後設資料提取與增強方法,有效整合了PyPDF2函式庫的基礎功能和大語言模型(LLM)的進階能力。透過標準函式庫提取基礎後設資料,結合檔案大小、頁數等額外資訊,並利用LLM分析文字內容,彌補了傳統方法在作者資訊等關鍵欄位提取上的不足,展現了混合方案的整合價值。然而,LLM的應用也存在潛在挑戰,例如模型的準確性、計算成本以及對特定領域知識的依賴。目前,如何有效控制LLM的輸出範圍和提升其在特定任務上的準確性仍需進一步探討。

評估此方案的商業價值,其在檔案管理、知識圖譜構建、資訊檢索等領域具有廣泛應用前景。透過豐富的後設資料,可以大幅提升檔案搜尋效率、精確度,並支援更複雜的語義分析。對於重視知識管理的企業而言,這項技術能有效降低資訊處理成本,提升決策效率。然而,LLM的引入也增加了系統的複雜度和維運成本,需要權衡其帶來的效益與成本。

展望未來,隨著LLM技術的持續發展和資料標註技術的進步,預期LLM在後設資料提取和增強方面的效能將進一步提升。同時,更精細化的Pydantic模型設計和更具針對性的提示工程策略,將有助於更好地控制LLM的輸出,提升其在特定領域的專業性和可靠性。玄貓認為,結合傳統方法和LLM的混合方案代表了檔案後設資料處理的未來方向,值得技術團隊深入研究和應用。對於追求高效知識管理的企業,建議優先探索此技術在核心業務場景的落地應用,並密切關注LLM技術的最新進展。