当前位置: 首页 > news >正文

【langchain】加载、处理和分割源数据文件

文章目录

  • 1 文件的加载
    • 1.1 Markdown 的加载
    • 1.2 PDF 的加载
  • 2 数据的清理(以PDF的第一页数据为例)
  • 3 内容的分割
  • 总结

本文主要讲解langchain 如何加载PDF、Markdown源文件。

清理的PDF文件为南瓜书。

1 文件的加载

1.1 Markdown 的加载

from langchain.document_loaders.markdown import UnstructuredMarkdownLoaderloader = UnstructuredMarkdownLoader("data_base/example.md")  # 实例化对象,传入Markdown文件地址
md_pages = loader.load()  # 加载文件内容,返回Document对象列表,List[Document]type(md_pages), len(md_pages), md_pages[0].metadata, md_pages[0].page_content  # 使用返回结果,可以查看类型、页数、文件名、内容等等

1.2 PDF 的加载

from langchain.document_loaders import PyMuPDFLoaderloader = PyMuPDFLoader("data_base/example.pdf")  # 实例化对象,传入PDF文件地址
pdf_pages = loader.load()  # 加载文件内容,返回Document对象列表type(pdf_pages), len(pdf_pages), pdf_pages[0].metadata, pdf_pages[0].page_content# 使用返回结果,可以查看类型、页数、文件名、内容等等

这里给出一个document数据的示例(pdf_pages[0]):
在这里插入图片描述

2 数据的清理(以PDF的第一页数据为例)

这里我们要处理的是数据内容,也就是content部分。

使用正则表达式处理。

# 提取第一页内容
pdf_page = pdf_pages[0]# 引入re模块
import re"替换掉每句话之间的换行符和两个符号之间的\n"
pattern = re.compile(r'["\u4e00-\u9fff](n)["\u4e00-\u9fff]', re.DOTALL)   # 正则表达式
pdf_page.page_content = re.sub(pattern, lambda match: match.group(0).replace('n', ''), pdf_page.page_content)  # 替换操作。re.sub(pattern, repl, string) # 清除多余'•'和空格
pdf_page.page_content = pdf_page.page_content.replace('•', '')
pdf_page.page_content = pdf_page.page_content.replace(' ', '')

3 内容的分割

由于上下文过长会导致检索得到的知识太长,超过模型能处理能力。因此,不会直接将单个文件转为向量存入向量数据库,进行检索。

在存入向量数据库之前,需要将其进行分割,以便于后续处理。

通常,将单个文档按长度或某规则分割成若干个chunk,然后将每个chunk转化为词向量,并存储到向量数据库中。

chunk指的是文档的片段,比如一个文档有1000个字符,那么将其按500个字符进行分割,就会得到5个chunk。

在检索时,会以chunk为元单位进行检索。每一次检索到k个chunk,其作为参考的知识,来回答用户。k的值有我们决定。

我们可以使用langchainCharacterTextSplitter分割方法:

langchain.text_splitter.CharacterTextSplitter(separator: str = "(n(n"chunk_size=4000,chunk_overlap=200,length_function=<builtin function len>,)
Methods:create_documents()-Create documents from a list of texts.split_documents()-Split documents.
  • chunk_size 指每个块包含的字符或Token(如单词、句子等)的数量
  • chunk_overlap 指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息

langchain还有其它文档分割方式,区别在怎么确定块与块之间的边界、块由哪些字符/token组成、以及如何测量块大小。

接下来,

# 引入模块
from langchain_text_splitters import RecursiveCharacterTextSplitte # 实例化RecursiveCharacterTextSplitter对象
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)"""对文本切割  .split_text()"""
chunks = text_splitter.split_text(pdf_page.page_content) # 对pdf_page.page_content进行分割,得到List列表"""对文件切割  .split_documents()"""
chunks = text_splitter.split_documents(pdf_pages[0:3])  # 返回List列表

