RAG数据拆分之PDF

  1. 引言
  2. RAG数据简介
  3. PDF解析方法及工具
  4. 代码实现
  5. 总结

二、正文内容

  1. 引言

本文将介绍如何将RAG数据拆分至PDF格式,并探讨PDF解析的方法和工具,最后提供代码示例。

  1. RAG数据简介

RAG(关系型属性图)是一种用于表示实体及其关系的图数据结构。在RAG中,节点表示实体,边表示实体之间的关系,属性则用于描述实体和边的特征。

  1. PDF解析方法及工具

(1)PDF解析方法

  • DOM解析:将PDF文档转换为树形结构,便于操作和遍历。
  • SAX解析:基于事件驱动,适用于处理大型PDF文档。

(2)PDF解析工具

  • PyPDF2:一个Python库,用于读取、分割、合并PDF文件。
  • PDFMiner:一个强大的PDF解析库,支持提取文本、图片等元素。
  • pdfplumber:一个专注于文本提取的PDF解析库。
  1. 代码实现

以下是一个使用PyPDF2将RAG数据拆分至PDF的示例代码:

import PyPDF2# 读取PDF文件
with open('source.pdf', 'rb') as file:reader = PyPDF2.PdfFileReader(file)num_pages = reader.numPages# 遍历每一页for page_num in range(num_pages):page = reader.getPage(page_num)text = page.extractText()# 拆分RAG数据# 假设RAG数据以特定格式存储,例如:实体1-关系-实体2entities = text.split('-')# 创建新的PDF文件pdf_writer = PyPDF2.PdfFileWriter()pdf_writer.addPage(page)with open(f'output/page_{page_num + 1}.pdf', 'wb') as output_file:pdf_writer.write(output_file)print('PDF文件拆分完成!')

解析表格:

def extract_continuous_tables(pdf, start_page_num):"""从指定页开始提取连续的表格内容:param pdf: PDF文档对象:param start_page_num: 开始页码:return: 包含处理页码和表格文本的字典"""continuous_tables = []  # 存储连续表格内容processed_pages = []  # 存储处理过的页码current_page_num = start_page_num# 添加起始页processed_pages.append(current_page_num)while current_page_num < len(pdf.pages):current_page = pdf.pages[current_page_num]current_page = remove_header_footer(current_page)# 提取当前页的表格current_tables = current_page.extract_tables()if current_tables:# 将当前页的表格添加到结果中continuous_tables.extend(current_tables)# 检查是否还有下一页if current_page_num + 1 >= len(pdf.pages):break# 获取下一页内容next_page = pdf.pages[current_page_num + 1]next_page = remove_header_footer(next_page)# 提取下一页的内容next_page_tables = next_page.extract_tables()next_page_words = next_page.extract_words(keep_blank_chars=True, extra_attrs=['fontname', 'size'])# 过滤页眉页脚header_height = 50footer_height = 50def is_header_content(word):text = word['text'].lower()# 位置检查if word['top'] <= header_height or word['top'] >= (next_page.height - footer_height):return True# 电话号码模式phone_patterns = [r'tel[\s:]*[\d\-/]+',r'电话[\s:]*[\d\-/]+',r'传真[\s:]*[\d\-/]+',r'fax[\s:]*[\d\-/]+',r'\d{2,4}[\-/]\d{4,8}',  # 匹配常见电话号码格式]# 使用正则表达式匹配import reif any(re.search(pattern, text, re.IGNORECASE) for pattern in phone_patterns):return True# 页眉特征检查header_features = [# 位置特征word['top'] < header_height * 1.2,  # 稍微放宽高度限制word['size'] < 10,  # 字体较小# 内容特征any(pattern in text for pattern in ['页码', '第', '页', 'page','copyright', '版权所有','机密', '保密','草稿', 'draft','文档编号', 'doc','日期', 'date']),# 格式特征bool(re.match(r'.*\d+.*页', text)),  # 包含页码bool(re.match(r'.*\d{4}[-/]\d{1,2}[-/]\d{1,2}', text)),  # 日期格式]return any(header_features)# 过滤词filtered_words = [word for word in next_page_wordsif not is_header_content(word)]# 如果需要,还可以按垂直位置排序filtered_words.sort(key=lambda x: x['top'])# 判断下一页是否以表格开始starts_with_table = Falseif filtered_words and next_page_tables:  # 确保有文字和表格try:if next_page_tables[0] and next_page_tables[0][0]:  # 确保表格有内容# 获取第一个表格的位置first_table = next_page.find_tables()[0]if first_table:first_table_top = first_table.bbox[1]# 获取第一个文字的位置first_word_top = filtered_words[0]['top']# 如果表格在文字之前,则认为页面以表格开始if first_table_top < first_word_top:starts_with_table = Trueexcept (IndexError, AttributeError):starts_with_table = Falseif not starts_with_table:# 如果下一页不是以表格开始,则结束提取break# 继续处理下一页current_page_num += 1processed_pages.append(current_page_num)# 将表格转换为文本table_texts = []for table in continuous_tables:if table:table_text = []for row in table:# 过滤None和空字符串,并确保所有值都转换为字符串row_text = []for cell in row:if cell is not None and str(cell).strip():cell_str = str(cell).strip().replace("\n", "    ")# if cell_str:  # 只添加非空字符串row_text.append(cell_str)else:row_text.append(" ")  # 将None转换为空字符串if row_text:  # 只添加非空行table_text.append('##'.join(row_text))filtered_table_text = [row for row in table_text if '##' in row]if filtered_table_text:table_texts.append('\n'.join(filtered_table_text))# 返回包含页码列表和表格文本的字典result = {'processed_pages': processed_pages,'table_text': '\n\n'.join(table_texts) if table_texts else ""}return result

