Python提取pdf中的表格信息,存入项目数据库中

Python提取pdf中的表格信息流程

  • 第一步 download_pdf.py : 通过爬虫脚本生成的csv文件将所有标准表单下载到本地,直接运行即可,会自动在同级目录下新建 ‘/标准文件’ 目录存放文件。由于原网站上部分标准文件已经下架,极个别url会失效。

  • 第二步 standard_pdf.py : 从爬取下来的所有pdf文件中提取表单和表单模板,采用的pdfplumber库,提取的表单会存放到 ‘./表单/pdf_id/’ 中,生成的表单模板会存放到 ‘./表单模板/pdf_id/’ 中。目前由于部分pdf中的表单比较特殊,会出现提取错误的情况。在每个pdf文件解析完成后,会对生成的模板和模板库进行匹配,删除完全相同的重复模板。这个函数会调用match.py文件

  • match.py : 模板匹配,实际为比较表头是否完全一致,完全一致则认为是相同模板,否则认为是不同模板并新建入库。直接运行时会遍历所有表单模板并删去重复文件。调用时直接调用 match(path,pdf_name)即可 即在模板库中对pdf_name匹配。

  • 第三步label.py : 表单模板分类,目前的实现方式是自定义一个表头模板的key词,比较表头的相似度进行分类。输出为控制台输出 文件名+分类结果。由于逻辑比较简单,精度有待提高。

分析提取出的表单和表单模版结构

验证表单模版的有效性

细分实验1步骤:
第一步:按行业下载标准文件,在下载标准文件的时候就按照每个标准文件属于哪个行业进行分类。经下载结果,总共14个行业。
第二步:按照行业对表单和表单模板分类,对第一步中获取的每一个标准文件进行表单和表单模板提取,在每一个行业中按照提取后表单和表单模板数量对标准文件进行降序排列。
第三步:从每个行业中依次按照选取一个标准文件、两个标准文件查看提取出的表单和表单模版的数量,与分析所有标准文件提取出的表单和表单模版进行对比,计算覆盖率。
第四步:根据第三步的结果判断我们选择的标准文件提取出的表单模版是否具有典型性。

细分实验1结果

Python提取pdf中的表格信息,存入项目数据库中_第1张图片

Python提取pdf中的表格信息,存入项目数据库中_第2张图片
经过统计总共有155个标准文件,14个行业,不同行业拥有的标准文件数量分别为7,1,28,2,68,3,1,2,1,2,1,4,9,10,15。
经分析得出结论,需要每个行业至少选取21个标准文件才能实现表单和表单模板覆盖率达到90%以上
经修正,由于标准中不同行业的表单差距较大,并且不同行业拥有的标准文件数量存在较大差异,所有行业集中分析并不具有研究价值,故增加单行业进行分析的实验。
细分实验2步骤:对于每一个行业单独分析,从每个行业中依次按照选取一个标准文件、两个标准文件查看提取出的表单和表单模版的数量,与分析该行业中所有标准文件提取出的表单和表单模版进行对比,计算每个行业的覆盖率。从而判断我们选择的标准文件提取出的表单模版是否具有行业典型性。

细分实验2结果

交通运输、仓储和邮政业
Python提取pdf中的表格信息,存入项目数据库中_第3张图片
住宿和餐饮业
在这里插入图片描述
公共管理、社会保障和社会组织
Python提取pdf中的表格信息,存入项目数据库中_第4张图片

农、林、牧、渔业
在这里插入图片描述

制造业
Python提取pdf中的表格信息,存入项目数据库中_第5张图片
Python提取pdf中的表格信息,存入项目数据库中_第6张图片

卫生和社会工作
在这里插入图片描述

居民服务、修理和其他服务业
在这里插入图片描述

建筑业
在这里插入图片描述

房地产业
在这里插入图片描述

批发和零售业
在这里插入图片描述

教育
在这里插入图片描述


Python提取pdf中的表格信息,存入项目数据库中_第7张图片

水利、环境和公共设施管理业
Python提取pdf中的表格信息,存入项目数据库中_第8张图片

电力、热力、燃气及水生产和供应业
Python提取pdf中的表格信息,存入项目数据库中_第9张图片

采矿业
Python提取pdf中的表格信息,存入项目数据库中_第10张图片

