RAG文本解析工具open-parse

简介

对于RAG来说,将文本有效的分块(chucking)是很重要的一件事,open-parse是一个用来分块pdf的开源工具,它主要基于视觉驱动(Visually-Driven)的方式来将文档分块,也就是说它不仅仅是按照段落或者字数来对文档分块,而是在分块时将布局上属于同一个上下文的文本切分成一块。

使用入门

安装命令如下

pip install openparse
#如果要使用识别表格的算法
pip install "openparse[ml]"
#安装openparse[ml]后,使用如下命令来下载模型,大概会占用1.5G的空间
openparse-download

为了验证pdf解析效果,可下载openparse提供的示例pdf文件

wget https://sergey-filimonov.nyc3.digitaloceanspaces.com/open-parse/sample-docs/naic-numerical-list-of-companies-page-94.pdf -O sample-docs/companies-list.pdf
wget https://sergey-filimonov.nyc3.digitaloceanspaces.com/open-parse/sample-docs/mobile-home-manual.pdf -O sample-docs/mobile-home-manual.pdf

其基本使用很简单,使用DocumentParser类就可以了。

import openparse
from openparse import DocumentParser

pdf_path = "./sample-docs/mobile-home-manual.pdf"
parser = DocumentParser()
parsed_content = parser.parse(pdf_path)
for node in parsed_content.nodes:
    display(node)
    print("*"*20)


pdf = openparse.Pdf(pdf_path)

pdf.display_with_bboxes(
    parsed_nodes.nodes,
)

使用display以markdown形式显示解析的内容

在这里插入图片描述

display_with_bboxes将提取的内容在原始pdf中画框显示,这个对于debug和显示解析效果来说挺实用的。
在这里插入图片描述

open_parse支持设置table_args来进行表格提取,其主要有如下三个参数。

  • parsing_algorithm, 用来解析表格的库,目前支持值为:pymupdf、unitable、table-transformers
  • min_table_confidence,默认值为0.75,一个表格被提取的置信度分数。
  • table_output_format,表格输出格式,unitable支持html、pymupdf和table-transformers支持html和markdown
pdf_path = "sample-docs/companies-list.pdf"
parser = DocumentParser(
    table_args={
        "parsing_algorithm": "unitable",
        "min_table_confidence": 0.8}
)
parsed_content = parser.parse(pdf_path)
# 可通过node.variable来判断是否提取到表格,存在表格的话,里面会有"table" key存在
table_nodes = [node for node in parsed_nodes.nodes if "table" in node.variant]
# 也可以将提取的表格在原PDF中展示出来
doc = openparse.Pdf(file=pdf_path)
doc.display_with_bboxes(table_nodes)

将解析结果序列化

# 将结果变成字典
parsed_content.dict()
# 将结果变成json字符串
parsed_content.json()
# 将结果变成json编码字符串
parsed_content.model_dump_json()

支持自定义处理流程,参见文档

实现原理

  • 默认使用pypdf 和 pdfminer.six来解析pdf文档,将内容划分成node,再根据一些启发式规则如将标题与接下来的内容合并、将项目列表内容合并等来对pdf内容进行分块。

  • 另外也支持使用语义处理,其原理是将pdf解析后的node使用embedding编码,然后计算每个node之间的语义相似度,将语义相似度大于阈值且合并后不超出上下文宽度的相邻node给合并。

from openparse import processing, DocumentParser

semantic_pipeline = processing.SemanticIngestionPipeline(
    openai_api_key=OPEN_AI_KEY,
    model="text-embedding-3-large",
    min_tokens=64,
    max_tokens=1024,
)
parser = DocumentParser(
    processing_pipeline=semantic_pipeline,
)

parsed_content = parser.parse(basic_doc_path)
  • 表格的提取主要借助第三方包如pymupdf、unitable、table-transformers来识别pdf中的表格。

总结

