如果你寫(xiě)過(guò)PDF解析腳本,一定經(jīng)歷過(guò)這種絕望:跑一遍通用文本提取器,原本整齊的表格變成一堵文字墻,所有列被暴力壓成垂直堆疊。更糟的是換用表格提取器——它開(kāi)始到處 hallucinate(產(chǎn)生幻覺(jué))。加粗標(biāo)題帶下劃線(xiàn)? parser 認(rèn)定這是 1×1 表格。段落間的水平分隔線(xiàn)?砰,幽靈表格誕生。
問(wèn)題根源在于大多數(shù) PDF 解析器采用嚴(yán)格的順序流水線(xiàn)。它們掃描所有線(xiàn)條,掃描所有文字,然后簡(jiǎn)單粗暴地混在一起。我受夠了這種"機(jī)器式閱讀",于是重新設(shè)計(jì)了提取流水線(xiàn)——讓 parser 像人類(lèi)一樣"看見(jiàn)"文檔。
![]()
這就是上下文感知 PDF 提取的數(shù)學(xué)原理。
盲目提取的災(zāi)難
我們之前的流水線(xiàn)是這樣工作的:找出所有水平和垂直線(xiàn)段(H-segs 和 V-segs),丟進(jìn) LatticeReconstructor 找交叉網(wǎng)格,每個(gè)網(wǎng)格都當(dāng)表格處理,再用嚴(yán)格的"點(diǎn)是否在框內(nèi)"判斷把所有文字塞進(jìn)這些網(wǎng)格。
這種設(shè)計(jì)對(duì)圖文混排文檔是災(zāi)難。段落里一條裝飾性下劃線(xiàn)會(huì)讓 LatticeReconstructor panic,強(qiáng)行造表。表格單元格里的文字因坐標(biāo)抖動(dòng)稍微偏移,"點(diǎn)-框檢測(cè)"就失敗,文字直接從輸出里消失。
我需要 parser 理解上下文。
上下文分類(lèi)器的介入
我構(gòu)建了 contextClassifier。它不再把 PDF 當(dāng)作形狀和文字的容器,而是遍歷文檔,將每個(gè)元素歸類(lèi)到空間有界的類(lèi)型區(qū)域:TABLE、PARAGRAPH、HEADING、LIST、IMAGE。
但機(jī)器怎么區(qū)分表格邊框和裝飾下劃線(xiàn)?用鄰近度數(shù)學(xué)。
代碼邏輯很直接:遍歷每條水平線(xiàn)段,計(jì)算其中點(diǎn)縱坐標(biāo) hY;遍歷每個(gè)文字元數(shù)據(jù),計(jì)算 hY 與文字基線(xiàn)縱坐標(biāo) tm.vy 的垂直距離 yDist。如果 yDist 在 -1 到 5 像素之間,且水平方向與文字重疊,這條線(xiàn)就是下劃線(xiàn)而非表格邊框。
在表格重建前標(biāo)記并剔除這些下劃線(xiàn),99% 的幽靈表格被消滅。
文字作用域:告別碰撞
表格檢測(cè)完成后,我們計(jì)算表格網(wǎng)格的精確邊界框。contextClassifier 不再把整份文檔的文字丟給表格構(gòu)建器,而是只撈取物理上位于該邊界框內(nèi)的文字項(xiàng)。這種"物理居住"檢查替代了粗暴的全局匹配,從根本上消除了文字錯(cuò)配和消失的問(wèn)題。
這套數(shù)學(xué)框架的核心洞察很簡(jiǎn)單:PDF 不是幾何圖形的隨機(jī)堆疊,而是人類(lèi)視覺(jué)意圖的編碼。用像素級(jí)的鄰近關(guān)系重建這種意圖,機(jī)器才能停止幻覺(jué),開(kāi)始理解。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.