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的确定
**依据**:
'姓名'所在的行定位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格式,就可以通过坐标和字符的其他属性实现想要的功能。
pdf解析与结构化提取的更多相关文章
- spark 解析非结构化数据存储至hive的scala代码
//提交代码包 // /usr/local/spark/bin$ spark-submit --class "getkv" /data/chun/sparktes.jar impo ...
- Attention-based Extraction of Structured Information from Street View Imagery:基于注意力的街景图像提取结构化信息
基于注意力的街景图像提取结构化信息 一种用于真实图像文本提取问题的TensorFlow模型. 该文件夹包含在FSNS数据集数据集上训练新的注意OCR模型所需的代码,以在法国转录街道名称. 您还可以使用 ...
- [C++]深入解析结构化异常处理(SEH)
http://www.cppblog.com/weiym/archive/2015/02/27/209884.html 尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的 ...
- XHTML 结构化:使用 XHTML 重构网站
http://www.w3school.com.cn/xhtml/xhtml_structural_01.asp 我们曾经为本节撰写的标题是:"XHTML : 简单的规则,容易的方针.&qu ...
- Python爬虫(九)_非结构化数据与结构化数据
爬虫的一个重要步骤就是页面解析与数据提取.更多内容请参考:Python学习指南 页面解析与数据提取 实际上爬虫一共就四个主要步骤: 定(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站的内容全 ...
- Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)
一.SolrJ介绍 1. SolrJ是什么? Solr提供的用于JAVA应用中访问solr服务API的客户端jar.在我们的应用中引入solrj: <dependency> <gro ...
- spark结构化数据处理:Spark SQL、DataFrame和Dataset
本文讲解Spark的结构化数据处理,主要包括:Spark SQL.DataFrame.Dataset以及Spark SQL服务等相关内容.本文主要讲解Spark 1.6.x的结构化数据处理相关东东,但 ...
- Bigtable:一个分布式的结构化数据存储系统
Bigtable:一个分布式的结构化数据存储系统 摘要 Bigtable是一个管理结构化数据的分布式存储系统,它被设计用来处理海量数据:分布在数千台通用服务器上的PB级的数据.Google的很多项目将 ...
- XHTML 结构化:使用 XHTML 重构网站 分类: C1_HTML/JS/JQUERY 2014-07-31 15:58 249人阅读 评论(0) 收藏
http://www.w3school.com.cn/xhtml/xhtml_structural_01.asp 我们曾经为本节撰写的标题是:"XHTML : 简单的规则,容易的方针.&qu ...
随机推荐
- wpf研究之道——自定义Button控件
我们知道WPF中普通的按钮,长得丑,所以自定义按钮,在所难免.我们给按钮添加 MoveBrush,EnterBrush两把刷子,其实就是鼠标经过和鼠标按下的效果.只不过这不是普通的刷子,而是带图片的I ...
- GeoJSON C#判断某一点是否在某一区域范围之内
GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点 ...
- canvas 绘制图形
canvas 绘制图形: 注意: canvas 的宽高设置在行内,否则会使画布(canvas)产生扭曲,绘图变形: <!DOCTYPE html> <html lang=" ...
- mount挂载与umount卸载
mount挂载与umount卸载 author:headsen chen 2017-10-23 15:13:51 个人原创,转载请注明作者,否则依法追究法律责任 mount:挂载: eg ...
- unity A*寻路 (一)导出NavMesh数据
使用unity的API NavMesh.CalculateTriangulation 可以获取NavMesh数据 首先 我们创建一个新的工程 保存一个test场景 然后在场景中添加一个Plane作 ...
- 警示:AL32UTF8字符集不是ZHS16GBK字符集的超集
今天有一个客户向我咨询:数据库由ZHS16GBK字符集修改为AL32UTF8字符集,发现中文的数据中小部分出现乱码,客户认为AL32UTF8明明可以支持更多的文字,不应该出现这样的情况才对. 从现象看 ...
- 【Python】 迭代器&生成器
迭代器 任何一个类,只要其实现了__iter__方法,就算是一个可迭代对象.可迭代对象的__iter__方法返回的对象是迭代器,迭代器类需要实现next方法.一般来说,实现了__iter__方法的类肯 ...
- 云计算--网络原理与应用--20171122--STP与HSRP
简单了解STP 学习HSRP 实验 一. 简单学习STP STP(spanning tree protocol)生成树协议,就是把一个环形的结构改变成一个树形的结构.通过一些算法,在逻辑上阻塞一些端 ...
- jquery empty()方法在IE下报错的解决办法
empty()在IE中没反应的办法: 用原生的js解决: try { $("#id" ).empty(); } catch (e) { $("#id")[0]. ...
- 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)
1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...