#langchain | RAG |富文本一致性解析 | NLP # langchain支持的9种PDF内容提取方式

# 读取markdown内容
from langchain_community.document_loaders import UnstructuredPDFLoader
from langchain import document_loaders# 用到的所有方法
# load_pdf_file_langchain_unstructed # x按照行,无结构化
# load_pdf_file_pypdf # x按照页码,无结构化
# load_pdf_file_MathPix #  x需要填写app_id、app_key(公司付费可申请api),可以转成markdown,多级标题,字体大小相似不能识别
# load_pdf_file_unstructed # x按照行或者全文,无结构化
# load_pdf_file_PyPDFium2 # x按照页码,无结构化
# load_pdf_file_PDFMiner # x无结构化,甚至没有分页
# load_pdf_file_html # 需要改进算法
# load_pdf_file_PyPDFDirectory #  x无结构化,只是能从文件夹去读取pdf文件,读取结果还是按照页码
# load_pdf_file_AmazonTextractPDFLoader # x无结构话,官方文档只提到提取文本,为提取到提取header或者提取结构def load_pdf_file_langchain_unstructed(content_path):loader = loader = UnstructuredPDFLoader(content_path, mode="elements")data = loader.load()for page in data:print('-------------------')print('content')print(page.page_content)print('metadata')print(page.metadata)return datadef load_pdf_file_pypdf(content_path):from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader(content_path)pages = loader.load_and_split()for page in pages:print('-------------------')print('content')print(page.page_content)print('metadata')print(page.metadata)return pagesdef load_pdf_file_MathPix(content_path):from langchain_community.document_loaders import MathpixPDFLoaderloader = MathpixPDFLoader(content_path)data = loader.load()for page in data:print('-------------------')print('content')print(page.page_content)print('metadata')print(page.metadata)return datadef load_pdf_file_unstructed(content_path):from langchain_community.document_loaders import UnstructuredPDFLoaderloader = UnstructuredPDFLoader(content_path, mode="elements")loader2 = UnstructuredPDFLoader(content_path)data = loader.load()for page in data:print('-------------------')print('content')print(page.page_content)print('metadata')print(page.metadata)return datadef load_pdf_file_PyPDFium2(content_path):from langchain_community.document_loaders import PyPDFium2Loaderloader = PyPDFium2Loader(content_path)data = loader.load()for page in data:print('-------------------')print('content')print(page.page_content)print('metadata')print(page.metadata)return datadef load_pdf_file_PDFMiner(content_path):from langchain_community.document_loaders import PDFMinerLoaderloader = PDFMinerLoader(content_path)data = loader.load()for page in data:print(page.page_content)print(page.metadata)return datadef load_pdf_file_html(content_path):'''这个函数的逻辑可以分为以下几个步骤:使用 PDFMinerPDFasHTMLLoader 加载 PDF 文件并将其转换为 HTML 格式。使用 BeautifulSoup 解析 HTML 内容,并找到所有的 'div' 标签。遍历所有的 'div' 标签,并从每个标签的 'style' 属性中提取出字体大小('font-size')。将具有相同字体大小的连续文本片段合并为一个片段,并将这些片段及其对应的字体大小存储在 snippets 列表中。遍历 snippets 列表,根据每个片段的字体大小将其分类为标题或内容,并将其存储在 semantic_snippets 列表中。具体的分类规则如下:如果当前片段的字体大小大于前一个片段的标题字体大小,那么将当前片段视为新的标题。如果当前片段的字体大小小于或等于前一个片段的内容字体大小,那么将当前片段视为前一个片段的内容。如果当前片段的字体大小大于前一个片段的内容字体大小但小于前一个片段的标题字体大小,那么将当前片段视为新的标题。返回 semantic_snippets 列表,其中每个元素都是一个 Document 对象,包含一个标题和其对应的内容。'''from langchain_community.document_loaders import PDFMinerPDFasHTMLLoaderloader = PDFMinerPDFasHTMLLoader(content_path)data = loader.load()[0]   # entire PDF is loaded as a single Documentfrom bs4 import BeautifulSoupsoup = BeautifulSoup(data.page_content,'html.parser')content = soup.find_all('div')import recur_fs = Nonecur_text = ''snippets = []   # first collect all snippets that have the same font sizefor c in content:sp = c.find('span')if not sp:continuest = sp.get('style')if not st:continuefs = re.findall('font-size:(\d+)px',st)if not fs:continuefs = int(fs[0])if not cur_fs:cur_fs = fsif fs == cur_fs:cur_text += c.textelse:snippets.append((cur_text,cur_fs))cur_fs = fscur_text = c.textsnippets.append((cur_text,cur_fs))# Note: The above logic is very straightforward. One can also add more strategies such as removing duplicate snippets (as# headers/footers in a PDF appear on multiple pages so if we find duplicates it's safe to assume that it is redundant info)from langchain.docstore.document import Documentcur_idx = -1semantic_snippets = []# Assumption: headings have higher font size than their respective contentfor s in snippets:# if current snippet's font size > previous section's heading => it is a new headingif not semantic_snippets or s[1] > semantic_snippets[cur_idx].metadata['heading_font']:metadata={'heading':s[0], 'content_font': 0, 'heading_font': s[1]}metadata.update(data.metadata)semantic_snippets.append(Document(page_content='',metadata=metadata))cur_idx += 1continue# if current snippet's font size <= previous section's content => content belongs to the same section (one can also create# a tree like structure for sub sections if needed but that may require some more thinking and may be data specific)if not semantic_snippets[cur_idx].metadata['content_font'] or s[1] <= semantic_snippets[cur_idx].metadata['content_font']:semantic_snippets[cur_idx].page_content += s[0]semantic_snippets[cur_idx].metadata['content_font'] = max(s[1], semantic_snippets[cur_idx].metadata['content_font'])continue# if current snippet's font size > previous section's content but less than previous section's heading than also make a new# section (e.g. title of a PDF will have the highest font size but we don't want it to subsume all sections)metadata={'heading':s[0], 'content_font': 0, 'heading_font': s[1]}metadata.update(data.metadata)semantic_snippets.append(Document(page_content='',metadata=metadata))cur_idx += 1return semantic_snippetsdef load_pdf_file_PyPDFDirectory(content_path):from langchain_community.document_loaders import PyPDFDirectoryLoaderloader = PyPDFDirectoryLoader(content_path)docs = loader.load()for doc in docs:print('-------------------')print('content')print(doc.page_content)print('metadata')print(doc.metadata)return docs
def load_pdf_file_AmazonTextractPDFLoader(content_path):from langchain_community.document_loaders import AmazonTextractPDFLoaderloader = AmazonTextractPDFLoader(content_path)documents = loader.load()for doc in documents:print('-------------------')print('content')print(doc.page_content)print('metadata')print(doc.metadata)return documents
content_path= r"/home/xinrui/project/xinren-rag-inti/tests/data/测试-导入文本策略.pdf"
Directory_path= r"/home/xinrui/project/xinren-rag-inti/tests/data/"
# load_pdf_file_AmazonTextractPDFLoader(content_path)