分析模板分类方法的有效性

该实验的背景是,我们当初在设计数据库模型时参考了行业的标准设计的数据库表,以及每个表中的各个字段,并且字段中分为了固定字段和可变字段,现在需要检验我们所设计的固定字段是有效的,是这些标准文件中所必要的,且是完备的。
因此我们设计了这个实验,扫描提取出的表单模版,判断我们数据库中的固定字段是否在表单模版中都存在,并且需要统计出这些表单模版中共有的字段,判断我们数据库中的固定字段是否都涵盖了,从而可以从两个方向验证我们人为设定的固定字段的合理性。
我们所设定好的固定字段如下:

  • 设备设施清单
    “检查项目”,“检查项目/作业步骤”,“检查项目(危险源)”,“危险源”
    “标准”
    “不符合标准情况及后果”,“主要后果”
    “管控措施”,“现有控制措施”,“现有安全控制措施”,“建议改正/控制措施”
  • 作业活动清单
    “危险源或潜在事件”,“危险源或潜在事件(人、物、作业环境、管理)”
    “作业步骤”,“作业步骤(危险源)”,“作业步骤(名称)”,“作业步骤名称”
    “可能发生的事故类型及后果”,“主要后果”,“可能导致的事故特征及后果”
    “管控措施”,“现有管控措施”,“现有控制措施”,“控制措施”

实验结果

  • 经过实验得出结果,设备设施清单中包含我们设定好的固定字段的表单模板有67%,作业活动清单中包含我们设定好的固定字段的表单模板有72%。暂时还不清楚剩下的为何不包含,待分析
  • 经过实验得出结果

阅读相关论文进展

领域:查询如何判断表头结构相似度

论文:

A study on machine learning techniques for the schema matching network problem

Diego Rodrigues & Altigran da Silva
Journal of the Brazilian Computer Society volume 27, Article number: 14 (2021-11-23)

COMA: a system for flexible combination of schema matching approaches

Do H-H, Rahm E (2002)
被引量:1621
Proceedings of the 28th International Conference on Very Large Data Bases
VLDB/SIGMOD是数据库领域最顶级的两个会议,每年收录加起来也就小几百篇。

问题描述:

模式匹配是查找两个给定数据库模式的元素(或属性)之间的语义对应关系的任务。
模式匹配任务主要其实是对于在电子商务、地理空间、生物学、健康等领域实现数据集成和系统互操作性至关重要。
重点是用于数据集成中。

问题情况:

由于许多原因,模式匹配任务具有挑战性。
首先,模式元素,例如表示相同概念的属性,在不同的模式中可能具有不同的名称。
另一方面,具有相似名称的元素可能指代不同的概念。
此外,两个模式中的等效元素可能具有不同的结构。最后,可能存在这样一种情况,其中一个模式中的许多元素表示由另一个模式中的单个元素表示的概念。

有哪些解决方案:

  • 传统上,模式匹配任务由对模式及其领域具有广泛知识的专家手动执行。然而,即使对于专家来说,这项任务也可能是耗时、昂贵且容易出错的。
  • 多年来,已经开展了几项研究计划来处理模式匹配,从而发表了几篇论文 [COMA] ,并提供了几个原型和商业系统。许多这些方法依赖于一组预定义的步骤和参数。
  • 其他人则依靠机器学习为每个匹配任务创建特定模型。但是机器学习需要有大量的训练数据可用,这可能很难获得。

那些解决方案效果怎么样:

COMA等启发式方法被广泛使用,因为它们易于实现和执行。它们通常运行得很快并生成大量正确的匹配项。

可以把哪个用到我们项目中:

  • 专家模式人为判断是否相似
  • 采用和COMA等方式类似的原理:相似度计算(Levenshtein 距离函数)
    通常我们会先通过机器的方式计算出是否相似然后再让专家review

具体步骤

模式匹配是在两个模式的元素之间找到语义对应的任务。模式可以来自已知在同一域中的任何不同的异构数据源(例如,数据库模式、XML DTD、HTML 表单标签等)[ 23 ]。此任务是任何数据集成过程的第一步,因为它会连接两个不同的数据源 [ 6 ]。

