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

embedded/2024/9/22 15:11:45/
# 读取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.ppmy.cn/embedded/13197.html

相关文章

探索Go语言中最强的ORM框架

GORM 是用于Golang的出色ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它以开发人员友好而闻名。它的主要目标是提供一个全功能的ORM工具&#xff0c;帮助开发者更加高效地处理关系型数据库。GORM是在Go语言的database/sql包的基础上发展起来的。下面我们详细介绍GOR…

软考-系统集成项目管理中级--合同管理

本章历年考题分值统计(16年11月及以后按新教材考的&#xff09; 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 8、合同签订管理(掌握)10下53&#xff0c;14上53&#xff0c;15上53 考题 签订合同的前期调查&#xff0c;每一项合同在签订之前&#xff0c;应当做好以下几…

码头船只出行及配套货柜码放管理系统-毕设

毕业设计说明书 码头船只出行及配套货柜码放 管理系统 码头船只出行及配套货柜码放管理系统 摘要 伴随着全球化的发展&#xff0c;码头的物流和客运增多&#xff0c;码头业务迎来新的高峰。然而码头业务的增加&#xff0c;导致了人员成本和工作量的增多。为了解决这一基本问题&…

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…

Linux命令超详细介绍

目录 安装 Linux的目录结构&#xff1a; Linux命令入门&#xff1a; Linux命令的基础格式&#xff1a; 例子&#xff1a; ls 参数 选项 注意&#xff1a; 目录切换命令&#xff1a;cd/pwd cd: pwd: 相对路径和绝对路径&#xff1a; mkdir 不用参数&#xff1a; …

电力调度自动化系统由什么构成?

电力调度自动化系统由什么构成&#xff1f; 电力调度自动化系统通过数据采集与传输、数据处理与存储、监视与控制、优化与决策、通信网络和系统应用软件等构成&#xff0c;实现对电力系统的监控、控制和优化。 电力调度自动化系统是一种集成了计算机技术、通信技术、自动化技术…

【LeetCode热题100】【多维动态规划】编辑距离

题目链接&#xff1a;72. 编辑距离 - 力扣&#xff08;LeetCode&#xff09; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 你可以插入、删除、替换字符 定义dp[i][j]是将word1[0:i-1]转换成word2[0:j-1]所使用的最少操作数 如…

QA测试开发工程师面试题满分问答21: 单元测试、集成测试、系统测试的侧重点是什么?

单元测试、集成测试和系统测试是软件测试中的不同层次和阶段&#xff0c;每个阶段侧重于不同的测试目标和范围。以下是它们的侧重点的简要说明&#xff1a; 单元测试&#xff1a; 单元测试是针对软件中最小的可测试单元&#xff08;通常是函数、方法或模块&#xff09;进行的测…