前几天,有一位用户使用OCR产品识别多栏论文后向我们询问:要怎么解决不合适的断句、分段以及错误阅读顺序的问题?

我们用一个相似案例为大家直观展示这位用户遇到的情况。

如图中的多栏期刊,如果用OCR识别,或直接在一些办公软件对文字进行复制黏贴,我们就会得到右侧的效果——按PDF排版而不是语义进行换行分段,对多栏文字直接从左向右排布,得到完全不通顺的文字段落。显然这样的效果是无法接受的。

于是,我们向用户推荐了文档解析产品,建议在处理多栏文件时使用文档解析来获得更好的识别结果。这是文档解析的同一篇期刊论文输出示例

可以看到,不论是自然段的划分,还是阅读顺序,甚至换页情况下的识别,都遵循了正确的阅读习惯。这正是我们在做文档解析过程中关注的重点之一,也是解析产品和过往纯OCR产品的不同之处:段落识别与阅读顺序还原

今天,我们也想和大家聊聊,在Markdown Tester中,这个维度的指标是如何设计的。再次指路我们的测评工具https://github.com/intsig/markdown_tester

段落维度的指标包含了段落识别率、召回率,指标的计算方式后文我们会进行展开说明。

直观上来说,段落识别能力指的是系统能够识别和区分PDF文档中的不同段落,理解每个段落的开始和结束

而阅读顺序的还原能力指的是系统能够根据PDF文档的布局和格式,推断出人类阅读时的顺序,而不仅仅是机械地判定为从左至右排序。

作为自然语言处理的利器,大模型需要的也正是与人类一致的阅读顺序,从预训练、调整到对话应用,正确、优质的语料能为大模型提供良好的工作基础。在实际情况中,文档智能应用场景往往包含着复杂的文档布局(如多栏、嵌套表格、不规则文本框等),正确识别段落和恢复阅读顺序是确保信息准确传达的关键要素之一。

以目前对PDF解析需求量相当高的RAG开发和数据清洗两个应用方向为例:在RAG(Retrieval-Augmented Generation)系统中,正确的阅读顺序还原有助于系统理解文档的逻辑结构和信息流,而正确的段落识别让系统能更准确地定位到文档中的关键信息段落,从而提高检索的准确性和生成内容的相关性。在优秀解析能力的辅助下,RAG分块(Chunking)策略也可以做进一步优化,用按段落分块取代固定长度切分,避免把完整的段落文字“拦腰斩断”、影响语义理解与生成的问题。而在数据清洗和模型训练过程中,解析工具能够保持文档的原始阅读顺序,段落识别则有助于将PDF文档分割成更小的、语义上独立的单元。这使得训练数据更加结构化,对于训练模型理解文档的层次结构和内容组织至关重要,能有效提高模型的训练效果、泛化能力和对复杂文档的理解能力。

来看看我们的Markdown Tester如何评估这两个维度的解析效果。此处涉及4个指标:平均阅读顺序指标=计算预测值和真值中,所有匹配段落的编辑距离(排版用正副标题)编辑距离的概念,我们在上一期文章《聊聊文档解析测评里的表格指标》里介绍过。(+链接)它指的是,对给定的两个字符串,最少要经历多少次插入、删除、替换操作,才能使两个字符串完全一样。在阅读顺序指标中,我们应用同样的概念对匹配段落进行检测,在这一项中得分越高,意味着解析结果中的阅读顺序与实际越匹配、差异越小,也即还原效果越好。段落识别率=段落匹配的个数(段落编辑距离小于0.2) / 预测出的总段落数段落识别率指的是被正确识别的段落数量占所有识别出的段落总数的百分比。它测量的是段落解析够不够“”。

举一个比较直观的例子来说明段落识别率和段落召回率分别代表的含义。现在我们有一篇需要识别的短文,它有3个段落,分别为:

+----------------+

段1:开头

+----------------+

+----------------+

段2:正文

+----------------+

+----------------+

段3:结尾

+----------------+

在解析过程中,段1、段2被正确识别,而段3被识别为了2个分开的段落。

即解析结果为:

+----------------+

段1:开头

+----------------+

+----------------+

段2:正文

+----------------+

+----------------+

段3:发展

+----------------+

+----------------+

段4:结尾

+----------------+

那么,在这个案例中,段落识别率=2/4=50%。段落识别率反映了产品正确识别段落的能力,即查准率。识别率越高,意味着系统在识别段落时的准确性越高。段落召回率=段落匹配的个数(段落编辑距离小于0.2)/ 总的段落数段落召回率是指被识别到的相关段落数量占实际总段落数的百分比。它测量的是段落解析是不是“”。

我们继续看前面的短文案例,此处的段落召回率=2/3=66.67%。简单来说,就是原文的3个段落中里,我们正确找到了其中的2个。它衡量了解析产品在识别文档时的查全率。召回率越高,意味着越能够正确找到所有段落。段落F1=2 * (段落识别率 * 段落召回率) / (段落识别率 + 段落召回率)F1值是识别率和召回率的调和平均值,它综合考虑了这两个指标,用于评估文档解析的整体性能。F1值越高,通常意味着文档解析的性能越好。