参考文件:
langchain_community.document_loaders.pdf.AmazonTextractPDFLoader

How to Extract Data From PDFs Using AWS Textract With Python
Amazon Textract
langchain-pdf

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

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

相关文章

【深度学习实战(18)】torch模型转onnx模型,使用netron根据查看onnx结构

一、ONNX介绍 简单来说&#xff0c;可以把ONNX当做一个中间格式。绝大多数的机器学习/深度学习框架都可以将自身的模型转换成ONNX&#xff0c;同样也能把ONNX转换成自身框架的格式&#xff0c;如下图所示。 二、转ONNX模型代码 import torch import torchvision.models as …

利用selenium发挥vip残存的价值

历史版本谷歌浏览器驱动下载地址 https://chromedriver.storage.googleapis.com/index.html 找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51 我这里把 chromedriver 放到 /usr/local/bin 下面了。 启动测试窗口 这里需要…

[tkinter实现]汉字笔顺小软件

软件简介 本软件旨在帮助小学生通过互动式学习掌握汉字的基本笔画和笔顺。软件采用Tkinter库构建&#xff0c;提供了一个用户友好的图形界面&#xff0c;适合小学生使用。 主要功能&#xff1a; 汉字展示&#xff1a;软件能够展示单个汉字&#xff0c;并以动画形式演示其标准…

网络基础(day2)

一、进制转换 在计算机底层通信&#xff0c;以及数据处理都是采用二进制&#xff0c;也就是1和0传递信息&#xff0c;因此进制转换是非常重要的知识点。 十进制&#xff08;DEC&#xff09;【逢十进一 】案例&#xff1a; 按权展开 权&#xff1a;10的N次幂123123二进制&am…

羊大师分析,夏季羊奶的适合人群有哪些?

羊大师分析&#xff0c;夏季羊奶的适合人群有哪些&#xff1f; 夏季羊奶的适合人群相当广泛&#xff0c;主要包括以下几类人群&#xff1a; 生长发育中的孩子&#xff1a;羊奶富含营养&#xff0c;特别是蛋白质和矿物质&#xff0c;对孩子的生长发育有积极的促进作用。 中老年…

【HarmonyOS】Stage 模型 - 基本概念

一、项目结构 如图1所示&#xff1a; 图1 从项目结构来看&#xff0c;这个应用的内部包含了一个子模块叫 entry&#xff0c;模块是应用的基本功能单元&#xff0c;它里面包含源代码、资源、配置文件等。 像这样的模块在应用内部可以创建很多。但模块整体来讲就分成两大类&am…

Python 异常处理与日志记录

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 异常处理是任何编程语言中的重要组成部分&#xff0c;Python 也不例外。Python 提供了丰富的…

