合网站 - 百度,手游app开发公司,明年做哪些网站能致富,网站建设的模板一、为什么需要进行pdf解析#xff1f;
最近在探索ChatPDF和ChatDoc等方案的思路#xff0c;也就是用LLM实现文档助手。在此记录一些难题和解决方案#xff0c;首先讲解主要思想#xff0c;其次以问题回答的形式展开。
二、为什么需要对pdf进行解析#xff1f;
当利用L…一、为什么需要进行pdf解析
最近在探索ChatPDF和ChatDoc等方案的思路也就是用LLM实现文档助手。在此记录一些难题和解决方案首先讲解主要思想其次以问题回答的形式展开。
二、为什么需要对pdf进行解析
当利用LLMs实现用户与文档对话时首要工作就是对文档中内容进行解析。
由于pdf是最通用也是最复杂的文档形式所以对pdf进行解析变成利用LLM实现用户与文档对话的重中之重工作。
如何精确地回答用户关于文档的问题不重也不漏笔者认为非常重要的一点是文档内容解析。如果内容都不能很好地组织起来LLM只能瞎编。
三、pdf解析有哪些方法对应的区别是什么
pdf的解析大体上有两条路一条是基于规则一条是基于AI。 方法一基于规则 介绍根据文档的组织特点去算每部分的样式和内容存在问题不通用因为pdf的类型、排版实在太多了没办法穷举 方法二基于AI 介绍该方法为目标检测和OCR文字识别pipeline方法
四、pdf解析存在哪些问题
pdf转text这块存在一定的偏差尤其是paper中包含了大量的figure和table以及一些特殊的字符直接调用langchain官方给的pdf解析工具有一些信息甚至是错误的。
这里一方面可以用arxiv的tex源码直接抽取内容另一方面可以尝试用各种ocr工具来提升表现。
五、如何长文档书籍中关键信息
对于长文档书籍如何获取其中关键信息并构建索引 方法一分块索引法 介绍直接对长文档书籍进行分块然后构建索引入库。后期问答只需要从库中召回和用户query相关的内容块进行拼接成文章输入到LLMs生成回复存在问题 将文章分块会破坏文章语义信息对于长文章会被分割成很多块并构建很多索引这严重影响知识库存储空间如果内容都不能很好地组织起来LLM只能瞎编 方法二文本摘要法 介绍直接利用文本摘要模型对每一篇长文档书籍做文本摘要然后对文本摘要内容构建索引入库。后期问答只需要从库中召回和用户query相关的摘要内容输入到LLMs生成回复存在问题 由于每篇长文档书籍内容比较多直接利用文本摘要模型对其做文本摘要需要比较大算力成本和时间成本生成的文本摘要存在部分内容丢失问题不能很好的概括整篇文章 方法三多级标题构建文本摘要法 介绍把多级标题提取出来然后适当做语义扩充或者去向量库检索相关片段最后用LLM整合即可。
六、为什么要提取标题甚至是多级标题
没有处理过LLM文档对话的朋友可能不明白为什么要提取标题甚至是多级标题因此我先来阐述提取标题对于LLM阅读理解的重要性有多大。
如Q1阐述的那样标题是快速做摘要最核心的文本对于有些问题high-level的问题没有标题很难得到用户满意的结果。
举个栗子假如用户就想知道3.2节是从哪些方面讨论的标准答案就是3个方面如果我们没有将标题信息告诉LLM而是把所有信息全部扔给LLM那它大概率不会知道是3个方面要么会少要么会多。做过的朋友秒懂
七、如何提取文章标题
第一步pdf转图片。用一些工具将pdf转换为图片这里有很多开源工具可以选笔者采用fitz一个python库。速度很快时间在毫秒之间第二步图片中元素标题、文本、表格、图片、列表等元素识别。采用目标检测模型识别元素。 工具介绍 Layout-parser 优点最大的模型约800MB精度非常高缺点速度慢一点 PaddlePaddle-ppstructure 优点模型比较小效果也还行 unstructured 缺点fast模式效果很差基本不能用会将很多公式也识别为标题。其他模式或许可行笔者没有尝试
利用上述工具可以得到了一个list存储所有检测出来的标题
第三步标题级别判断。利用标题区块的高度也就是字号来判断哪些是一级标题哪些是二级、三级、…N级标题。这个时候我们发现一些目标检测模型提取的区块并不是严格按照文字的边去切导致这个idea不能实施那怎么办呢unstructured的fast模式就是按照文字的边去切的同一级标题的区块高度误差在0.001之间。因此我们只需要用unstructured拿到标题的高度值即可虽然繁琐但是不耗时unstructured处理也在毫秒之间。
我们来看看提取效果按照标题级别输出
论文https://arxiv.org/pdf/2307.14893.pdf
八、如何区分单栏还是双栏pdf如何重新排序
动机很多目标检测模型识别区块之后并不是顺序返回的因此我们需要根据坐标重新组织顺序。单栏的很好办直接按照中心点纵坐标排序即可。双栏pdf就很棘手了有的朋友可能不知道pdf还有双栏形式
双栏论文示例 问题一首先如何区分单双栏论文 方法得到所有区块的中心点的横坐标用这一组横坐标的极差来判断即可双栏论文的极差远远大于单栏论文因此可以设定一个极差阈值。 问题二双栏论文如何确定区块的先后顺序 方法先找到中线将左右栏的区块分开中线横坐标可以借助上述求极差的两个横坐标x1和x2来求也就是(x1x2)/2。分为左右栏区块后对于每一栏区块按照纵坐标排序即可最后将右栏拼接到左栏后边。
九、如何提取表格和图片中的数据
思路仍然是目标检测和OCR。无论是layoutparser还是PaddleOCR都有识别表格和图片的目标检测模型而表格的数据可以直接OCR导出为excel形式数据非常方便。
以下是layoutparser demo的示例
Layout parser效果示例
以下是PaddlePaddle的PP structure示例
PP structure效果示例
提取出表格之后喂给LLMLLM还是可以看懂的可以设计prompt做一些指导。关于这一块两部分demo代码都很清楚明白这里不再赘述。
十、基于AI的文档解析有什么优缺点
优点准确率高通用性强。缺点耗时慢建议用GPU等加速设备多进程、多线程去处理。耗时只在目标检测和OCR两个阶段其他步骤均不耗时。
总结
笔者建议按照不同类型的pdf做特定处理例如论文、图书、财务报表、PPT都可以根据特点做一些小的专有设计。
没有GPU的话目标检测模型建议用PaddlePaddle提供的速度很快。Layout parser只是一个框架目标检测模型和OCR工具可以自有切换。