1. 我们要做什么?

我们要做一件“魔术”一样的事情:把一份份“看不懂”的文档,变成电脑能理解、能提问、能回答的格式。我们会教电脑怎么“读文件”“找重点”“分段落”。

就像我们把一本厚厚的书,按小故事一个个剪下来,这样以后看、问、找都方便!

2. 我们需要的工具(环境准备)

就像做蛋糕前要准备面粉、鸡蛋,我们也要先装好工具!

先装 Python(电脑必须装过 Python 才能继续)

接下来打开你的终端或命令行,依次输入这些命令:

# 创建虚拟环境(可选)
python -m venv env
source env/bin/activate # Windows上是 env\Scripts\activate # 安装我们需要的工具包
pip install langchain
pip install unstructured
pip install beautifulsoup4
pip install pymupdf
pip install openpyxl
pip install python-docx
pip install python-pptx
pip install modelscope

3. 让我们教电脑认识“文档”

电脑不像人,不认识 Word、PDF 这些文件,它只懂“文本”和“结构”这两样东西。

我们要先教它一个“概念”——Document(文档对象)。

from langchain.schema import Document

doc = Document(
page_content="我是正文内容",
metadata={"source": "我的文件路径.pdf"}
)
print(doc.page_content) # 打印正文
print(doc.metadata) # 打印元数据(比如文件名、页数)

这就像我们告诉电脑:“这是第几页的内容,它是来自哪里,它的原话是这些。”

4. 解析 HTML 网页

有两种方法:

  • 方法一:网页链接直接读(推荐)
  • 方法二:本地 HTML 文件
from langchain_community.document_loaders import WebBaseLoader,BSHTMLLoader

# 方法一:从网址抓网页内容
loader = WebBaseLoader(
"https://flask.palletsprojects.com/en/stable/tutorial/layout/")
docs = loader.load()
for doc in docs:
print(doc.page_content,doc.metadata) # 方法二:读取本地html文件
loader = BSHTMLLoader("student-grades.html")
docs = loader.load()
for doc in docs:
print(doc.page_content,doc.metadata)

我们可以用 BeautifulSoup 自己抓代码块:

from bs4 import BeautifulSoup

with open("student-grades.html", "r", encoding="utf-8") as f:
html = f.read() soup = BeautifulSoup(html, "html.parser")
code_blocks = soup.find_all("td", class_="py-3 px-4") for block in code_blocks:
print(block.get_text())

5. 解析 PDF 文件

PDF 是最常见的办公文档。我们用两个方法来解析它。

方法一:简单读取文字内容

from langchain.document_loaders import PyMuPDFLoader

loader = PyMuPDFLoader("analysisReport.pdf")
docs = loader.load() for doc in docs:
print(doc.page_content)

方法二:高级自定义——提取表格

安装依赖

pip install pymupdf pandas openpyxl

import fitz  # PyMuPDF
import pandas as pd # 打开PDF文件
doc = fitz.open("analysisReport.pdf") # 创建一个ExcelWriter对象,用于写入多个工作表
with pd.ExcelWriter("output_tables.xlsx", engine="openpyxl") as writer:
page_num = 0
for page in doc.pages():
page_num += 1
tables = page.find_tables()
for table_index, table in enumerate(tables, start=1):
df = table.to_pandas()
print(df)
# 写入Excel,每个表格作为一个sheet,命名方式为 Page_1_Table_1 等
sheet_name = f"Page_{page_num}_Table_{table_index}"
df.to_excel(writer, sheet_name=sheet_name, index=False)
print(f"已写入:{sheet_name}")

6. Word、PPT、Excel 怎么解析?

Word

from docx import Document as DocxDocument

doc = DocxDocument("analysisReport.docx")

print("文本段落:")
for para in doc.paragraphs:
print(para.text) print("表格:")
for table in doc.tables:
for row in table.rows:
print([cell.text for cell in row.cells])

PPT

import os
import uuid from pptx import Presentation ppt = Presentation("demo.pptx")
# Create a directory to save images if it doesn't exist
output_dir = "ppt_images"
os.makedirs(output_dir, exist_ok=True) for slide_id, slide in enumerate(ppt.slides):
print(f"\n--- 第{slide_id+1}页 ---")
for shape in slide.shapes:
if shape.has_text_frame:
print("[Text]", shape.text)
elif shape.shape_type == 13: # picture
print("[Image] 有图片,保存")
try:
# Get the image
image = shape.image # Generate a unique filename using UUID
unique_id = uuid.uuid4()
image_filename = os.path.join(output_dir, f"slide_{slide_id + 1}_image_{unique_id}.{image.ext}") # Save the image
with open(image_filename, 'wb') as img_file:
img_file.write(image.blob) print(f"[Image] Saved: {image_filename}") except Exception as e:
print(f"Error saving image: {e}")
elif shape.has_table:
print("[Table]")
for row in shape.table.rows:
print([cell.text for cell in row.cells])

Excel

from openpyxl import load_workbook

wb = load_workbook("fake.xlsx")
sheet = wb.active print("按行打印单元格:")
for row in sheet.iter_rows():
print([cell.value for cell in row]) print("合并单元格:")
for merged_range in sheet.merged_cells.ranges:
print("合并: ", merged_range)

7. 把文档“切”成小段落(分块)

