前言

文档分割是一项具有挑战性的任务,它是任何知识库问答系统的基础。高质量的文档分割结果对于显著提升问答效果至关重要,但是目前大多数开源库的处理能力有限。

这些开源的库或者方法缺点大致可以罗列如下:

  • 只能处理文本,无法提取表格中的内容
  • 缺乏有效的分割策略,要么是一整个文档全部提取,要么是词粒度的获取

对于第一点,一般是把表格中的内容识别成文本,这样喂给大模型的时候就会出现一连串数字或者字母,这无疑会增大模型的理解难度;对于第二点,则是需要按照指定的长度对文档进行切分,或者把词按照一定的规则拼接到一块,这同样会损失到文本自身的上下文信息。

而本文接下来介绍的Open-parse这个库可以直接从文本中提取出多个节点,每个节点就是一个chunk,已经分好了,因此无需再按照长度进行split,这样同时也比单独提取一个词再进行合并又简化了不少操作;同时还支持同时提取表格和文字,无需分开提取。

快速开始

安装

pip install openparse

使用pip进行安装,同时这个库依赖Pymupdfpdfminer等其他库,也会同时安装。

识别文字

pdf = "c:\\人口.pdf"
parser = openparse.DocumentParser()
parsed_basic_doc = parser.parse(pdf)
for node in parsed_basic_doc.nodes:
node
print('\n--------------------\n')

可以看到每一页的pdf被分成多个chunk,且还能保留原始文本中的加粗斜体等信息。

print(parsed_basic_doc.nodes[0])

elements=(TextElement(text='Aging Research老龄化研究, 2022, 9(3), 26-34\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 ', lines=(LineElement(bbox=(56.64, 739.57, 232.44, 750.01), spans=(TextSpan(text='Aging Research ', is_bold=True, is_italic=False, size=9.0), TextSpan(text='老龄化研究', is_bold=False, is_italic=False, size=9.0), TextSpan(text=', 2022, 9(3), 26-34 ', is_bold=True, is_italic=False, size=9.0)), style=None, text='Aging Research老龄化研究, 2022, 9(3), 26-34'), LineElement(bbox=(56.65, 728.28, 348.95, 737.28), spans=(TextSpan(text='Published Online September 2022 in Hans. http://www.hanspub.org/journal/ar ', is_bold=False, is_italic=False, size=9.0),), style=None, text='Published Online September 2022 in Hans. http://www.hanspub.org/journal/ar '), LineElement(bbox=(56.64, 717.36, 225.23, 726.36), spans=(TextSpan(text='https://doi.org/10.12677/ar.2022.93004 ', is_bold=False, is_italic=False, size=9.0),), style=None, text='https://doi.org/10.12677/ar.2022.93004 ')), bbox=Bbox(page=0, page_height=807.96, page_width=595.32, x0=56.64, y0=717.36, x1=348.95, y1=750.01), variant=<NodeVariant.TEXT: 'text'>, embed_text='Aging Research老龄化研究, 2022, 9(3), 26-34\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 '),) variant={'text'} tokens=66 bbox=[Bbox(page=0, page_height=807.96, page_width=595.32, x0=56.64, y0=717.36, x1=348.95, y1=750.01)] text='Aging Research老龄化研究, 2022, 9(3), 26-34\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 '

通过打印出node,可以看出这种结构包含了原始文本中的元信息,包含文本的坐标、大小、是否加粗、是否斜体等。

识别表格内容

  • Pymupdf
  • Unitable
  • Table Transformer

openparse提供了三个方法来识别和提取表格中的内容,方法1是直接使用Pymupdf这个库的表格识别模块,因此准确率最差,但对硬件要求不高;其他的2个都是100mb左右的模型,如果用cpu来推理会比较耗时。

# defining the parser (table_args is a dict)
parser = openparse.DocumentParser(
table_args={
"parsing_algorithm": "table-transformers", # 或者其他两个方法
"table_output_format": "html" # 以html格式返回表格内容,也可以选择md
}
)

与前面直接识别文本类似,只需要加入table_args参数即可。

可以看到表格中的内容被很好的还原了

使用表格提取除了返回表格内容外,还会把正常的文本返回,这与Pymupdf等库只能选择返回文本还是只返回已有的表格不同。因此在不确定文本中含有什么内容时用这个方法会更加保险一点,对硬件的计算要求也不高。

语义相似

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,
)

openparse还支持端到端的方式对node数据进行向量化并聚类,只需要指定processing_pipeline为相应的embedding模型即可。但是目前仅支持OpenAI的模型,需要OPEN_AI_KEY才可以使用。虽然后续会更新其他模型,但目前想用的话需要自己修改这段代码的实现。

combine_parser = DocumentParser(
processing_pipeline=semantic_pipeline,
table_args={
"parsing_algorithm": "table-transformers",
"table_output_format": "html"
} )

同时,还能把语义相似和表格内容提取组合到一起使用,实现对表格内容提取的同时还能融合相似的片段。

总结

openparse这个库算是目前开源社区中比较优秀的文档分割处理库了,功能虽然全面,还是还有不少可以优化的地方,后续也会支持其他向量化模型,并且可以跟LlamaindexLangchain等框架无缝衔接,应该值得持续关注。