尽管多年来提出了几种原型和方法来解决这一任务,但目前还没有一种方法被认为完全解决了这个问题。此外,为了保证匹配结果的质量,通常需要专家在执行方法后查看答案。

通常,模式匹配方法应用一个或多个函数来建立模式中元素对之间的相似性值。每对被称为匹配候选者。这些称为matchers的函数接收两个元素作为输入,并估计 0 和 1 之间的相似度值。值越高,元素越相似。匹配器可以使用几种不同的策略来估计相似性,例如,比较模式元素名称、它们使用同义词库的语义相似性、它们的数据类型、基数,甚至是可用的数据值。

表 1显示了由著名的 Levenshtein 距离函数 [ 24 , 25 ]生成的相似度值的示例。

  • Wagner RA, Fischer MJ (1974) The string-to-string correction problem. J ACM 21(1):168–173.被引量:4366
  • Miller FP, Vandome AF, McBrewster J (2009) Levenshtein distance. VDM Publishing, Saarbrucken.被引量:
  • The Levenshtein distance is a lexic similarity between two strings. Given two strings s and t, their similarity is the ratio of their edit distance by the size of the bigger string
    在此示例中,如果方法选择在该相似性矩阵中应用阈值 0.7,则将选择的唯一匹配候选者是 < search , searchForm.search >。作为另一个例子,一种方法可以对所有相似性进行排序并从矩阵中选择前k个值。对于k =2,此策略将允许选择匹配项 < search.field-keywords、 searchForm.keyword > 和 < search.field-title、 searchForm.shortTitle >。
    Python提取pdf中的表格信息,存入项目数据库中_第11张图片

如何用到我们项目中:

通过 Levenshtein 距离函数计算不同表单模版之间的相似度,设定好一个阈值,判断这两个表单模版中差异字段是否只是因为同一概念的不同叫法。

开展实验判断效果:

构建数据集

分别构建设备设施风险分级管控数据集和作业活动风险分级管控数据集

按照如下表所示的表结构整理设备设施风险分级管控数据集

逐个扫描表单文件中的表头信息,通过如下映射关系映射到我们定义好的表结构中。

  • 风险点中的类型->风险点中的类型

  • 风险点中的名称->风险点中的名称

  • 风险点中的序号或者编号->风险点中的序号

  • 检查项目/检查项目(危险源)中的名称->设备设施名称

  • 标准/检查标准/不符合标准情况->标准

  • 不符合标准情况及后果/主要后果/事故后果/可能导致的事故特征及事故后果/不符合标准情况可能导致的事故特征及后果->可能发生的事故类型及后果

  • 管控措施/现有管控措施/控制措施/现有控制措施/现有安全控制措施中的
    工程技术措施/工程技术/工程控制->工程技术措施
    管理措施->管理措施
    培训教育措施/培训教育->培训教育措施
    个体防护措施/个体防护->个体防护措施
    应急处置措施/应急处置->应急处置措施

  • 建议新增(改进)措施
    在这里插入图片描述
    经过分析发现有些提取出的表单中缺失部分列的信息,比如有些表单就没有写明风险点的类型和名称,这种情况下填充为空即可。

按照如下表所示的表结构整理作业活动风险分级管控数据集

逐个扫描表单文件中的表头信息,通过如下映射关系映射到我们定义好的表结构中。

  • 风险点中的类型->风险点中的类型

  • 风险点中的名称->风险点中的名称

  • 风险点中的序号或者编号->风险点中的序号

  • 作业步骤/作业步骤(危险源)中的名称->作业步骤名称

  • 危险源或潜在事件/危险源或潜在事件(人、物、作业环境、管理)/标准/危险源或潜在事件->危险源或潜在事件

  • 可能发生的事故类型及后果/主要后果->可能发生的事故类型及后果

  • 管控措施/现有管控措施/控制措施/现有控制措施/现有安全控制措施中的
    工程技术措施/工程技术/工程控制->工程技术措施
    管理措施->管理措施
    培训教育措施/培训教育->培训教育措施
    个体防护措施/个体防护->个体防护措施
    应急处置措施/应急处置->应急处置措施

  • 建议新增(改进)措施
    在这里插入图片描述

你可能感兴趣的:(研究生工程项目学习笔记,python,开发语言,爬虫)