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

这篇具有很好参考价值的文章主要介绍了#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 data

def load_pdf_file_pypdf(content_path):
    from langchain_community.document_loaders import PyPDFLoader
    loader = 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 pages
    
def load_pdf_file_MathPix(content_path):
    from langchain_community.document_loaders import MathpixPDFLoader
    loader = MathpixPDFLoader(content_path)
    data = loader.load()
    for page in data:
        print('-------------------')
        print('content')
        print(page.page_content)
        print('metadata')
        print(page.metadata)
    return data

def load_pdf_file_unstructed(content_path):
    from langchain_community.document_loaders import UnstructuredPDFLoader
    loader = 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 data

def load_pdf_file_PyPDFium2(content_path):
    from langchain_community.document_loaders import PyPDFium2Loader
    loader = PyPDFium2Loader(content_path)
    data = loader.load()
    for page in data:
        print('-------------------')
        print('content')
        print(page.page_content)
        print('metadata')
        print(page.metadata)
    return data

def load_pdf_file_PDFMiner(content_path):
    from langchain_community.document_loaders import PDFMinerLoader
    loader = PDFMinerLoader(content_path)
    data = loader.load()
    for page in data:
        print(page.page_content)
        print(page.metadata)
    return data

def 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 PDFMinerPDFasHTMLLoader
    loader = PDFMinerPDFasHTMLLoader(content_path)
    data = loader.load()[0]   # entire PDF is loaded as a single Document
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(data.page_content,'html.parser')
    content = soup.find_all('div')
    import re
    cur_fs = None
    cur_text = ''
    snippets = []   # first collect all snippets that have the same font size
    for c in content:
        sp = c.find('span')
        if not sp:
            continue
        st = sp.get('style')
        if not st:
            continue
        fs = re.findall('font-size:(\d+)px',st)
        if not fs:
            continue
        fs = int(fs[0])
        if not cur_fs:
            cur_fs = fs
        if fs == cur_fs:
            cur_text += c.text
        else:
            snippets.append((cur_text,cur_fs))
            cur_fs = fs
            cur_text = c.text
    snippets.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 Document
    cur_idx = -1
    semantic_snippets = []
    # Assumption: headings have higher font size than their respective content
    for s in snippets:
        # if current snippet's font size > previous section's heading => it is a new heading
        if 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 += 1
            continue

        # 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 += 1
    return semantic_snippets


def load_pdf_file_PyPDFDirectory(content_path):
    from langchain_community.document_loaders import PyPDFDirectoryLoader
    loader = 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 AmazonTextractPDFLoader
    loader = 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文章来源地址https://www.toymoban.com/news/detail-856788.html

到了这里,关于#langchain | RAG |富文本一致性解析 | NLP # langchain支持的9种PDF内容提取方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找

    在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象。通过将经常使用的数据存储在缓存中,可以减少对数据库的频繁访问,从而提高系统的响应速度和性能。缓存可以将数据保存在内存中,读取速度更快,能够大大缩短数据访问的时间,提升用户

    2024年02月14日
    浏览(41)
  • C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性

    动态规划处理字符相关案例中,求 最长公共子序列 以及求 最短编辑距离 ,算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把,即便如此,还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握,唯有瞧出其中玄机,能有自己独有的见解和不一样

    2024年02月13日
    浏览(28)
  • 什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?

    如果你有 n 个缓存服务器,一个常见的负载均衡方式是使用以下的哈希方法: 服务器索引 = 哈希(键) % N ,其中 N 是服务器池的大小。 让我们通过一个例子来说明这是如何工作的。如表5-1所示,我们有4台服务器和8个字符串键及其哈希值。 为了获取存储某个键的服务器,我们

    2024年02月06日
    浏览(42)
  • 从kafka如何保证数据一致性看通常数据一致性设计

    在数据库系统中有个概念叫事务,事务的作用是为了保证数据的一致性,意思是要么数据成功,要么数据失败,不存在数据操作了一半的情况,这就是数据的一致性。在很多系统或者组件中,很多场景都需要保证数据的一致性,有的是高度的一致性。特别是在交易系统等这样

    2024年02月19日
    浏览(36)
  • 分布式系统的一致性级别划分及Zookeeper一致性级别分析

    在谈到Zookeeper的一致性是哪种级别的一致性问题,以及CAP原则中的C是哪一种一致性级别时有些疑惑。 下面是大多数文章中提到的一致性级别 一致性(Consistency)是指多副本(Replications)问题中的数据一致性。可以分为强一致性、顺序一致性与弱一致性。 1.1 强一致性(Stric

    2024年04月12日
    浏览(45)
  • 深入理解高并发下的MySQL与Redis缓存一致性问题(增删改查数据缓存的一致性、Canal、分布式系统CAP定理、BASE理论、强、弱一致性、顺序、线性、因果、最终一致性)

    一些小型项目,或极少有并发的项目,这些策略在无并发情况下,不会有什么问题。 读数据策略:有缓存则读缓存,然后接口返回。没有缓存,查询出数据,载入缓存,然后接口返回。 写数据策略:数据发生了变动,先删除缓存,再更新数据,等下次读取的时候载入缓存,

    2024年03月20日
    浏览(40)
  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(43)
  • Redis 数据一致性

    当我们在使用缓存时,如果发生数据变更,那么你需要同时操作缓存和数据库,而它们两个又分属不同的系统,因此无法做到同时操作成功或失败,因此在并发读写下很可能出现缓存与数据库数据不一致的情况 理论上可以通过分布式事务保证同时操作成功或失败,但这会影响

    2024年02月03日
    浏览(40)
  • 如何保持数据一致性

    数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 以下是我无意间了解很好的文章,分享给大家。 通常情况下,我们使用缓存的主要目的是为了提升查询的性能。大多数情况下,我们是这

    2024年02月08日
    浏览(43)
  • 一致性协议浅析

    Paxos 发明者是大名鼎鼎的 Lesile Lamport。Lamport 虚拟了一个叫做 Paxos 的希腊城邦,城邦按照议会民主制的政治模式制定法律。在 Lesile Lamport 的论文中,提出了 Basic Paxos、Multi Paxos、Fast Paxos 三种模型。 Client :系统外部角色,请求发起者,类比于民众。 Proposer :接收 Client 请求,

    2024年01月18日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包