本期,我们主要介绍了PDF解析中段落与阅读顺序相关的指标及重要性。

关于公式、标题的讨论,我们也将继续深入。

之后,我们还会不断扩充测评的维度、厂商,更好地满足大家的需求。欢迎各位开发者随时给我们提出需求,包括但不限于对这个tester本身的优化建议,或者提供样本找我们对比测试,甚至是指定产品做对比测试~

TextIn文档解析产品目前正在内测计划中,为每位用户提供每周7000页的额度福利,关注公众号《合研社》即可申领。关于测评工具、产品或需求,都可以随时找我们沟通。我们欢迎所有探讨和交流!

所见即所得,赋能RAG:PDF解析里的段落识别的更多相关文章

  1. PDF解析记录——Pdfbox

    此文仅作记录[嫌放电脑里碍事-_-],内容为以前收集的一小段代码.   下面为pdf获取文本的简要代码片段: private string GetPDFText(string filename) { ...

  2. pdf解析与结构化提取

    #PDF解析与结构化提取##PDF解析对于PDF文档,我们选择用PDFMiner对其进行解析,得到文本.###PDFMinerPDFMiner使用了一种称作lazy parsing的策略,只在需要的时 ...

  3. 【PDF】手写字与识别字重叠

    [PDF]手写字与识别字重叠 前言 同学平时上课用iPad记笔记,考试之前导出为PDF发给我后,我用PDF打开,发现可以直接Ctrl+F搜索一些词语.一直不知道是怎么做到的,毕竟里面的字都是手写的,不 ...

  4. 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件

    背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...

  5. 当页面是本地页面时,通过ajax访问tomcat里的action,传递的参数在action里并不能识别

    当页面是本地页面时,通过ajax访问tomcat里的action,传递的参数在action里并不能识别,这个问题困扰了我不少时间. 在测试时发现此问题

  6. PDF解析

    解析如下图PDF文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  7. 如何将一个PDF文件里的图片批量导出

    假设我有下面这个PDF文件,里面有很多图片,我想把这些图片批量导出,而不是在Adobe Acrobat Reader里一张张手动拷贝: 本文介绍一种快捷做法. 用PDF-XChange Editor打 ...

  8. PDF解析帮助类

    public class ComPDFHepler { /// <summary> /// 正则获取字符串中两个字符串间的内容 /// </summary> /// <p ...

  9. PDF解析。。。

    解析出PDF中的文字.用项目名称作Key取对应的值.. 正则匹配 .....:..\n

  10. 如何添加、删除、合并PDF文件里的页面?

    使用Adobe Acrobat. Adobe中文官网http://www.adobe.com/cn/products/acrobat.html 能够自己下载破解版. watermark/2/text/ ...

随机推荐

  1. Python生成PDF:Reportlab的六种使用方式

    Reportlab是Python创建PDF文档的功能库 这里是整理过的六种Reportlab使用方式,主要参考的是<ReportLab User Guide> 一.使用文档模板DocTem ...

  2. Vue源码剖析

    目录 Vue 响应式数据 Vue 中如何进行依赖收集 Vue 中模板编译原理 Vue 生命周期钩子 Vue 组件 data 为什么必须是个函数? nextTick 原理 set 方法实现原理 虚拟 d ...

  3. SQL Server 新增函数大全(各版本)

    SQL Server 2017 CONCAT_WS ( separator, argument1, argument2 [, argumentN]... ) --采用可变数量的字符串自变量,并将它们串 ...

  4. 张高兴的 MicroPython 入门指南:(三)使用串口通信

    目录 什么是串口 使用方法 使用板载串口相互通信 硬件需求 电路 代码 使用板载的 USB 串口 参考 什么是串口 串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART(Univ ...

  5. 英伟达又向开源迈了一步「GitHub 热点速览」

    大家是否还记得 2012 年,Linux 之父 Linus Torvalds 在一次活动中"愤怒"地表达了对英伟达闭源 Linux GPU 驱动的不满?这个场景曾是热门表情包,程序 ...

  6. Windows版本免费PyMol的安装

    技术背景 在前面一篇博客中,我们介绍过在Linux平台下安装和使用免费版本的PyMol.其实同样的这个免费版在Windows平台上(这里以win11为例)也是支持的. 安装流程 这个免费版本的PyMo ...

  7. elasticdump数据迁移与内外网安装

    elasticdump数据迁移与内外网安装 一.安装node 首先获取安装包 wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64 ...

  8. 在Ubuntu 18.04 Desktop图形中配置静态和动态IP

    在Ubuntu 18.04 图形界面中配置静态和动态IP 设置静态ip 设置为dhcp动态获取ip

  9. 【ActiveJdbc】03

    一.查询API 简单条件筛选: List<Person> list = Person.where("name = 'John'") 动态参数条件: List<Pe ...

  10. 【DataBase】SQL50 Training 50题训练

    原文地址: https://blog.csdn.net/xiushuiguande/article/details/79476964 实验数据 CREATE DATABASE IF NOT EXIST ...