1. 纯文本提取
这是最基础的一步:从可编辑的文档格式中直接读出文字内容。
- 适用场景:Word(.docx)、Markdown、网页(HTML)、纯文本文件等。
- 常用方法:
- 对于 Word 文件,使用
python-docx等库读取段落文本。 - 对于 HTML,使用
BeautifulSoup去除标签、提取正文。 - 对于 PDF,如果是文字型 PDF(即文字可以选择、复制),可以用
PyMuPDF、pdfplumber直接提取文本流。 - 注意事项:
- 提取后往往需要清理空行、乱码、页眉页脚等干扰内容。
- 需要保留基本的段落结构,避免把所有文字挤成一大段。
纯文本提取的优点是速度快、信息完整度高,但无法处理扫描件,也不能反映复杂版式背后的逻辑关系。
2. 版式解析
很多文档并不仅仅是文字序列,其阅读顺序、标题层级、多栏排版等,都会影响文字的真实含义。
- 为什么重要:一个典型的双栏 PDF,如果按行从左到右直接读取,上半行是左栏,下半行是右栏,会把两栏内容错乱穿插;一份合同中的条款编号和子编号的层级关系,也决定了回答时能否准确引用“第2.1.3条”。
- 常用方法与工具:
pdfplumber可以导出每个字符的坐标、字体大小,通过分析位置和间距识别段落和列。layoutparser等库结合检测模型,能识别页面中的文本块、表格、图片区域。- 针对复杂的 PDF 版式,也可以使用商业工具(如 Adobe PDF Extract API)输出带结构标记的阅读顺序。
- 实用建议:
- 不要盲目追求全自动,可以先用工具输出每个文本块的坐标,然后人工制定规则(如“同列内自上而下,多列时先左后右”)。
- 如果文档格式统一,编写定制脚本往往比通用模型效果更好。
版式解析的结果是为后续“准确切片”打基础,只有理清阅读顺序和层级,才能保证检索到的片段语义完整。
3. 表格识别
表格是信息密度最高的文档元素之一。财务报告、技术参数表、规章对比表,往往以表格形式呈现。如果将表格当做普通文本强制展开,会丢失行列对应关系,导致检索时无法准确匹配。
- 挑战:表格有合并单元格、跨页、无框线等复杂情况。
- 处理方法:
- 结构化提取:使用
pdfplumber的表格识别功能,它基于线条和对齐检测,可输出二维列表。适合有明确框线的表格。 - 无框线表格:通过分析文本块之间的空白对齐,判断行列结构。
camelot库针对 PDF 能处理部分无框线表格。 - 大模型辅助:对于特别复杂的表格,可以将表格区域的截图发送给多模态模型(如 GPT-4 Vision),直接返回 Markdown 表格格式,这是一种新兴且效果不错的方式。
- 输出与存储:
- 建议将表格转为 Markdown 或 CSV 格式的文本,方便后续切片和检索。
- 对于关键数据,可同时保留表格的结构化副本(如 JSON),以便在回答时引用具体单元格。
在提取后,最好人工抽查几张有代表性的表格,确保行列未错位。一旦表格变形,整个数据的可用性就丧失了。
4. 图片 OCR
扫描件、传真件、照片中的文字,无法通过常规文本提取工具获取,必须借助光学字符识别(OCR)技术。
- 适用场景:扫描版 PDF、合同照片、截图中的菜单或告示等。
- 常用工具:
- 开源方案:Tesseract,配合中文语言包可处理中英文混排,对清晰度要求较高。
- 云服务:百度 OCR、阿里云 OCR 等国内服务对中文识别效果好,且支持表格识别、字段结构化。
- 多模态大模型:如 GPT-4o、Claude 等可直接输入图片并返回文本,对复杂版式(如手写体、模糊文字)也有不错的表现,但成本较高,适合少量或关键页面。
- 操作流程:
- 如果是扫描版 PDF,先用工具(如
pdf2image)将每一页转成图片。 - 对每张图片调用 OCR 引擎,获取文本和位置信息。
- 将识别结果按页拼回,并标记为“OCR 提取”,未来更新时若获得原始电子档可替换。
OCR 是一个“有损”过程,识别率受字体、清晰度、背景干扰影响。因此,保留原始图片作为溯源材料,或者在识别结果中附上置信度,可以在出现错误时快速定位和修正。
在实际项目中,这几个环节很少独立存在。一份企业知识库的入库流水线,通常会先判断文件类型:若是原生 PDF,走文字提取+版式解析;若有表格,触发表格识别分支;若是扫描件或图片,就进入 OCR 通路。将这些技术组合成一个清晰的预处理流程,才能保障知识库内容的完整和准确,这也是后续检索和生成质量的基石。