糖逗 发表于 昨天 09:38

23. LangChain组件——Document loaders:文档加载器

1. 什么是文档加载器,有什么用?
文档加载器提供了一套标准接口,用于将不同来源(如CSV、PDF 或JSON等)的数据读取为LangChain的文档格式。
这确保了无论数据来源如何,都能对其进行一致性处理。
注:

[*]文档加载器均继承于BaseLoader类
[*]返回Document类型的对象







2. 常见的文件类型加载实战
①CSV Loader
# 方式1: 一次性批量加载

from langchain_community.document_loaders import CSVLoader


loader = CSVLoader(
file_path="E:/data/stu.csv", # 按实际情况修改文件地址
csv_args={
"delimiter": ",", # 指定分隔符
"quotechar": '"', # 指定带有分隔符文本的引号包围是单引号还是双引号
# 如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ['name', 'age', 'gender', '爱好']
},
encoding="utf-8" # 指定编码为UTF-8
)

# 批量加载 .load() ->
documents = loader.load()
#print(documents)

for document in documents:
print(type(document), document)



# 方式2: 懒加载,延迟流式传输文档,对大型数据集很有用,避免内存溢出。
from langchain_community.document_loaders import CSVLoader


loader = CSVLoader(
file_path="E:/P3_LangChainRAG开发/data/stu.csv", #按实际情况修改文件地址
csv_args={
"delimiter": ",", # 指定分隔符
"quotechar": '"', # 指定带有分隔符文本的引号包围是单引号还是双引号
# 如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ['name', 'age', 'gender', '爱好']
},
encoding="utf-8" # 指定编码为UTF-8
)



#懒加载 .lazy_load() 迭代器

for document in loader.lazy_load():
print(document)


②Json Loader


from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(
file_path="E:/data/stu_json_lines.json",
jq_schema=".name",
text_content=False, # 告知JSONLoader 我抽取的内容不是字符串
json_lines=True # 告知JSONLoader 这是一个JSONLines文件(每一行都是一个独立的标准JSON)
)

document = loader.load()
print(document)

③text Loader

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# pip install langchain_text_splitters

loader = TextLoader("E:/data/Python基础语法.txt", encoding="utf-8")

docs = loader.load()      #

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,         # 分段的最大字符数
    chunk_overlap=50,       # 分段之间允许重叠字符数
    # 文本自然段落分隔的依据符号
    separators=["\n\n", "\n", "。", "!", "?", ".", "!", "?", " ", ""],
    length_function=len,    # 统计字符的依据函数
)

split_docs = splitter.split_documents(docs)
print(len(split_docs))
for doc in split_docs:
    print("="*20)
    print(doc)
    print("="*20)



④PyPDFLoader

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader(
    file_path="E:/data/pdf2.pdf",
    #mode="single",      # 默认是page模式,每个页面形成一个Document文档对象,
                        # single模式,不管有多少页,只返回1个Document对象
    password="itheima"
)

i = 0
for doc in loader.lazy_load():
    i += 1
    print(doc)
    print("="*20, i)








FishC 发表于 昨天 09:39

什么是文档加载器?

简单来说,文档加载器就是把各种格式的文件(比如CSV、PDF、TXT)里的内容,“加载”成LangChain能看懂的统一格式(Document 对象)。这样不管你原来的数据是表格还是文章,LangChain都能用同样的方法来处理它们。

核心作用: 统一数据入口,方便后续处理(如文本分割、向量化等)。

注意:

[*]所有的文档加载器都基于 BaseLoader 类。
[*]它们最终都会返回一个或多个 Document 对象。


常见文件加载实战

① CSV 文件加载
有两种加载模式:


[*]批量加载 (.load()): 一次性把整个文件读入内存。
[*]懒加载 (.lazy_load()): 按需一行行读取,对于大文件可以节省内存,避免程序崩溃。


from langchain_community.document_loaders import CSVLoader

# 方式1: 一次性批量加载
loader = CSVLoader(
    file_path="E:/data/stu.csv", # 你的文件路径
    csv_args={
      "delimiter": ",",   # 指定分隔符为逗号
      "quotechar": '"',   # 指定文本引号
    },
    encoding="utf-8"
)
documents = loader.load() # 一次性全部加载
for doc in documents:
    print(doc)

print("-" * 40)

# 方式2: 懒加载(迭代器)
loader2 = CSVLoader(file_path="E:/data/stu.csv", encoding="utf-8")
for doc in loader2.lazy_load(): # 用for循环迭代,一次返回一个文档
    print(doc)

② JSON 文件加载
使用 jq_schema 参数来指定你想提取JSON中的哪个部分。

from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(
    file_path="E:/data/stu_json_lines.json",
    jq_schema=".name", # 提取每个JSON对象里的"name"字段
    text_content=False, # 告诉加载器,提取的内容不是纯文本字符串(这里提取的是字段值)
    json_lines=True # 告知这是JSON Lines格式(每行一个独立JSON)
)
documents = loader.load()
print(documents)

③ 文本 (TXT) 文件加载与分割
文本文件加载后,通常需要分割成小块,以便AI模型处理。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载文本
loader = TextLoader("E:/data/Python基础语法.txt", encoding="utf-8")
docs = loader.load() # 得到一个Document列表

# 创建文本分割器
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,      # 每个文本块的最大长度
    chunk_overlap=50,    # 块与块之间重叠的字符数(保持上下文连贯)
    length_function=len, # 计算文本长度的函数
)

# 执行分割
split_docs = splitter.split_documents(docs)
print(f"原始文档数:{len(docs)}, 分割后块数:{len(split_docs)}")
for doc in split_docs:
    print("="*20)
    print(doc.page_content) # 打印分割后的文本内容
    print("="*20)

④ PDF 文件加载
可以按页加载,也可以将整个PDF作为一个文档加载。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader(
    file_path="E:/data/pdf2.pdf",
    # mode="single", # 默认是'page',每页一个Document。设为'single'则整个PDF为一个Document。
    password="itheima" # 如果PDF有密码,在这里填写
)

# 使用懒加载按页读取
i = 0
for doc in loader.lazy_load():
    i += 1
    print(f"第 {i} 页内容:")
    print(doc.page_content[:100]) # 打印每页的前100个字符作为预览
    print("="*20)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 23. LangChain组件——Document loaders:文档加载器