换脸插件升级导致SDWebUI无法启动cannot import name ‘Undefined‘ from ‘pydantic.fields‘

今天在一台新的机器环境装了SDWEBUI&#xff0c;都使用最新的版本&#xff0c;升级了下换脸的插件&#xff0c;于是乎启动崩溃了。错误如下 Launching Web UI with arguments: --listen --skip-torch-cuda-test --disable-nan-check --skip-version-check --skip-python-versi…

鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(三)多线程并发 Worker

Worker Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程&#xff0c;Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行&#xff0c;可以处理耗时操作但不可以直接操作UI。 Worker主要作用是为应用程序提供一个多线程的运行环境…

kanzi工程辅助解析

背景:实际开发过程中&#xff0c;使用kanzi studio工程&#xff0c;遇到一个很大的问题&#xff0c;就是在多工程&#xff0c;多预设件&#xff0c;复杂绑定算式情况下&#xff0c;很难梳理接口绑定情况&#xff0c;而且kanzi自带的查找很不好用。尤其是拿到一个新工程&#xf…

春季打卡圣地|超出片的成都文创产业园

春季拍照还在去人民公园、青龙湖吗&#xff1f;这个春天来点不一样的&#xff0c;就在金牛区的成都文创产业园——国际数字影像产业园旁&#xff0c;沙河源公园占地面积约150亩&#xff0c;地下室面积约4000平方米&#xff0c;这里的花能让摄影爱好者们拍个够。 国际数字影像产…

FFmpeg源码编译

msys2 依赖环境安装 依赖环境安装编译X264编译 fdk-aac文件处理编译x265编译FFmpeg 依赖环境安装 编译X264 用于h264 AVC视频格式编码 CCcl ./configure --enable-shared #指定使用cl,编译成动态链接库 make -j32 #使用32线程进行编码 make install命令一 关于第一条命令执…

攻击者使用新型隐写术攻击,针对全球320个组织

隐写术是一种将数据隐藏在看似无害的文件中的技术&#xff0c;使用户和安全产品无法检测到它们。 近期&#xff0c;Positive Technologies 发现了TA558 黑客组织正在开展的一项新活动&#xff0c;使用隐写术将恶意代码隐藏在图像内&#xff0c;从而将各种恶意软件工具传递到目…

展会媒体邀约资源,媒体宣传服务执行

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 在组织展会时&#xff0c;媒体宣传服务的执行是提升展会知名度和影响力的关键环节。 确定目标媒体&#xff1a;根据展会的主题和目标受众&#xff0c;选择适合的媒体进行邀请。这可能包…

docker 虚拟化与docker的概念

一、云计算的三种服务模式 laas、pass、saas 1.1 IaaS: Infrastructure-as-a-Service&#xff08;基础设施即服务&#xff09; 第一层叫做IaaS&#xff0c;有时候也叫做Hardware-as-a-Service&#xff0c;几年前如果你想在办公室或者公司的网站上运行一些企业应用&#xff0c…

将彩色图转化为灰度图及其原理介绍

彩色图介绍 彩色图像是一种包含颜色信息的图像&#xff0c;通常由红色、绿色和蓝色&#xff08;RGB&#xff09;三个颜色通道组成。这三种颜色通道可以叠加在一起来形成各种不同的颜色。 彩色图像中的每个像素都有三个数值&#xff0c;分别表示红色、绿色和蓝色通道的强度或亮…

vue 关键字变红

1.html <div v-html"replaceKeywordColor(item.title)" ></div> 2.js //value为搜索框内绑定的值 replaceKeywordColor(val) {if (val?.includes(this.value) && this.value ! ) {return val.replace(this.value,<font color"red&…

RuoYi-Vue-Plus (SaToken 注解鉴权)

一、SaInterceptor 注解鉴权和路由拦截鉴权 拦截器&#xff1a;SaInterceptor 实现类位置&#xff1a; cn.dev33.satoken.interceptor.SaInterceptor 功能&#xff1a;Sa-Token 综合拦截器&#xff0c;提供注解鉴权和路由拦截鉴权能力 /*** 创建一个 Sa-Token 综合拦截器&…

重学java 19.面向对象 继承 上

走不出的那段阴霾&#xff0c;很多时候只不过是&#xff0c;我们把它当成了唯一 —— 24.4.22 面向对象整体知识导向&#xff1a; 知识梳理&#xff1a; 1.知道继承的好处 2.会使用继承 3.继承之后成员变量和成员方法的访问特点 4.方法的重写&#xff0c;知道方法重写的使用场景…

从构成看自来水厂自动化控制系统的创新与发展

自来水厂自动化控制系统涵盖了多个关键组成部分&#xff0c;包括水管理云平台、供水监控系统以及供水调度平台。 系统内嵌了一系列自主创新的核心算法&#xff0c;这些算法结合了数学建模、机器仿真和流体力学等多元数据模型&#xff0c;以优化设备间的关联和控制关系&#xf…