pdf解析与结构化提取

#PDF解析与结构化提取
##PDF解析
对于PDF文档,我们选择用PDFMiner对其进行解析,得到文本。
###PDFMiner
PDFMiner使用了一种称作lazy parsing的策略,只在需要的时候才去解析,以减少时间和内存的使用。要解析PDF至少需要两个类:**PDFParser** 和 **PDFDocument**,PDFParser从文件中提取数据,PDFDocument保存数据。另外还需要PDFPageInterpreter去处理页面内容,PDFDevice将其转换为我们所需要的。PDFResourceManager用于保存共享内容例如字体或图片。
![](01.png)

##PDF结构化提取

对于解析得到的中间格式(json格式),我们根据文本的坐标以及位置等信息进行结构化提取。本项目做的主要是医疗报告单的解析与提取。
我们把每份报告单的内容分为四部分:title,head,body(table),bottom
对于我们通过解析拿到的中间格式,我们需要根据某些条件先对其进行分块,将起分为title,head,body(table),bottom这四块,然后再对每一块的信息进行操作处理。

###head_begin的确定

**依据**:
'姓名'所在的行定位head_begin,即head起始行,然后将从这一行开始往后的所有行记为lines,往后一次遍历这些行,找head_end.
**方法**:
从'姓名'行向下一次遍历,看各行是否同时满足如下两个条件:
1 is_base_info_line() #关键词数量大于1
2 not is_table_head() #所含表头常见的关键词数量是否大于2
当某行不同时满足这两个条件时,把该行后边的所有拿出来继续判断是否满足上述条件1,2。若满足,则仍然属于head,加上去;若不满足,则判断是不是body的基本信息

###body_begin

--is_body_base_info_line()#包含一个关键词且关键词第一个字符位于左半边;
若是body基本信息,则为body_begin;
否则,不符合head_end的那行就是hend_end,然后从剩下的行里边找:
bottom_tmp=new_lines[head_end:]
然后,
find_bottom_pos()#发现y坐标的2/3,即后1/3粗分为bottom(bottom_block_lines)行,之前从head_end到1/3为body
返回bottom_block_lines,body,y_last_line(后1/3处y)
最后,取后1/3*页纸张包含的行数与总行的1/3做比较,哪部分包含的行树多则取哪个行为起始行为新的bottom_block_lines开始向下遍历,前边的部分为body,即更加靠上边的部分作为body与bottom的分界。

###bottom_begin

block_y_width=45. #块间距
y_bottom=0.85 #整个pdf的后15%
然后从bottom_block_lines的第一行开始向下继续找关键词,如果满足:
1 is_base_info_line() or
2 len(key_tmp>0) and x>half_width. or
3 y>y_bottom and y-y_last_line>block_width. 即,当前距后1/3足够宽,足够靠下。
找到符合条件的就作为bottom_index,之后的为bottom,前边遍历过的行接到刚才的body部分作为body。
这样就把pdf文本分成了title,head,body(table),bottom四部分。

### 小结

这样就将一个pdf源文件进行了解析与结构化提取。当然,针对不同的pdf源文件的解析结果进行结构化提取时,需要做不同的处理与判定,但只要能通过解析获得中间的json格式,就可以通过坐标和字符的其他属性实现想要的功能。

上一篇:linux分区机制(MBR GPT)简介


下一篇:ubuntu sublime text 2 破解版