1.pdfplumber
https://blog.csdn.net/fuhanghang/article/details/122579548
1
pdfplumber的主要类和方法


pdfplumber对于表格的提取
参考https://github.com/jsvine/pdfplumber/blob/stable/examples/notebooks/extract-table-ca-warn-report.ipynb
1
代码:

pdf = pdfplumber.open("../pdfs/ca-warn-report.pdf")
p0=pdf.pages[0]
im = p0.to_image()  #display 第一页
table = p0.extract_table() 抽取其中最大的表格import pandas as pd
df = pd.DataFrame(table[1:], columns=table[0])
for column in ["Effective", "Received"]:df[column] = df[column].str.replace(" ", "")  使用panda来吧table抽取到的数据转成dataFrame格式

  1. 总结

本文介绍了RAG数据拆分至PDF的方法和工具,并通过代码示例展示了如何使用PyPDF2进行PDF文件拆分。在实际应用中,可根据需求选择合适的解析方法和工具。

希望这个分享笔记大纲和代码示例能帮助你完成你的分享笔记。在实际编写过程中,可以根据具体需求进行调整和优化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

labelimg每次标注的时候自动导入预设标签

背景说明 最近在做一个视频行为识别项目的时候&#xff0c;已经采集了视频样例片段&#xff0c;需要对视频的行为动作进行图片标注&#xff0c;自己很快完成了视频到图片的分割&#xff0c;在进行图片标注的时候&#xff0c;选用的标注工具是labelimg,由于视频转成图片后数量很…

Java对接AI大模型

随着AI大模型技术的升起,人们越来越感觉到生活上的便捷以及人机对话照进现实.什么是大模型呢? 大模型&#xff08;Large Model&#xff09;&#xff0c;通常是指参数量非常庞大的深度学习模型&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#…

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口&#xff0c;此处没有对用户手机号和验证码等信息进行加密传输&#xff0c;可以很简单的截取并开展一些合法的…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录&#xff1a; 个人中心、修改密码…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…