方法一:递归文本分块(最常用)

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
chunk_size=128,
chunk_overlap=30,
separators=["\n", "。", "!", "?"]
) docs_split = text_splitter.split_documents(docs)
for i, doc in enumerate(docs_split[:3]):
print(f"第{i+1}块:\n{doc.page_content}\n")

方法二:语义分块(智能一点)

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import SemanticChunker embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh") chunker = SemanticChunker(embedding)
docs_split = chunker.split_documents(docs)

方法三:模型分块(阿里的模型)

from modelscope.pipelines import pipeline

splitter = pipeline(
task="text-segmentation",
model="damo/nlp_corom_sentence-segmentation_chinese-base"
) result = splitter("这是第一句话。这是第二句话。这是第三句话。")
print(result)

8. 总结一下!

工具名 用途 安装命令
langchain 框架,封装 document pip install langchain
unstructured 自动识别多种文档 pip install unstructured
PyMuPDF 解析 PDF pip install pymupdf
beautifulsoup4 HTML解析 pip install beautifulsoup4
python-docx Word处理 pip install python-docx
python-pptx PPT处理 pip install python-pptx
openpyxl Excel处理 pip install openpyxl
modelscope 使用 AI 模型 pip install modelscope

小提示:

  • 多试几种 loader,理解它们的区别。
  • 文档结构不同,处理策略也要灵活。
  • 分块大小、重叠设置,可以根据句子长度分布来定。

【Rag实用分享】小白也能看懂的文档解析和分割教程的更多相关文章

  1. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  2. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

  3. 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法

    前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 s ...

  4. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  5. 【vscode高级玩家】Visual Studio Code❤️安装教程(最新版🎉教程小白也能看懂!)

    目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过 ...

  6. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  7. 【分享】iTOP4412开发板-Bluetooth移植文档

    [分享]iTOP4412开发板-Bluetooth移植文档 最近须要把Bluetooth移植到iTOP-4412 开发平台.查阅了相关资料,经过一段时间的研究.调试,最终成功的将蓝牙功能移植到了开发板 ...

  8. 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  9. 小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  10. 小白都能看懂的tcp三次握手

    众所周知,TCP在建立连接时需要经过三次握手.许多初学者经常对这个过程感到混乱:SYN是干什么的,怎么一会儿是1一会儿是0?怎么既有大写的ACK又有小写的ack?为什么ACK在第二次握手才开始出现?初 ...

随机推荐

  1. JAVA 用时间生成主键ID

    /** * 生成主键(19位数字) * 主键生成方式,年月日时分秒毫秒的时间戳 例如:1810311557430000845 */ public static synchronized Long ge ...

  2. TVM:TensorIR

    TensorIR是一种用于深度学习的特定领域语言,主要有两个目的. 在各种硬件后端进行程序变换和优化的实现 用于自动张量化程序优化的抽象 import tvm from tvm.script.pars ...

  3. Manim实现图像变形特效

    在数学教学和科普领域,变形效果往往能起到事半功倍的作用,让抽象的数学概念变得生动形象. 这篇文章将通过三个典型场景,来看看如何超越默认效果的限制,制作出更专业的变形动画. 1. 几何体的形态跃迁 传统 ...

  4. Django Web应用开发实战第一章

    一.常见域名后缀 .com:商业性的机构或公司. .net:从事Internet相关的网络服务的机构或公司. .org:非营利的组织.团体. .gov:政府部门. .cn:中国国内域名. .com.c ...

  5. 洛谷 P4820 [国家集训队]书堆

    题目描述 让N本密度均匀的相同的书摆在桌上.最下面的摆在桌子边缘,其他的书依次堆叠在一本书上.每本书都只能水平放置,宽必须垂直于桌子边缘.如(洛谷的)图: 求书本最右能到多远(这个距离是指最右边的书的 ...

  6. Flume+Kafka获取MySQL数据

    摘要 MySQL被广泛用于海量业务的存储数据库,在大数据时代,我们亟需对其中的海量数据进行分析,但在MySQL之上进行大数据分析显然是不现实的,这会影响业务系统的运行稳定.如果我们要实时地分析这些数据 ...

  7. 1. LangChain4j 初识,想使用Java开发AI应用?

    1. 简介 LangChain4j 是一个基于 Java 的开源框架,用于开发 人工智能驱动的应用程序,尤其是涉及 大语言模型(LLM)交互 的场景.它的设计目标是简化开发者与大语言模型的集成过程,提 ...

  8. 基础dp概要(持续更新中)

    复习一下dp 发现学的稀碎 区间dp一般不断将两个区间合并以得到整个区间的答案,即f(i,j)=max{f(i,k)+f(k+1,j)+cost} 对于一些是环的题目 考虑将环拆成两条链 求ans时枚 ...

  9. kubernetes之HPA详细介绍

    一.HPA说明 HPA(Horizontal Pod Autoscaler)是kubernetes的一种资源对象,能够根据某些指标对在statefulset.replicacontroller.rep ...

  10. ChatMoney:你的短视频脚本制作利器

    本文由 ChatMoney团队出品 在当今这个快节奏的数字时代,短视频以其短小精悍.内容丰富的特点迅速崛起,成为大众娱乐和信息传播的重要载体.然而,对于许多创作者而言,如何构思一个引人入胜.富有创意的 ...