额外地,这里其实可以对文件总数tokens进行统计。

sum([len(chunk.page_content) for chunk in chunks])

总结

以上就是如何对源文件数据进行处理。

  • 加载。 使用 langchain.document_loaders 下的模块,实例化后,.load() 加载文件
  • 清理。 使用正则表达式或简单替换删除不需要的字符
  • 分割。 使用 langchain_text_splitters 下的模块,实例化后,.split_text() 或 .split_documents() 分割内容为多个chunks,为后续存入数据库做准备

文章转载自:

http://Z3WQMim8.kcwzq.cn
http://0889xzCm.kcwzq.cn
http://wiIEMwhS.kcwzq.cn
http://qv1bGeyk.kcwzq.cn
http://r533FeqE.kcwzq.cn
http://FnJac6dR.kcwzq.cn
http://d5nOAYnL.kcwzq.cn
http://RDshmVMv.kcwzq.cn
http://kYESDNIr.kcwzq.cn
http://MEKf9ixH.kcwzq.cn
http://ST0TMDGE.kcwzq.cn
http://ApVNE9rB.kcwzq.cn
http://DfVmNRRI.kcwzq.cn
http://DWYjtrwS.kcwzq.cn
http://kmjfMNMt.kcwzq.cn
http://0ZHEU2LW.kcwzq.cn
http://bXXYjl7z.kcwzq.cn
http://xRYDyj1r.kcwzq.cn
http://hNgBVl1O.kcwzq.cn
http://JJkSolN2.kcwzq.cn
http://ey8OR1fL.kcwzq.cn
http://R29CM2r5.kcwzq.cn
http://ngK3rrnR.kcwzq.cn
http://qNE6ylJm.kcwzq.cn
http://t83JCGDk.kcwzq.cn
http://cM8aacyC.kcwzq.cn
http://08vBxCRk.kcwzq.cn
http://H5JJ1HdR.kcwzq.cn
http://wk7Ba4fa.kcwzq.cn
http://4zhh0w5t.kcwzq.cn
http://www.dtcms.com/a/384490.html

相关文章:

  • cmake .. -G “Visual Studio 12“
  • i.MX6ULL 外设初始化
  • Node.js如何实现一个WebSocket服务
  • 机器学习shap分析案例
  • Shebang:Node.js 脚本的魔法开头
  • [vue3] 使用reactive声明数组如何正确赋值
  • 微硕MOS管WSF12N15助力汽车电动转向系统
  • SpringBoot快速上手:基础+进阶+项目+源码
  • winscp连接虚拟机centos要求要密码,可是虚拟机登录不需要密码,怎么解决
  • NumPy全面学习笔记
  • Java 轻松实现 Markdown 转 Word、PDF、HTML
  • 时序数据库选型指南:Apache IoTDB企业级解决方案深度解析
  • Java 中 ArrayList 扩容机制的深度解析
  • PowerBI与Excel的区别及实时数据报表开发
  • 【无人机】自检arming参数调整选项
  • Apache Paimon 官方文档
  • CentOS7.9绿色安装apache-tomcat-9.0.109
  • 9款热门局域网文档共享系统横向评测 (2025)
  • 终端安全EDR
  • 【层面一】C#语言基础和核心语法-03(泛型/集合/LINQ)
  • 【连载4】 C# MVC 环境差异化配置:异常处理策略
  • 计算机视觉进阶教学之背景建模与光流估计
  • 铝锆中间合金市场报告:深度解析与未来趋势展望
  • 数据库事务:ACID
  • 动态电源路径管理(DPPM)、NVDC动态路径管理
  • 深入理解链表:从基础概念到经典算法
  • 手写MyBatis第60弹: 如何优雅处理各种参数类型,从ParamNameResolver到TypeHandler
  • 【Postman】Postman 自动化测试指南:Token 获取与变量管理实战
  • Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用
  • arcgis中实现四色/五色法制图