pdf解析與結構化提取
PDF解析與結構化提取
PDF解析
對於PDF文檔,我們選擇用PDFMiner對其進行解析,得到文本。
PDFMiner
PDFMiner使用了一種稱作lazy parsing的策略,只在需要的時候才去解析,以減少時間和內存的使用。要解析PDF至少需要兩個類:PDFParser 和 PDFDocument,PDFParser從文件中提取數據,PDFDocument保存數據。另外還需要PDFPageInterpreter去處理頁面內容,PDFDevice將其轉換為我們所需要的。PDFResourceManager用於保存共享內容例如字體或圖片。
PDF結構化提取
對於解析得到的中間格式(json格式),我們根據文本的坐標以及位置等信息進行結構化提取。本項目做的主要是醫療報告單的解析與提取。
我們把每份報告單的內容分為四部分:title,head,body(table),bottom 對於我們通過解析拿到的中間格式,我們需要根據某些條件先對其進行分塊,將起分為title,head,body(table),bottom這四塊,然後再對每一塊的信息進行操作處理。
head_begin的確定
依據:
‘姓名‘所在的行定位headbegin,即head起始行,然後將從這一行開始往後的所有行記為lines,往後一次遍歷這些行,找headend. 方法:
從‘姓名‘行向下一次遍歷,看各行是否同時滿足如下兩個條件: 1 isbaseinfoline() #關鍵詞數量大於1 2 not istable_head() #所含表頭常見的關鍵詞數量是否大於2 當某行不同時滿足這兩個條件時,把該行後邊的所有拿出來繼續判斷是否滿足上述條件1,2。若滿足,則仍然屬於head,加上去;若不滿足,則判斷是不是body的基本信息
body_begin
--isbodybaseinfo
最後,取後1/3*頁紙張包含的行數與總行的1/3做比較,哪部分包含的行樹多則取哪個行為起始行為新的bottomblock_lines開始向下遍歷,前邊的部分為body,即更加靠上邊的部分作為body與bottom的分界。
bottom_begin
blockywidth=45. #塊間距
ybottom=0.85 #整個pdf的後15%
然後從bottomblocklines的第一行開始向下繼續找關鍵詞,如果滿足:
1 isbaseinfoline() or 2 len(keytmp>0) and x>halfwidth. or 3 y>ybottom and y-ylastline>blockwidth. 即,當前距後1/3足夠寬,足夠靠下。
找到符合條件的就作為bottom_index,之後的為bottom,前邊遍歷過的行接到剛才的body部分作為body。
這樣就把pdf文本分成了title,head,body(table),bottom四部分。
小結
這樣就將一個pdf源文件進行了解析與結構化提取。當然,針對不同的pdf源文件的解析結果進行結構化提取時,需要做不同的處理與判定,但只要能通過解析獲得中間的json格式,就可以通過坐標和字符的其他屬性實現想要的功能。
pdf解析與結構化提取