3行代码训练扫描文档分类器:AutoGluon PDF文档分类实操笔记
【免费下载链接】autogluonFast and Accurate ML in 3 Lines of Code项目地址: https://gitcode.com/GitHub_Trending/au/autogluon
本教程用 AutoGluon 的多模态模块对扫描件和 PDF 做文档分类:页面文字自动 OCR,再训练一个类别预测模型。读完你可以拿到一个可运行的 RVL-CDIP 扫描文档分类器,以及换模型、提文档向量的完整写法。
效果速览:分类结果长什么样
先看输出。预测接口输入一个文件路径,返回类别标签;对同一文件再调用一次,还能拿到各类别的概率分布:
真实标签: form 预测结果: ['form'] 类别概率: budget 0.11 email 0.07 form 0.82RVL-CDIP 样本数据里的预算表(budget)、邮件(email)、表单(form)三类都是扫描图片。按下面的流程训练约 2 分钟,留出验证集上的 accuracy 通常在 0.9 以上,这个数字可以直接用来判断模型是否可用。
准备文档分类训练环境
文档处理依赖 Tesseract OCR 引擎,系统里要先装好;其余依赖都在 Python 包里,一条命令装完就能跑:
pip install autogluon.multimodal sudo apt install tesseract-ocr # Ubuntu;macOS 改用 brew install tesseract训练时预测器会自动调用 Tesseract 提取页面文字,所以你不需手动跑任何 OCR 命令,也不用自己解析 PDF 里的文本层。
核心工作流:加载数据、训练模型、预测类别
整个过程只有三步:加载数据表、训练模型、预测类别。数据是一张表,每行对应一份文档:doc_path列是文件路径,label列是类别。表结构与标注工具的导出结果类似,路径和标签一一对应:
① 加载扫描文档数据
先从文档预测教程里下载并解压 RVL-CDIP 样本包,然后读表,并把相对路径改成本地绝对路径,否则预测器找不到文件:
import os import pandas as pd base = "./docs_data/rvl_cdip_sample" docs = pd.read_csv(f"{base}/rvl_cdip_train_data.csv") train, test = docs.iloc[:2000], docs.iloc[2000:] for df in (train, test): # 把相对路径拼成本地绝对路径 df["doc_path"] = df["doc_path"].apply(lambda p: os.path.join(base, p))这一步只做两件事:拿到数据表,让表里每个路径在当前机器上可解析。
② 训练一个扫描文档分类模型
训练是一次fit调用。OCR、文本与版面特征提取、预训练文档模型微调都在内部自动完成,你只需指定标签列和时间预算:
from autogluon.multimodal import MultiModalPredictor predictor = MultiModalPredictor(label="label") predictor.fit( train_data=train, val_data=test, hyperparameters={ "model.document_transformer.checkpoint_name": "microsoft/layoutlm-base-uncased", }, time_limit=120, )训练完成后模型会随预测器一起保存,换进程使用时调用predictor.load()即可恢复,不用重新训练。
③ 给新 PDF 预测类别
预测传入一个字典,键是路径列名,值是一个路径列表,返回同长度、同顺序的类别标签列表;predict_proba则返回每个类别的概率,方便做置信度过滤:
doc = test.iloc[0]["doc_path"] print("真实标签:", test.iloc[0]["label"]) print("预测结果:", predictor.predict({"doc_path": [doc]})) print("类别概率:", predictor.predict_proba({"doc_path": [doc]}))返回的标签可以直接写入数据库,或者作为目录名把文件自动归档到对应类别的文件夹里。
文档模型怎么选:LayoutLM、LayoutLMv3、LayoutXLM
默认的layoutlm-base-uncased是均衡之选:它同时输入文字、位置和图像特征,适合预算表、表单这类单栏排版的英文扫描件。三个候选模型按场景区分:
| 模型 | 适用场景 |
|---|---|
| layoutlm-base-uncased | 英文单栏扫描件,数据量小,默认选择 |
| layoutlmv3-base | 多栏、复杂版式的 PDF,对准确率要求更高 |
| layoutxlm-base | 含中文、日文等多语言内容的文档 |
换模型只改一个超参,顺带可以控制训练轮数和学习率:
hyperparameters = { "model.document_transformer.checkpoint_name": "microsoft/layoutlmv3-base", "optimization.max_epochs": 3, "optimization.learning_rate": 5e-5, }max_epochs控制训练轮数,数据量小时 3 轮足够;learning_rate微调时常用 5e-5 这个量级。
从分类到向量化:提取文档嵌入
同一个预测器还能输出文档向量,不必另外训练表示模型:
import numpy as np emb = np.array(predictor.extract_embedding({"doc_path": doc})) print("向量维度:", emb.shape)一行调用拿到一份文档的向量。对一批文档两两计算余弦相似度,就能做重复文档检测和相似合同检索;直接把向量丢给聚类算法,也能完成文档的自动分组归档。
部署与更多资源
训练完成的预测器用save()/load()持久化,也可以导出 ONNX 格式接入推理服务,导出写法参考 ONNX 部署示例。深入源码和更多场景,从这几个入口看起:
- 文档预测教程入口
- 扫描件分类教程
- PDF 文档分类教程
- 多模态模块源码
【免费下载链接】autogluonFast and Accurate ML in 3 Lines of Code项目地址: https://gitcode.com/GitHub_Trending/au/autogluon
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考