【高级RAG技巧】在大模型知识库问答中增强文档分割与表格提取的更多相关文章

  1. 【已解决】phpMyAdmin中导入mysql数据库文件时出错:您可能正在上传很大的文件,请参考文档来寻找解决办法

    期间,用phpMyAdmin去导入90M左右的mysql数据库文件时出错: 您可能正在上传很大的文件,请参考文档来寻找解决方法. [解决过程] 1.很明显,是文件太大,无法导入.即上传文件大小有限制. ...

  2. 百度大脑UNIT3.0解读之对话式文档问答——上传文档获取对话能力

    在日常生活中,用户会经常碰到很多复杂的规章制度.规则条款.比如:乘坐飞机时,能不能带宠物上飞机,3岁小朋友是否需要买票等.在工作中,也会面对公司多样的规定制度和报销政策.比如:商业保险理赔需要什么材料 ...

  3. OneThink视图模型进行组合查询!文档组合文档详情

    测试方法:twoCate: public function twoCate(){ $where = array( 'category_id'=>43 ); $list = D('TwoView' ...

  4. 笔记大神推荐的个人知识文档管理工具mybase

    铛铛铛,今天我要给大家推荐一款个人知识笔记管理神器,不出你们所料,它就是mybase. 那mybase究竟能干啥呢?借用mybase中文官网的一句话来说,mybase软件可以将电脑上的文档.知识.笔记 ...

  5. python3如何随机生成大数据存储到指定excel文档里

    本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...

  6. python实用小技巧自问自答系列(一):查看类中函数文档doc的方法

    问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...

  7. #Mac技巧#如何在Mac系统上新建TXT文档,以及打开txt文稿的乱码问题如何解决

    使用mac的朋友可能都有这样的疑问,mac系统下强大的文本编辑器居然不能保存常用的TXT格式? 又或者打开同事在windows上保存的TXT文件会出现如下情况: 最近Hans也被这些问题困扰着,于是便 ...

  8. 大数据项目之_15_帮助文档_NTP 配置时间服务器+Linux 集群服务群起脚本+CentOS6.8 升级到 python 到 2.7

    一.NTP 配置时间服务器1.1.检查当前系统时区1.2.同步时间1.3.检查软件包1.4.修改 ntp 配置文件1.5.重启 ntp 服务1.6.设置定时同步任务二.Linux 集群服务群起脚本2. ...

  9. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  10. 基础:从概念理解Lucene的Index(索引)文档模型

    转:http://blog.csdn.net/duck_genuine/article/details/6053430   目录(?)[+]   Lucene主要有两种文档模型:Document和Fi ...

随机推荐

  1. 远程服务调用(RPC与Rest本质区别)

    一.背景 远程服务将计算机程序的工作范围从单机扩展到网络,从本地延伸至远程,是构建分布式系统的首要基础.远程服务调用(Remote Procedure Call,RPC)在计算机科学中已经存在了超过四 ...

  2. 第12章_MySQL数据类型精讲

    第12章_MySQL数据类型精讲 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. MySQL中的数据类型 类型 类型举例 整数类型 TINYINT. ...

  3. MySQL基础篇快速记忆和查询

    查询 语法: SELECT 标识选择哪些列 FROM 标识从哪个表中选择 去重(Distinct) 在SELECT语句中使用关键字DISTINCT去除重复行 SELECT DISTINCT depar ...

  4. end_of_line = lf 选择行尾序列 .editorconfig - 老项目不动代码存盘 文件变动 CRLF 的问题 vscode

    end_of_line = lf 选择行尾序列 .editorconfig - 老项目不动代码存盘 文件变动 CRLF 的问题 缘由 vscode 老项目代码,没有变动,ctrl + s后 文件有变化 ...

  5. 基于DSP的设备振动信号的采集和处理模块研发总结

    前记  在能源领域,由于很多地方都是无人值守,设备故障检测是一个必须面对的问题.笔者通过最近几个行业案例了解到,由于很多设备发生故障时候会产生特定频谱的声音,所以该行业对振动监测的需求特别强烈,由于涉 ...

  6. 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之健康手环源码解析

    一 前记 健康手环是Apollo3 Blue的一个主打业务,也是该芯片最适合做的产品,在健康穿戴设备领域,该芯片有着对场景的透彻理解和技术的深厚积累. 二 源码分析 协议栈初始化: exactle_s ...

  7. pyecharts + Django你不知道这个架构有多美

    pyecharts + Django你不知道这个架构有多美 何为echarts?   pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS ...

  8. JavaScript知识总结 原型篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 对原型.原型链的理解 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性 ...

  9. power quyer 批量合并同一文件夹下数据格式相同的Excel文件

    一.需求描述:现在有一批数据格式相同的Excel文件需要把里面的内容合并到同一个Excel的一个sheet里面 二.新建一个叫数据汇总的Excel文件-数据-新建查询-从文件-选择数据存放的文件夹-然 ...

  10. iOS开发优势解析,费用探究以及软件开发详解

    摘要 本文探讨了iOS开发的优势.费用以及软件开发方面的相关内容.通过分析iOS开发所采用的编程语言.开发环境.用户界面设计.应用审核流程以及应用领域等方面,展示了iOS开发的诸多优势和特点.虽然iO ...