RAG01:文档解析
从PDF、网页、Markdown、表格到图片内容抽取,理解如何将非结构化文档转换为可检索的知识。
文档解析是 RAG 的第一步,也是最关键的一步。高质量的文档解析能将非结构化的文档转换为结构化的知识,为后续的检索和生成奠定基础。
文档解析的挑战
非结构化文档的问题
| 文档类型 | 挑战 | 示例 |
|---|---|---|
| 格式复杂、扫描件难以识别 | 表格、图表、图片 | |
| 网页 | HTML 结构复杂、噪音多 | CSS、JavaScript、广告 |
| Word | 格式多样、嵌套结构 | 页眉页脚、批注、修订 |
| 图片 | 需要 OCR 识别 | 扫描件、截图 |
| Markdown | 相对简单,但有特殊语法 | 代码块、表格、链接 |
文档解析的质量影响
| 解析质量 | 影响 | 后果 |
|---|---|---|
| 高质量 | 准确提取内容 | RAG 效果好 |
| 中等质量 | 部分内容丢失 | RAG 效果一般 |
| 低质量 | 大量内容丢失或错误 | RAG 效果差 |
文档类型与解析策略
PDF 解析
PDF 是最常见的文档格式之一,解析策略如下:
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 文本提取 | 直接提取文本内容 | 纯文本 PDF |
| OCR 识别 | 使用光学字符识别 | 扫描件 PDF |
| 表格提取 | 专门提取表格内容 | 包含表格的 PDF |
| 图表解析 | 解析图表内容 | 包含图表的 PDF |
PDF 解析示例:
from PyPDF2 import PdfReader
def parse_pdf(file_path):
reader = PdfReader(file_path)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
# 扫描件 PDF 需要 OCR
from pdf2image import convert_from_path
import pytesseract
def parse_scanned_pdf(file_path):
images = convert_from_path(file_path)
text = ""
for image in images:
text += pytesseract.image_to_string(image)
return text
网页解析
网页解析需要处理 HTML 结构,提取有效内容:
| 方法 | 说明 | 适用场景 |
|---|---|---|
| HTML 解析 | 解析 HTML 结构 | 结构化网页 |
| 内容提取 | 提取正文内容 | 文章页面 |
| 链接抓取 | 抓取页面链接 | 网站爬取 |
| JavaScript 渲染 | 渲染动态内容 | 单页应用 |
网页解析示例:
import requests
from bs4 import BeautifulSoup
def parse_webpage(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取正文内容
article = soup.find('article')
if article:
return article.get_text()
# 如果没有 article 标签,提取所有段落
paragraphs = soup.find_all('p')
return '\n'.join([p.get_text() for p in paragraphs])
Markdown 解析
Markdown 相对简单,但需要处理特殊语法:
| 元素 | 处理方式 | 示例 |
|---|---|---|
| 标题 | 提取标题级别 | # 标题 → 一级标题 |
| 列表 | 提取列表内容 | - 项目1 → 列表项 |
| 代码块 | 保留代码格式 | java ... |
| 表格 | 提取表格数据 | ` |
| 链接 | 提取链接文本和 URL | [text](url) |
Markdown 解析示例:
import markdown
from bs4 import BeautifulSoup
def parse_markdown(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 转换为 HTML
html = markdown.markdown(content)
soup = BeautifulSoup(html, 'html.parser')
# 提取文本内容
return soup.get_text()
表格解析
表格是常见的数据形式,需要特殊处理:
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 结构化提取 | 提取为表格数据 | PDF、Word 表格 |
| 文本转换 | 转换为文本描述 | 简单表格 |
| 图片表格 | 使用 OCR + 表格识别 | 图片中的表格 |
表格解析示例:
import camelot
def parse_pdf_table(file_path):
tables = camelot.read_pdf(file_path)
if tables:
return tables[0].df.to_dict('records')
return []
图片内容抽取
图片中的内容需要使用 OCR 技术:
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 文字识别 | 识别图片中的文字 | 扫描件、截图 |
| 表格识别 | 识别图片中的表格 | 表格图片 |
| 图表识别 | 识别图表内容 | 图表图片 |
| 场景理解 | 理解图片场景 | 复杂图片 |
图片内容抽取示例:
import pytesseract
from PIL import Image
def extract_text_from_image(image_path):
image = Image.open(image_path)
text = pytesseract.image_to_string(image)
return text
文档解析的质量优化
内容清洗
内容清洗去除无用信息:
| 清洗类型 | 说明 | 示例 |
|---|---|---|
| 去除噪音 | 去除无关内容 | 广告、导航、页眉页脚 |
| 统一格式 | 统一文本格式 | 换行、空格、编码 |
| 修复错误 | 修复识别错误 | OCR 识别错误 |
| 提取关键信息 | 提取重要内容 | 标题、关键词、摘要 |
结构保留
结构保留保持文档的层次结构:
| 结构类型 | 说明 | 示例 |
|---|---|---|
| 标题层级 | 保留标题级别 | H1、H2、H3 |
| 段落结构 | 保留段落划分 | 段落、列表 |
| 表格结构 | 保留表格格式 | 行、列、单元格 |
| 代码结构 | 保留代码格式 | 代码块、语法高亮 |
多模态解析
多模态解析处理包含多种内容类型的文档:
文档内容:
1. 文本内容 → 文本提取
2. 表格内容 → 表格提取
3. 图片内容 → OCR 识别
4. 图表内容 → 图表解析
5. 公式内容 → 公式识别
最终输出:
结构化的知识片段,包含文本、表格、图片描述等
文档解析的常见问题
问题1:内容丢失
表现:解析后的内容不完整
解决方案:
- 使用更强大的解析工具
- 结合多种解析方法
- 人工检查和补充
问题2:格式混乱
表现:解析后的内容格式混乱
解决方案:
- 使用结构化解析方法
- 进行内容清洗
- 统一输出格式
问题3:OCR 识别错误
表现:扫描件识别准确率低
解决方案:
- 使用更高质量的 OCR 引擎
- 优化图片质量
- 人工校对
问题4:表格解析困难
表现:复杂表格难以正确解析
解决方案:
- 使用专门的表格解析工具
- 将表格转换为文本描述
- 人工处理复杂表格
文档解析的最佳实践
解析流程
1. 文档上传
2. 文档类型识别
3. 选择解析策略
4. 执行解析
5. 内容清洗
6. 结构保留
7. 质量检查
8. 输出结构化知识
质量保障
1. 解析准确率目标:> 95%
2. 关键信息覆盖率:100%
3. 表格解析准确率:> 90%
4. OCR 识别准确率:> 98%
5. 定期人工抽检
6. 使用多个解析工具交叉验证
工具选择
| 工具 | 功能 | 适用场景 |
|---|---|---|
| PyPDF2 | PDF 文本提取 | 纯文本 PDF |
| pdfplumber | PDF 高级解析 | 复杂 PDF |
| Tesseract | OCR 识别 | 扫描件 |
| BeautifulSoup | HTML 解析 | 网页 |
| Camelot | PDF 表格提取 | PDF 表格 |
| markdown | Markdown 解析 | Markdown 文件 |
项目判断清单
- 需要解析 PDF → 使用 PyPDF2 或 pdfplumber
- 需要解析扫描件 → 使用 Tesseract OCR
- 需要解析网页 → 使用 BeautifulSoup
- 需要解析表格 → 使用 Camelot
- 内容丢失 → 使用多种工具交叉验证
- OCR 识别错误 → 优化图片质量或使用更高质量 OCR
- 表格解析困难 → 使用专门的表格工具
- 需要长期维护 → 建立解析质量监控和反馈机制