测试了开源项目open-parse解析pdf文档的效果,并确认了其实现原理。实测下来感觉它对于大部分场景的分块会有帮助,但是在使用过程中也存在对于从markdown文件转成的pdf文件内容识别不是很准确(项目中也说明了存在有些pdf解析不是很准确的情况)。而对于表格提取的支持主要受限于其依赖的第三方工具或模型的表格提取能力了。此外通过embedding语义相似度来合并段落的思路也可以借鉴。

参考资料

  1. open-parse github
  2. open-parse 文档
  3. open-parse hacker news 讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

easyx 按键信息

前言 看看代码吧 ExMessage msg { 0 }; bool button(int x, int y, int w, int h, const char* text) {//绘制按钮setfillcolor(RGB(230, 231, 232));fillroundrect(x, y, x w, y h, 5, 5);if ((msg.x > x && msg.x<x w && msg.y>y && …

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

目录 1.分表 2.分库 说白了&#xff0c;分库分表是两回事儿&#xff0c;大家可别搞混了&#xff0c;可能是光分库不分表&#xff0c;也可能是光分表不分库&#xff0c;都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT …

java反序列化之URLDNS链学习

一、前言 近来学习java反序列化&#xff0c;听p神所说这个URLDNS利用链比较好理解&#xff0c;故决定由此进入学习的第一篇。 URLDNS是Java反序列化中比较简单的一个链&#xff0c;由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检…

hertzbeat 源码阅读记录

关于自定义标签的说明 EmailValid.java HostValid PhoneNumValid 枚举值说明&#xff1a;

【OpenGL实践08】现代渲染管线在GLUT和Pygame和Qt.QOpenGLWidget上各自的实现代码

Qt.QOpenGLWidget进行现代渲染管线实验效果 一、说明 据说QOpenGLWidget是用来取代QGLWidget的继承者&#xff0c;我们试图将GLUT上的旧代码改成QOpenGLWidget&#xff0c;本以为差别不大&#xff0c;轻易搞定&#xff0c;经实践发现要付出极大努力才能完成。经多次实验发现G…

Java面试八股之Java中为什么没有全局变量

Java中为什么没有全局变量 Java中没有传统意义上的全局变量&#xff0c;这是因为Java语言设计遵循面向对象的原则&#xff0c;强调封装性和模块化&#xff0c;以及避免全局状态带来的副作用。 封装性&#xff1a; 全局变量违反了面向对象编程中的封装原则&#xff0c;即隐藏对…

【ZYNQ】zynq启动模式及程序固化

一、前言 由于zynq含有arm cpu ,其启动模式由ps主导&#xff0c;与纯逻辑的fpga不相同&#xff0c;此处做一个记录。 二、zynq启动模式 关于zynq的启动模式详细内容可以参考官方文档&#xff1a;ug585-Zynq 7000 SoC Technical Reference Manual&#xff0c;第六章。 2.1 启…

帮助中心系统搭建不再是难题,这几个工具来帮你

在面临客户服务挑战时&#xff0c;有效的帮助中心系统是提升用户满意度和解决问题效率的关键。幸运的是&#xff0c;搭建一个功能全面的帮助中心不再是什么难事。下面&#xff0c;我要为你介绍三款能够帮忙打造帮助中心的超实用工具&#xff0c;让你的客户支持体验迅速升级。 1…

网页使用之如何返回json/xml

后端返回json数据给前端进行渲染的方式比较熟悉&#xff0c;至于返回html页面&#xff0c;返回xml的方式接触逐渐减少&#xff0c;来在项目中熟悉这一点。 返回文本数据 json姿势的返回实属最简单的方式&#xff0c;在SpringBoot应用中&#xff0c;有两种简单的方式 1.直接在…

S32K的JLINK与PE接线方法与刷程序失败问题

S32K的JLINK与PE接线方法与刷程序失败问题 1、PE的接线方法2、JLINK的接线方法3、刷程序失败问题 1、PE的接线方法 2、JLINK的接线方法 3、刷程序失败问题 出现如下问题&#xff1a; Secure Debug might be enabled on this device.lf so.please unlock the device via PEmic…

一段音频驱动照片唱歌,EMO模型上线通义APP

把一段音频、一张照片输入AI模型&#xff0c;就能让图中人物开口唱歌说话&#xff0c;让奥黛丽赫本唱《上春山》、陶俑仕女说英文RAP、爱因斯坦说中文段子。不久前&#xff0c;这款名为EMO的模型因为阿里通义实验室的一篇论文火遍海内外&#xff0c;模型的产品化进程也广受关注…

运动耳机哪个牌子性价比高?推荐五款高性价比运动耳机

跑步、健身、游泳……无论你的运动喜好是什么&#xff0c;一款好的运动蓝牙耳机都能为你的运动体验加分。然而&#xff0c;市面上的运动蓝牙耳机品牌众多&#xff0c;如何选择一款既舒适又实用的产品呢&#xff1f;本文将为你提供一些选购运动蓝牙耳机建议&#xff0c;并为你推…

企业规模扩大,SD-WAN实现跨省快速组网

随着数字化时代的飞速发展&#xff0c;企业面临着前所未有的挑战与机遇。5G、VoIP、AI和物联网等新技术的兴起&#xff0c;不仅改变了商业格局&#xff0c;也对企业网络提出了更高的要求。随着企业规模的不断扩大&#xff0c;企业如何搭建跨省的、高性能、超融合、简化运维的组…

解决Jmeter 4.x 请求到elasticsearch 中文乱码的问题

文章目录 前言解决Jmeter 4.x 请求到elasticsearch 中文乱码的问题 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#…

MOS产品在光伏逆变器上的应用与数据分析

2023年全球光伏装机量表现优异&#xff0c;根据BloombergNEF统计数据&#xff0c;2023年全球光伏新增装机量444GW&#xff0c;同比增长76.2%&#xff0c;其中约一半新增装机量来自中国。 中国光伏新技术迭代不断&#xff0c;产业链降本增效加速。根据CPIA数据&#xff0c;2022年…

Linux网络-DNS域名解析服务

目录 一.DNS相关介绍 1.DNS是什么 2.DNS系统的分布式数据结构 根域 顶级域 二级域 子域 主机 3.服务器类型 主域名服务器 从域名服务器 缓存域名服务器 转发域名服务器 二.DNS域名解析 1.DNS域名解析方式及功能 2.DNS域名解析查询方式 2.1.递归查询&#xff0…

【LLM多模态】Qwen-VL模型结构和训练流程

note 观点&#xff1a;现有很多多模态大模型是基于预训练&#xff08;和SFT对齐&#xff09;的语言模型&#xff0c;将视觉特征token化并对齐到语言空间中&#xff0c;利用语言模型得到多模态LLM的输出。如何设计更好的图像tokenizer以及定位语言模型在多模态LLM中的作用很重要…

零基础HTML教程(27)--表单元素属性

文章目录 1. 背景2. disabled:禁用3. readonly:直读4. checked:选中5. maxlength:最大输入字符数6. 小结 1. 背景 上一篇我们讲了表单元素的两个属性id和name&#xff0c;其实表单元素还有其他几个常用属性&#xff0c;我们逐一介绍。 2. disabled:禁用 disabled属性表示禁用…

大厂面试题:从源码的角度分析MyBatis中#{}与${}的区别

大家好&#xff0c;我是王有志。 今天我会通过源码来分析一道京东&#xff0c;联储证券和爱奇艺都考察过的 MyBatis 面试题&#xff1a;MyBatis 中“#{}”和“${}”有什么区别&#xff1f;是否可以使用“#{}”来传递 order by 的动态列&#xff1f; “#{}”和“${}”有什么区…

【Linux】网络与守护进程

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;进程状态、类型、优先级、命令行参数概念、环境变量(重要)、程序地址空间 目录 &#x1f449;&#x1f3fb;守护…