代码美学3:RGB转化+MATLAB制作渐变色

RGB颜色转化器&#xff08;转换成matlab可以读取的形式&#xff09; n input(请输入 n&#xff1a;); color_matrix cell(1, n); for i 1:nR input(请输入 R 值&#xff1a;);G input(请输入 G 值&#xff1a;);B input(请输入 B 值&#xff1a;);color_matrix{i} [R/2…

kafka数据在服务端时怎么写入的

学习背景 接着上篇&#xff0c;我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前&#xff0c;我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群&#xff0c;我们在这个集群上创建一个topic叫做shitu-topic&…

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机&#xff08;Exchange&#xff09;fanoutdirecttopicheaders&#xff08;很少用到&#xff09; 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

Kali Linux怎么开python虚拟环境

相信很多朋友再学习的过程中都会遇到一些pip失效&#xff0c;或者报错的时候&#xff0c;他们要求我们要使用虚拟环境&#xff0c;但是不知道怎么搭建&#xff0c;下面这篇文章就来告诉你如何搭建虚拟环境&#xff0c;这个方法在所有Linux的服务器都通用&#xff0c;就两行命令…

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件&#xff0c;是对原生组件的封装 原生组件&#xff1a;Android或ios内的组件核心组件&#xff1a;RN中常用的&#xff0c;来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图&#xff1b;在 iOS 开发…

视觉语言动作模型VLA的持续升级:从π0之参考基线Octo到OpenVLA、TinyVLA、DeeR-VLA、3D-VLA

第一部分 VLA模型π0之参考基线Octo 1.1 Octo的提出背景与其整体架构 1.1.1 Octo的提出背景与相关工作 许多研究使用从机器人收集的大量轨迹数据集来训练策略 从早期使用自主数据收集来扩展策略训练的工作[71,48,41,19-Robonet,27,30]到最近探索将现代基于transformer的策略…

C与指针。

目录 1_指针理解 1.1变量的值 1.2变量的地址 1.3指针 1.4取变量的地址 2_分析指针 2.1分析指针变量的要素 2.2根据需求定义指针变量 3_指针的使用 3.1指针对变量的读操作 3.2指针对变量的写操作 4_指针占用空间的大小与位移 4.1指针占用空间的大小 4.2指针的位移…

单片机学习笔记 15. 串口通信(理论)

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

树莓派5+文心一言 -> 智能音箱

一、简介 效果&#xff1a;运行起来后&#xff0c;可以连续对话 硬件&#xff1a;树莓派5、麦克风、音箱&#xff0c;成本500-1000 软件&#xff1a;snowboy作为唤醒词、百度语音作为语音识别、brain作为指令匹配、百度文心一言作为对话模块、微软的edge-tts语音合成... 二…

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…

Linux服务器使用JupyterLab

一、JupyterLab的配置 1. conda配置 自行搜索conda安装与配置。 2. 环境创建 &#xff08;1&#xff09;创建环境 conda create -n jupyter python3.10&#xff08;2&#xff09;激活环境 conda activate jupyter&#xff08;3&#xff09;安装jupyter包 pip install -i…

Flutter:页面滚动

1、单一页面&#xff0c;没有列表没分页的&#xff0c;推荐使用&#xff1a;SingleChildScrollView() return Scaffold(backgroundColor: Color(0xffF6F6F6),body: SingleChildScrollView(child: _buildView()) );2、列表没分页&#xff0c;如购物车页&#xff0c;每个item之间…

使用GitZip for github插件下载git仓库中的单个文件

背景&#xff1a;git仓库不知道抽什么疯&#xff0c;下载不了单个文件&#xff0c;点击下载没有反应&#xff0c;遂找寻其他方法&#xff0c;在这里简单记录下。 使用GitZip for github插件下载仓库中的单个文件 1、首先在浏览器安装插件&#xff0c;并确保为打开状态。 2、然…