PDF 進 RAG 前的清洗:頁首頁尾、表格與換行
RAG 效果差,有很高比例的原因出在 PDF 抽取階段就已經爛了。
抽取後的文字如果每頁都夾著「機密文件 第 12 頁 共 40 頁」,這些雜訊會進入每一個片段,稀釋語意也污染檢索。
四個必做的清洗
- 移除重複頁首頁尾:統計每頁的第一行與最後一行,出現頻率過高的直接刪。
- 修復斷行:PDF 常在行尾硬斷,把不是以句號結尾的換行接回去。
- 處理連字符:英文單字被斷成
develop-\nment,要合併。 - 表格另外處理:表格轉成純文字後幾乎不可讀,建議轉成 Markdown 表格或逐列敘述句。
import re, collections
def strip_running_heads(pages):
first = collections.Counter(p.split('\n')[0].strip() for p in pages)
noise = {t for t, c in first.items() if c > len(pages) * 0.6 and t}
return ['\n'.join(l for l in p.split('\n') if l.strip() not in noise) for p in pages]
def fix_wraps(text):
text = re.sub(r'(\w)-\n(\w)', r'\1\2', text) # 連字符
return re.sub(r'(?<![。!?:;\n])\n(?![\n])', '', text) # 硬斷行表格轉敘述句
表格最實用的處理是把每一列展開成一個完整句子,例如「月卡的開通天數為 30 天,金額為 NT$240」。這種形式在向量檢索與生成引用上都遠優於保留欄位對齊。
清洗完務必抽樣人工看十份。抽取工具在不同版面上的行為差異很大,統計指標看不出「整份文件順序錯亂」這種問題。