LangChain - 文档加载

文章目录

    • 一、关于 检索
    • 二、文档加载器
      • 入门指南
    • 三、CSV
      • 1、使用每个文档一行的 CSV 数据加载 CSVLoader
      • 2、自定义 csv 解析和加载 (csv_args
      • 3、指定用于 标识文档来源的 列(source_column
    • 四、文件目录 file_directory
      • 1、加载文件目录数据(DirectoryLoader
      • 2、显示进度条 (tqdm,show_progress
      • 3、使用多线程 (use_multithreading
      • 4、更改加载器类(loader_cls
      • 5、使用 TextLoader 自动检测文件编码
        • A. 默认行为
        • B. 静默失败 (silent_errors
        • C. 自动检测编码 (loader_kwargs, autodetect_encoding
    • 五、HTML
      • 1、加载 html (UnstructuredHTMLLoader
      • 2、使用 BeautifulSoup4 加载 HTML (BSHTMLLoader
    • 六、JSON
      • 1、使用 json 加载数据
      • 2、使用 JSONLoader
      • 3、提取元数据 (Extracting metadata)
      • 4、`metadata_func`
      • 5、jq schema 中常见的 JSON 结构
    • 七、Markdown ( UnstructuredMarkdownLoader
      • 保留元素(Retain Elements)
    • 八、PDF
      • 1、使用 PyPDF
      • 2、使用 MathPix
      • 3、Using Unstructured
      • 4、保留元素 (Retain Elements)
      • 5、使用 Unstructured 获取远程 PDF
      • 6、使用 PyPDFium2
      • 7、使用 PDFMiner
        • 使用 PDFMiner 生成 HTML 文本
      • 8、使用 PyMuPDF
      • 9、PyPDF 目录
      • 10、使用 pdfplumber


一、关于 检索

许多LLM应用程序需要用户特定数据,这些数据不是模型的训练集的一部分。
完成这一任务的主要方法是通过检索增强生成(RAG)。
在此过程中,检索外部数据,然后在生成步骤中将其传递给LLM。

LangChain为RAG应用程序提供了所有的构建模块 - 从简单到复杂。
本文档部分涵盖了与检索步骤相关的所有内容,例如数据的获取。
虽然听起来很简单,但可能有微妙的复杂性. 这涵盖了几个关键模块。


在这里插入图片描述


1、文档加载器

从许多不同来源加载文档. LangChain提供了100多种不同的文档加载器,并与空间中的其他主要提供商(如AirByte和Unstructured)集成。
我们提供了加载各种类型文档(HTML、PDF、代码)的集成,从各种位置(私人S3存储桶、公共网站)加载。


2、文档转换器

检索的一个关键部分是仅获取文档的相关部分,为了最好地准备文档以进行检索,这涉及几个转换步骤,其中一个主要步骤是 将大型文档分割(或分块)为较小的块
LangChain提供了几种不同的算法来完成此操作,以及针对特定文档类型(代码、markdown等)进行优化的逻辑.


3、文本嵌入模型

检索的另一个关键部分是 为文档创建嵌入。
嵌入捕捉文本的语义含义,使您能够 快速高效地查找其他相似的文本。
LangChain与25多个不同的嵌入提供商和方法进行集成, 从开源到专有API, 使您能够选择最适合您需求的一种。
LangChain提供了标准接口,使您可以轻松切换模型。


4、向量存储

随着嵌入的兴起,出现了对支持这些嵌入的数据库的需求。
LangChain与50多个不同的向量存储进行集成,从开源本地存储到云托管专有存储, 使您能够选择最适合您需求的一种。
LangChain公开了标准接口,使您可以轻松切换向量存储。


5、检索器

一旦数据在数据库中,您仍然需要检索它。
LangChain支持许多不同的检索算法,并且是我们增加最多价值的地方之一。
我们支持 易于入门的基本方法 - 即简单的语义搜索。
但是,我们还添加了一系列算法以提高性能,这些算法包括:

  • 父文档检索器: 允许您为每个父文档 创建 多个嵌入,允许您查找较小的块 但返回较大的上下文。
  • 自查询检索器: 用户的问题通常包含 对不仅仅是语义的东西的引用,而是表达一些 最好用元数据过滤器 表示的逻辑。
    自查询允许您从查询中解析出语义 部分和查询中存在的其他元数据过滤器
  • 集合检索器: 有时您可能希望 从 多个不同的来源 或 使用多个不同的算法 检索文档。
    集合检索器使您可以轻松实现此目的。


二、文档加载器

前往Integrations 以获取与第三方工具 集成的内置文档 加载器 的文档。

使用文档加载器从源加载数据作为Document
Document是一段文本和相关元数据。
例如,有用于加载简单的.txt文件的文档加载器,用于加载任何网页的文本内容,甚至用于加载YouTube视频的转录稿。

文档加载器提供了一个“load”方法,用于从配置的源加载数据作为文档。
它们还可以选择实现“延迟加载”,以便将数据惰性加载到内存中。


入门指南

最简单的加载器将文件作为文本读入,并将其全部放入一个文档中。

from langchain.document_loaders import TextLoaderloader = TextLoader("./index.md")
loader.load()

[Document(page_content='---\nsidebar_position: 0\n---\n# Document loaders\n\nUse document loaders to load data from a source as `Document`\'s. ... They optionally implement:\n\n3. "Lazy load": load documents into memory lazily\n', metadata={'source': '../docs/docs_skeleton/docs/modules/data_connection/document_loaders/index.md'})
]


三、CSV

逗号分隔值(CSV) 文件是一种使用逗号分隔值的定界文本文件。
文件的每一行是一个数据记录;每个记录由一个或多个字段组成,字段之间用逗号分隔。


1、使用每个文档一行的 CSV 数据加载 CSVLoader

from langchain.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data = loader.load()

data

    [Document(page_content='Team: Nationals\n"Payroll (millions)": 81.34\n"Wins": 98', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 0}, lookup_index=0), ...Document(page_content='Team: Astros\n"Payroll (millions)": 60.65\n"Wins": 55', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 29}, lookup_index=0)]

2、自定义 csv 解析和加载 (csv_args

参见 csv 模块 文档,了解支持的 csv 参数的更多信息。

loader = CSVLoader(file_path='./mlb_teams_2012.csv', csv_args={'delimiter': ',','quotechar': '"','fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']})data = loader.load()

data

    [Document(page_content='MLB Team: Team\nPayroll in millions: "Payroll (millions)"\nWins: "Wins"', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 0}, lookup_index=0), ...Document(page_content='MLB Team: Astros\nPayroll in millions: 60.65\nWins: 55', lookup_str='', metadata={'source': './example_data/mlb_teams_2012.csv', 'row': 30}, lookup_index=0)]

3、指定用于 标识文档来源的 列(source_column

使用 source_column 参数指定从每一行创建的文档的来源。
否则,file_path 将作为从 CSV 文件创建的所有文档的来源。

在使用基于来源回答问题的链时,这非常有用。

loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv',source_column="Team")data = loader.load()

data :

    [Document(page_content='Team: Nationals\n"Payroll (millions)": 81.34\n"Wins": 98', lookup_str='', metadata={'source': 'Nationals', 'row': 0}, lookup_index=0), ...Document(page_content='Team: Astros\n"Payroll (millions)": 60.65\n"Wins": 55', lookup_str='', metadata={'source': 'Astros', 'row': 29}, lookup_index=0)]

四、文件目录 file_directory

这里介绍了如何加载目录中的所有文档。

在底层,默认情况下使用 UnstructuredLoader

我们可以使用 glob 参数来控制要加载的文件。

请注意,这里不加载 .rst 文件或 .html文件。


1、加载文件目录数据(DirectoryLoader

from langchain.document_loaders import DirectoryLoader
loader = DirectoryLoader('../', glob="**/*.md")
docs = loader.load()
len(docs) # -> 1

2、显示进度条 (tqdm,show_progress

默认情况下,不会显示进度条。
要显示进度条,请安装 tqdm 库(如 pip install tqdm),并将 show_progress 参数设置为 True

loader = DirectoryLoader('../', glob="**/*.md", show_progress=True)
docs = loader.load()

    Requirement already satisfied: tqdm in /Users/jon/.pyenv/versions/3.9.16/envs/microbiome-app/lib/python3.9/site-packages (4.65.0)0it [00:00, ?it/s]

3、使用多线程 (use_multithreading

默认情况下,加载操作在 一个线程 中进行。
为了利用多个线程,将 use_multithreading标志设置为 True。

loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
docs = loader.load() 

4、更改加载器类(loader_cls

默认情况下使用 UnstructuredLoader 类。但是,您可以相当容易地 更改加载器的类型。

from langchain.document_loaders import TextLoaderloader = DirectoryLoader('../', glob="**/*.md", loader_cls=TextLoader)docs = loader.load()
len(docs)
# -> 1

如果需要加载 Python 源代码文件,请使用 PythonLoader

from langchain.document_loaders import PythonLoader
loader = DirectoryLoader('../../../../../', glob="**/*.py", loader_cls=PythonLoader)docs = loader.load()
len(docs)
# ->  691

5、使用 TextLoader 自动检测文件编码

在这个示例中,我们将看到一些在使用 TextLoader 类从目录加载一系列任意文件时可能有用的策略。

首先为了说明问题,让我们尝试加载多个具有任意编码的文本。

path = '../../../../../tests/integration_tests/examples'
loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader)

A. 默认行为
loader.load()

<pre style="white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><span style="color: #800000; text-decoration-color: #800000">╭─────────────────────────────── </span><span style="color: #800000; text-decoration-color: #800000; font-weight: bold">Traceback </span><span style="color: #bf7f7f; text-decoration-color: #bf7f7f; font-weight: bold">(most recent call last)</span><span style="color: #800000; text-decoration-color: #800000"> ────────────────────────────────╮</span>
<span style="color: #800000; text-decoration-color: #800000"></span>  ...
<span style="color: #800000; text-decoration-color: #800000">╰──────────────────────────────────────────────────────────────────────────────────────────────────╯</span>
<span style="color: #ff0000; text-decoration-color: #ff0000; font-weight: bold">RuntimeError: </span>Error loading ..<span style="color: #800080; text-decoration-color: #800080">/../../../../tests/integration_tests/examples/</span><span style="color: #ff00ff; text-decoration-color: #ff00ff">example-non-utf8.txt</span>
</pre>

文件 example-non-utf8.txt 使用了不同的编码,load() 函数会失败,并显示一条有用的消息指示哪个文件解码失败。

使用 TextLoader 的默认行为,任何一个文档加载失败,整个加载过程都将失败,并且不会加载任何文档。


B. 静默失败 (silent_errors

我们可以将参数 silent_errors 传递给 DirectoryLoader,以跳过 无法加载的文件 并继续加载过程。

loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, silent_errors=True)
docs = loader.load()

    Error loading ../../../../../tests/integration_tests/examples/example-non-utf8.txt

doc_sources = [doc.metadata['source']  for doc in docs]
doc_sources

    ['../../../../../tests/integration_tests/examples/whatsapp_chat.txt','../../../../../tests/integration_tests/examples/example-utf8.txt']

C. 自动检测编码 (loader_kwargs, autodetect_encoding

我们也可以 在失败前,使用 TextLoader 来自动检测文件编码。
传递 autodetect_encoding 来加载这个类。

text_loader_kwargs={'autodetect_encoding': True}loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)docs = loader.load()
doc_sources = [doc.metadata['source']  for doc in docs]

doc_sources :

    ['../../../../../tests/integration_tests/examples/example-non-utf8.txt','../../../../../tests/integration_tests/examples/whatsapp_chat.txt','../../../../../tests/integration_tests/examples/example-utf8.txt']

五、HTML

超文本标记语言或 HTML 是用于在 Web 浏览器中显示的文档的标准标记语言。


1、加载 html (UnstructuredHTMLLoader

这部分介绍如何将 HTML 文档加载到 我们可以在下游使用的文档格式中。

from langchain.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader("example_data/fake-content.html")
data = loader.load()

data :

    [Document(page_content='My First Heading\n\nMy first paragraph.', lookup_str='', metadata={'source': 'example_data/fake-content.html'}, lookup_index=0)]

2、使用 BeautifulSoup4 加载 HTML (BSHTMLLoader

我们还可以使用 BeautifulSoup4 使用 BSHTMLLoader 加载 HTML 文档。
这将提取 HTML 中的文本到 page_content,并将页面标题作为 metadatatitle

from langchain.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("example_data/fake-content.html")
data = loader.load()

data :

    [Document(page_content='\n\nTest Title\n\n\nMy First Heading\nMy first paragraph.\n\n\n', metadata={'source': 'example_data/fake-content.html', 'title': 'Test Title'})]

六、JSON

JSON (JavaScript Object Notation) 是一种开放标准的文件格式和数据交换格式,存储和传输方便,且可读。

JSON 对象由属性 key - 值 value 对和数组(或其他可序列化值)组成的数据对象。


1、使用 json 加载数据


import json
from pathlib import Path
from pprint import pprintfrom langchain.document_loaders import JSONLoaderfile_path='./facebook_chat.json'
data = json.loads(Path(file_path).read_text())

data :

    {'image': {'creation_timestamp': 1675549016, 'uri': 'image_of_the_chat.jpg'},'is_still_participant': True,'joinable_mode': {'link': '', 'mode': 1},'magic_words': [],'messages': [{'content': 'Bye!','sender_name': 'User 2','timestamp_ms': 1675597571851},...{'content': 'Hi! Im interested in your bag. Im offering $50. Let me know if you are interested. Thanks!','sender_name': 'User 1','timestamp_ms': 1675549022673}],'participants': [{'name': 'User 1'}, {'name': 'User 2'}],'thread_path': 'inbox/User 1 and User 2 chat','title': 'User 1 and User 2 chat'}

2、使用 JSONLoader

JSONLoader 使用指定的 jq schema 来解析 JSON 文件。

它使用 jq python 包。 查看这个 手册 来详细了解 jq 语法。

pip install jq

假设我们有兴趣提取 JSON 数据中 messages 键下的 content 字段的值。
通过以下示例可以轻松完成这项工作。

loader = JSONLoader(file_path='./facebook_chat.json',jq_schema='.messages[].content')data = loader.load()

data :

    [Document(page_content='Bye!', metadata={'source': '/Users/xx/facebook_chat.json', 'seq_num': 1}),...Document(page_content='Hi! Thanks!', metadata={'source': '/Users/xx/facebook_chat.json', 'seq_num': 11})]

3、提取元数据 (Extracting metadata)

通常,我们希望将 JSON 文件中的元数据包含到从内容创建的文档中。

下面演示了如何使用 JSONLoader 提取元数据。

需要注意一些关键的更改。在前一个示例中,我们没有收集元数据,在模式中直接指定了 page_content 的值的提取位置。

.messages[].content

在当前示例中,我们必须告诉加载器迭代 messages 字段中的记录。
因此,jq_schema 必须是以下形式:

.messages[]

这样我们就可以将记录(字典)传递给必须实现的 metadata_func
metadata_func负责确定哪些记录中的信息应该 包含在最终 Document 对象中的元数据中。

此外,现在我们必须通过加载器 显式指定 content_key 参数,用于从记录中提取 page_content 的值的键。

def metadata_func(record: dict, metadata: dict) -> dict:metadata["sender_name"] = record.get("sender_name")metadata["timestamp_ms"] = record.get("timestamp_ms")return metadataloader = JSONLoader(file_path='./example_data/facebook_chat.json',jq_schema='.messages[]',content_key="content",metadata_func=metadata_func
)data = loader.load()

data :

    [Document(page_content='Bye!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1, 'sender_name': 'User 2', 'timestamp_ms': 1675597571851}),...Document(page_content='Hi! Im interested in your bag. Im offering $50. Let me know if you are interested. Thanks!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 11, 'sender_name': 'User 1', 'timestamp_ms': 1675549022673})]

现在,您将看到文档包含与我们提取的内容相关联的元数据。


4、metadata_func

如上所示,metadata_func 接受 JSONLoader 生成的默认元数据。这允许用户完全控制元数据的格式。

例如,默认元数据包含 sourceseq_num 键。
然而,JSON 数据中可能也包含这些键。
用户可以利用 metadata_func 重命名默认键 并使用 JSON 数据中的键。


下面的示例展示了如何修改 source,只包含与 langchain 目录相关的文件来源信息。

Define the metadata extraction function.
def metadata_func(record: dict, metadata: dict) -> dict:metadata["sender_name"] = record.get("sender_name")metadata["timestamp_ms"] = record.get("timestamp_ms")if "source" in metadata:source = metadata["source"].split("/")source = source[source.index("langchain"):]metadata["source"] = "/".join(source)return metadataloader = JSONLoader(file_path='./example_data/facebook_chat.json',jq_schema='.messages[]',content_key="content",metadata_func=metadata_func
)data = loader.load()

data :

    [Document(page_content='Bye!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1, 'sender_name': 'User 2', 'timestamp_ms': 1675597571851}),...Document(page_content='Hi! Im interested in your bag. Im offering $50. Let me know if you are interested. Thanks!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 11, 'sender_name': 'User 1', 'timestamp_ms': 1675549022673})]

5、jq schema 中常见的 JSON 结构

下面的列表提供了 用户可以根据结构 从 JSON 数据中 提取内容时 使用的可能的 jq_schema 的参考。

JSON        -> [{"text": ...}, {"text": ...}, {"text": ...}]
jq_schema   -> ".[].text"JSON        -> {"key": [{"text": ...}, {"text": ...}, {"text": ...}]}
jq_schema   -> ".key[].text"JSON        -> ["...", "...", "..."]
jq_schema   -> ".[]"

七、Markdown ( UnstructuredMarkdownLoader

Markdown 是一种轻量级标记语言,用于使用纯文本编辑器创建格式化文本。

这部分内容介绍了如何将 Markdown 文档 加载到我们可以在应用程序中 要使用的文档格式中。

! pip install unstructured > /dev/null

from langchain.document_loaders import UnstructuredMarkdownLoader
markdown_path = "../../../../../README.md"
loader = UnstructuredMarkdownLoader(markdown_path)
data = loader.load()

data :

    [Document(page_content=\x9f¦\x9cï¸\x8fð\x9f\x97 LangChain\n\nâ\x9a¡ Building applications with LLMs through composability â\x9a¡\n\nLooking for the JS/TS version? Check out LangChain.js.\n\nProduction Support: As you move your LangChains into production, we'd love to offer more comprehensive support....Evaluation:\n\n[BETA] Generative models are notoriously hard to evaluate with traditional metrics.  ... For detailed information on how to contribute, see here.", metadata={'source': '../../../../../README.md'})]

保留元素(Retain Elements)

在底层,Unstructured 为不同的文本块创建不同的“元素”。
默认情况下,我们将它们组合在一起,但通过指定 mode="elements" 可以轻松保留该分离。

loader = UnstructuredMarkdownLoader(markdown_path, mode="elements")
data = loader.load()

data[0]

    Document(page_content='ð\x9f¦\x9cï¸\x8fð\x9f”\x97 LangChain', metadata={'source': '../../../../../README.md', 'page_number': 1, 'category': 'Title'})

八、PDF

便携式文档格式(PDF),标准化为 ISO 32000,是 Adobe 于 1992 年开发的一种文件格式,用于以与应用软件、硬件和操作系统无关的方式呈现文档,包括文本格式和图像。

这涵盖了如何将 PDF 文档加载到 我们在下游使用的 Document 格式中。


1、使用 PyPDF

使用 pypdf 将 PDF 加载到文档数组中,其中每个文档包含页面内容和元数据,以及 page 号码。

pip install pypdf

from langchain.document_loaders import PyPDFLoaderloader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()

pages[0]

    Document(page_content='LayoutParser : A Uni\x0ced Toolkit for Deep\nLearning Based Document Image Analysis...Introduction\nDeep Learning(DL)-based approaches are the state-of-the-art for a wide range of\ndocument image analysis (DIA) tasks including document image classi\x0ccation [ 11,arXiv:2103.15348v2  [cs.CV]  21 Jun 2021', metadata={'source': 'example_data/layout-parser-paper.pdf', 'page': 0})

这种方法的优点是可以通过页面号码检索文档。

我们想使用 OpenAIEmbeddings,所以我们需要获取 OpenAI API 密钥。

import os
import getpassos.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')

from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddingsfaiss_index = FAISS.from_documents(pages, OpenAIEmbeddings())
docs = faiss_index.similarity_search("How will the community be engaged?", k=2)for doc in docs:print(str(doc.metadata["page"]) + ":", doc.page_content[:300])

    9: 10 Z. Shen et al.Fig. 4: Illustration of (a) the original historical Japanese document with layoutdetection results and (b) a recreated version of the document image that achievesmuch better character recognition recall. The reorganization algorithm rearrangesthe tokens based on the their detect3: 4 Z. Shen et al.Efficient Data AnnotationC u s t o m i z e d  M o d e l  T r a i n i n gModel Cust omizationDI A Model HubDI A Pipeline SharingCommunity PlatformLa y out Detection ModelsDocument Images T h e  C o r e  L a y o u t P a r s e r  L i b r a r yOCR ModuleSt or age & VisualizationLa y ou

2、使用 MathPix

受 Daniel Gross 的 https://gist.github.com/danielgross/3ab4104e14faccc12b49200843adab21 的启发

from langchain.document_loaders import MathpixPDFLoader 
loader = MathpixPDFLoader("example_data/layout-parser-paper.pdf")
data = loader.load()

3、Using Unstructured

from langchain.document_loaders import UnstructuredPDFLoader
loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf")
data = loader.load()

4、保留元素 (Retain Elements)

在内部,Unstructured 为不同的文本块创建不同的 “元素”。默认情况下,我们将它们组合在一起,但您可以通过指定 mode="elements" 轻松保持分离。

loader = UnstructuredPDFLoader("example_data/layout-parser-paper.pdf", mode="elements")
data = loader.load()

data[0]

    Document(page_content='LayoutParser: A Unified Toolkit for Deep\nLearning Based Document Image Analysis...Introduction\nDeep Learning(DL)-based approaches are the state-of-the-art for a wide range of\ndocument image analysis (DIA) tasks including document image classification [11,\narXiv:2103.15348v2  [cs.CV]  21 Jun 2021\n', lookup_str='', metadata={'file_path': 'example_data/layout-parser-paper.pdf', 'page_number': 1, 'total_pages': 16, 'format': 'PDF 1.5', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'creator': 'LaTeX with hyperref', 'producer': 'pdfTeX-1.40.21', 'creationDate': 'D:20210622012710Z', 'modDate': 'D:20210622012710Z', 'trapped': '', 'encryption': None}, lookup_index=0)

5、使用 Unstructured 获取远程 PDF

这涵盖了 如何将在线 PDF 加载到 我们可以在 下游使用的文档格式中。
这可用于各种在线 PDF 网站,如 https://open.umn.edu/opentextbooks/textbooks/ 和https://arxiv.org/archive/

注意:所有其他 PDF 加载器也可用于获取远程 PDF,但 OnlinePDFLoader 是一个旧版本函数,专门与 UnstructuredPDFLoader 配合使用。

from langchain.document_loaders import OnlinePDFLoader
loader = OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")
data = loader.load()

data

    [Document(page_content='A WEAK ( k, k ) -LEFSCHETZ THEOREM FOR PROJECTIVE TORIC ORBIFOLDS\n\nWilliam D. Montoya\n\nInstituto de Matem´atica, Estat´ıstica e Computa¸c˜ao Cient´ıfica,...Cohomology of complete intersections in toric varieties. Pub-', lookup_str='', metadata={'source': '/var/folders/ph/hhm7_zyx4l13k3v8z02dwp1w0000gn/T/tmpgq0ckaja/online_file.pdf'}, lookup_index=0)]

6、使用 PyPDFium2

from langchain.document_loaders import PyPDFium2Loaderloader = PyPDFium2Loader("example_data/layout-parser-paper.pdf")data = loader.load()

7、使用 PDFMiner

from langchain.document_loaders import PDFMinerLoaderloader = PDFMinerLoader("example_data/layout-parser-paper.pdf")data = loader.load()

使用 PDFMiner 生成 HTML 文本

这对于将文本语义分块到部分中非常有用,因为输出的 HTML 内容可以通过 BeautifulSoup 解析,以获取有关字体大小、页码、PDF 标题/页脚等更结构化和丰富的信息。

from langchain.document_loaders import PDFMinerPDFasHTMLLoaderloader = PDFMinerPDFasHTMLLoader("example_data/layout-parser-paper.pdf")data = loader.load()[0]   # entire pdf is loaded as a single Document

from bs4 import BeautifulSoupsoup = BeautifulSoup(data.page_content,'html.parser')content = soup.find_all('div')

import recur_fs = None
cur_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 duplicatess safe to assume that it is redundant info)

from langchain.docstore.document import Documentcur_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 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 tha 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

semantic_snippets[4]

    Document(page_content='Recently, various DL models and datasets have been developed for layout analysis\ntasks. ...A spectrum of models\ntrained on these datasets are currently available in the LayoutParser model zoo\nto support different use cases.\n', metadata={'heading': '2 Related Work\n', 'content_font': 9, 'heading_font': 11, 'source': 'example_data/layout-parser-paper.pdf'})

8、使用 PyMuPDF

这是 PDF 解析选项中最快的,并且包含有关 PDF 及其页面的详细元数据,以及每个页面返回一个文档。

from langchain.document_loaders import PyMuPDFLoaderloader = PyMuPDFLoader("example_data/layout-parser-paper.pdf")data = loader.load()

data[0]

    Document(page_content='LayoutParser: A Unified Toolkit for Deep\nLearning Based Document Image Analysis...Open Source library · Toolkit.\n1\nIntroduction\nDeep Learning(DL)-based approaches are the state-of-the-art for a wide range of\ndocument image analysis (DIA) tasks including document image classification [11,\narXiv:2103.15348v2  [cs.CV]  21 Jun 2021\n', lookup_str='', metadata={'file_path': 'example_data/layout-parser-paper.pdf', 'page_number': 1, 'total_pages': 16, 'format': 'PDF 1.5', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'creator': 'LaTeX with hyperref', 'producer': 'pdfTeX-1.40.21', 'creationDate': 'D:20210622012710Z', 'modDate': 'D:20210622012710Z', 'trapped': '', 'encryption': None}, lookup_index=0)

此外,您可以将 PyMuPDF 文档 中的任何选项作为关键字参数传递给 load 调用,并将其传递给 get_text() 调用。


9、PyPDF 目录

从目录加载 PDF

from langchain.document_loaders import PyPDFDirectoryLoaderloader = PyPDFDirectoryLoader("example_data/")docs = loader.load()

10、使用 pdfplumber

与 PyMuPDF 类似,输出的文档包含有关 PDF 及其页面的详细元数据,并且每个页面返回一个文档。

from langchain.document_loaders import PDFPlumberLoaderloader = PDFPlumberLoader("example_data/layout-parser-paper.pdf")data = loader.load()

data[0]

    Document(page_content='LayoutParser: A Unified Toolkit for Deep\nLearning Based Document Image Analysis\nZejiang Shen1 ((cid:0)), Ruochen Zhang2, Melissa Dell3, Benjamin Charles Germain\nLee4, Jacob Carlson3, and Weining Li5\n1 Allen Institute for AI...of\ndocumentimageanalysis(DIA)tasksincludingdocumentimageclassification[11,', metadata={'source': 'example_data/layout-parser-paper.pdf', 'file_path': 'example_data/layout-parser-paper.pdf', 'page': 1, 'total_pages': 16, 'Author': '', 'CreationDate': 'D:20210622012710Z', 'Creator': 'LaTeX with hyperref', 'Keywords': '', 'ModDate': 'D:20210622012710Z', 'PTEX.Fullbanner': 'This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) kpathsea version 6.3.2', 'Producer': 'pdfTeX-1.40.21', 'Subject': '', 'Title': '', 'Trapped': 'False'})

2024-04-08(一)

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

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

相关文章

day05-java面向对象(上)

5.1 面向对象编程 5.1.1 类和对象 1、什么是类 类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。 属性&#xff1a;就是该事物的状态信息。 行为&#xff1a;就是在你这个程序中&#xff0c;该状态信息要做什么操作&#xff0c;或者基于事物…

Go操作Kafka之kafka-go

Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;本文介绍了如何使用kafka-go这个库实现Go语言与kafka的交互。 Go社区中目前有三个比较常用的kafka客户端库 , 它们各有特点。 首先是IBM/sarama&#xff08;这个库已经由Shopify转给了IBM&#xff09;&#xff0c;之…

Triton Server Python 后端优化

接上文 不使用 Docker 构建 Triton 服务器并在 Google Colab 平台上部署 HuggingFace 模型 MultiGPU && Multi Instance Config 追加 instance_group [{count: 4kind: KIND_GPUgpus: [ 0, 1 ]} ]Python Backend Triton 会根据配置信息启动四个实例&#xff0c;…

物联网数据服务平台

随着物联网技术的迅猛发展&#xff0c;海量数据的产生和应用成为推动工业数字化转型的核心动力。在这个数据为王的时代&#xff0c;如何高效地收集、处理、分析并应用这些数据&#xff0c;成为了企业关注的焦点。物联网数据服务平台应运而生&#xff0c;为企业提供了全面、高效…

CLR学习

视频链接&#xff1a;《CLR十分钟》系列之CLR运行模型_哔哩哔哩_bilibili 什么是 CLR 公共语言运行时&#xff08;Common Language Runtime CLR&#xff09; 是一个可有多种编程语言使用的 运行时&#xff0c;CLR 的核心功能&#xff08;比如 内存管理&#xff0c;程序集加载…

耐受强酸碱PFA试剂瓶高纯实验级进口聚四氟乙烯材质取样瓶

PFA取样瓶作为实验室中常备器皿耗材之一&#xff0c;主要用来盛放、储存和运输样品&#xff0c;根据使用条件不同&#xff0c;也可叫特氟龙试剂瓶、样品瓶、储样瓶、广口瓶、进样瓶等。广泛应用于半导体、新材料、多晶硅、硅材、微电子等行业。近年来随着新兴行业的快速发展&am…

【ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…

某想主站的短信轰炸漏洞

很难想象主站居然还有这漏洞 某天的一个晚上&#xff0c;默默的打开了电脑&#xff0c;娴熟的打开了Burp suite, 看到一个很熟悉的注册登录页面&#xff0c;开始测试。 很难想象&#xff0c;还有验证码时效性&#xff0c;于是怼了半刻钟&#xff0c;终于让我逮到了他的数据包…

TechTool Pro for Mac v19.0.3中文激活版 硬件监测和系统维护工具

TechTool Pro for Mac是一款专为Mac用户设计的强大系统维护和故障排除工具。它凭借全面的功能、高效的性能以及友好的操作界面&#xff0c;赢得了广大用户的信赖和好评。 软件下载&#xff1a;TechTool Pro for Mac v19.0.3中文激活版 作为一款专业的磁盘和系统维护工具&#x…

IDEA 设置类注释模板作者、日期、描述等信息(推荐标准!)

idea注释模版配置 idea作为越来越多程序员使用的开发工具&#xff0c;平时的代码注释也非常的关键&#xff0c;类上注释和方法上注释每次换电脑或者新同事入职都要统一修改&#xff0c;找了网上好多教程都写的乱七八糟的啥都有&#xff0c;为方便统一就自己写一个操作方法&…

制氧机生产厂家如何确保氧气管道安全高效

制氧机作为生产氧气的关键设备&#xff0c;其安全性与高效性受到了广泛关注。作为制氧机生产厂家&#xff0c;确保氧气管道的安全高效运行&#xff0c;不仅是责任所在&#xff0c;更是对用户生命财产安全的有力保障。那么&#xff0c;制氧机生产厂家如何确保氧气管道安全高效生…

期货量化交易软件:MQL5 中的范畴论 (第 15 部分)函子与图论

概述 在上一篇文章中&#xff0c;我们目睹了前期文章中涵盖的概念&#xff08;如线性序&#xff09;如何视作范畴&#xff0c;以及为什么它们的“态射”在与其它范畴相关时即构成函子。在本文中&#xff0c;我们赫兹量化软件将阐述来自前期文章中的概括&#xff0c;即通过查看…

浙大恩特客户资源管理系统 i0004_openFileByStream.jsp 任意文件读取漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 i0004_openFileByStream.jsp接口处存在任意文件读取漏洞,未经身份验证攻…

数字证书在网络安全中的关键作用与日常应用

在当今数字化的时代&#xff0c;网络安全问题日益凸显&#xff0c;保护数据安全和用户隐私成为了人们关注的焦点。数字证书作为一种重要的网络安全技术&#xff0c;其在网络安全中扮演着关键的角色&#xff0c;并且在我们的日常生活中有着广泛的应用。现在给大家介绍简单介绍下…

在抖音做“奸商”!虽说不光彩,但能“发大财”!

打工人都知道的一句话&#xff1a;“做老板的都是周扒皮&#xff01;公司最赚钱的就是老板” 虽然手底下的员工都在骂老板压榨员工&#xff0c;但如果有一个让员工当老板的机会&#xff0c;我相信没有人会选择继续当牛做马 今天我就来给大家介绍一个&#xff1a;我正在做的“…

Flask快速搭建文件上传服务与接口

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求背景 前端通过浏览器&#xff0c;访问后端服务器地址&#xff0c;将目标文件进行上传。 访问地址&#xff1a;http://127.0.0…

ChromeOS 中自启动 Fcitx5 和托盘 stalonetray

ChromeOS 更新的飞快&#xff0c;旧文章的方法也老是不好用&#xff0c;找遍了也没找到很好的可以开机自启动 Linux VM 和输入法、托盘的方法。 研究了一下&#xff08;不&#xff0c;是很久&#xff09;&#xff0c;终于找到个丑陋的实现。 方法基于 ChromeOS 123.0.6312.94…

淄博、哈尔滨、天水…社交媒体助推下的网红城市能“长红”吗?

烧烤卷饼带火山东传统工业小镇淄博&#xff1b; 冰雪狂欢让东北的哈尔滨在寒冬爆火&#xff1b; 一碗麻辣烫让西北天水小城变“网红”…… 在刚刚过去的清明假期&#xff0c;甘肃天水可谓是“热辣滚烫”&#xff0c;在春暖花开时节&#xff0c;迎来了属于它的春天。而被人们逐…

在Spring Boot中使用POI完成一个excel报表导入数据到MySQL的功能

最近看了自己玩过的很多项目&#xff0c;忽然发现有一个在实际开发中我们经常用到的功能&#xff0c;但是我没有正儿八经的玩过这个功能&#xff0c;那就是在Spring Boot中实现一个excel报表的导入导出功能&#xff0c;这篇博客&#xff0c;主要是围绕excel报表数据导入进行&am…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.1 月末操作:自动清账

2.6.1 月末操作&#xff1a;自动清账 清账是指会计科目的借贷挂账后的核销&#xff0c;包括客户、供应商和实行未清项管理的总账科目等。 总账模块实行未清项管理的科目有GR/IR&#xff08;Goods Receipt/Invoice Receipt&#xff09;、银行存款-清账&#xff08;较少使…