10分钟搞定文档信息抽取:Transformers-Tutorials的CORD数据集实战指南
你是否还在为合同、发票、简历等文档中的关键信息手动复制粘贴而烦恼?面对成百上千份文档,人工提取不仅耗时耗力,还容易出错。本文将带你使用Transformers-Tutorials项目中的CORD数据集,快速实现文档信息抽取自动化,无需复杂编程,10分钟即可上手。读完本文,你将掌握两种主流模型(Donut和LayoutLMv2)的实战应用,轻松应对各类表单文档的信息提取需求。
什么是CORD数据集?
CORD(Complex Office Document)数据集是一个包含各类办公文档的标注数据集,由Naver Clova团队发布。它包含800个训练样本、100个验证样本和100个测试样本,每个样本都是"图像-JSON"对,图像是扫描的文档图片,JSON则包含了文档中的关键信息标注,如文本内容、位置坐标、字段类型等。
该数据集涵盖了多种文档类型,如发票、简历、申请表等,非常适合用于训练文档信息抽取模型。在Transformers-Tutorials项目中,CORD数据集主要用于Donut和LayoutLMv2两种模型的训练和推理演示。
环境准备
在开始之前,我们需要先安装必要的依赖库。打开终端,执行以下命令:
pip install -q transformers datasets sentencepiece pytorch-lightning
这些库包括:
- transformers:HuggingFace的核心库,提供了大量预训练模型
- datasets:用于加载和处理数据集
- sentencepiece:用于文本分词
- pytorch-lightning:用于模型训练
方法一:使用Donut模型实现端到端文档解析
Donut是一种基于Transformer的文档理解模型,能够直接从文档图像中提取结构化信息,无需复杂的预处理步骤。它将文档解析任务转化为序列生成任务,直接输出JSON格式的结果。
数据加载
首先,我们从HuggingFace Hub加载CORD数据集:
from datasets import load_dataset
dataset = load_dataset("naver-clova-ix/cord-v2")
print(dataset)
输出结果如下:
DatasetDict({
validation: Dataset({
features: ['image', 'ground_truth'],
num_rows: 100
})
train: Dataset({
features: ['image', 'ground_truth'],
num_rows: 800
})
test: Dataset({
features: ['image', 'ground_truth'],
num_rows: 100
})
})
可以看到,数据集包含训练集(800样本)、验证集(100样本)和测试集(100样本),每个样本包含图像和对应的标注信息。
模型训练
使用PyTorch Lightning进行模型训练的完整代码可以参考项目中的Fine_tune_Donut_on_a_custom_dataset_(CORD)_with_PyTorch_Lightning.ipynb_with_PyTorch_Lightning.ipynb)文件。这里我们简要介绍关键步骤:
- 定义模型和分词器
- 数据预处理
- 定义训练器
- 开始训练
快速推理
如果你不想训练模型,也可以直接使用预训练模型进行推理。项目中提供了一个快速推理的示例:Quick_inference_with_DONUT_for_Document_Parsing.ipynb。
推理代码示例:
from transformers import DonutProcessor, VisionEncoderDecoderModel
import torch
from PIL import Image
# 加载处理器和模型
processor = DonutProcessor.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")
model = VisionEncoderDecoderModel.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")
# 将模型移到GPU(如果可用)
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
# 加载图像
image = Image.open("path/to/your/document/image.png").convert("RGB")
# 准备输入
pixel_values = processor(image, return_tensors="pt").pixel_values.to(device)
# 生成预测
outputs = model.generate(
pixel_values,
max_length=model.decoder.config.max_position_embeddings,
pad_token_id=processor.tokenizer.pad_token_id,
eos_token_id=processor.tokenizer.eos_token_id,
use_cache=True,
bad_words_ids=[[processor.tokenizer.unk_token_id]],
return_dict_in_generate=True,
)
# 解码结果
sequence = processor.batch_decode(outputs.sequences)[0]
sequence = sequence.replace(processor.tokenizer.eos_token, "").replace(processor.tokenizer.pad_token, "")
sequence = processor.token2json(sequence)
print(sequence)
这段代码将输出一个JSON对象,包含从文档图像中提取的结构化信息。
方法二:使用LayoutLMv2模型进行Token分类
LayoutLMv2是微软提出的基于Transformer的文档理解模型,它不仅考虑了文本内容,还融入了文本的位置信息(边界框),非常适合文档中的实体识别任务。
数据准备
LayoutLMv2需要特定格式的输入数据,包括文本、边界框和标签。项目中提供了将CORD数据集转换为LayoutLMv2所需格式的脚本:Prepare_CORD_for_LayoutLMv2.ipynb。
数据预处理的主要步骤包括:
- 加载CORD数据集
- 提取文本和边界框信息
- 将标签转换为IOB格式
- 保存为JSON文件
模型训练
使用LayoutLMv2进行Token分类的训练代码可以参考:Fine_tuning_LayoutLMv2ForTokenClassification_on_CORD.ipynb。
关键步骤包括:
- 加载预处理后的数据
- 创建LabelEncoder
- 定义LayoutLMv2模型
- 使用Trainer进行训练
模型推理
训练完成后,可以使用以下代码进行推理:
from transformers import LayoutLMv2TokenizerFast, LayoutLMv2ForTokenClassification
import torch
from PIL import Image
import pytesseract
from typing import List, Tuple
# 加载模型和分词器
tokenizer = LayoutLMv2TokenizerFast.from_pretrained("microsoft/layoutlmv2-base-uncased")
model = LayoutLMv2ForTokenClassification.from_pretrained("path/to/your/trained/model")
# 加载图像并使用OCR提取文本和边界框
image = Image.open("path/to/your/document/image.png").convert("RGB")
ocr_result = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT)
# 准备输入
words = ocr_result["text"]
boxes = [tuple(map(int, [x1, y1, x2, y2])) for x1, y1, x2, y2 in zip(ocr_result["left"], ocr_result["top"], ocr_result["width"], ocr_result["height"])]
inputs = tokenizer(words, boxes=boxes, return_tensors="pt", padding=True, truncation=True)
# 推理
with torch.no_grad():
outputs = model(**inputs)
# 处理输出
predictions = torch.argmax(outputs.logits, dim=2)
labels = [model.config.id2label[pred.item()] for pred in predictions[0]]
# 打印结果
for word, box, label in zip(words, boxes, labels):
if word.strip() != "":
print(f"Word: {word}, Box: {box}, Label: {label}")
这段代码将输出每个单词及其对应的边界框和预测标签,你可以根据标签提取出关键信息。
两种方法的对比
| 模型 | 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Donut | 端到端序列生成 | 无需OCR,直接从图像生成JSON,使用简单 | 需要大量训练数据,推理速度较慢 | 表单类文档,需要直接输出结构化数据 |
| LayoutLMv2 | Token分类 | 可解释性强,训练数据需求较少 | 需要OCR预处理,后处理复杂 | 复杂文档,需要精确识别实体边界 |
根据你的具体需求选择合适的方法。如果是简单的表单解析,Donut可能更适合;如果是复杂的文档布局,LayoutLMv2可能表现更好。
总结与展望
本文介绍了两种基于Transformers-Tutorials项目实现文档信息抽取的方法:Donut和LayoutLMv2。通过这两种方法,你可以快速实现文档信息抽取的自动化,大大提高工作效率。
未来,随着大语言模型的发展,多模态模型(如GPT-4V、LLaVA等)在文档理解任务上的表现会更加出色。Transformers-Tutorials项目也会持续更新,集成更多先进的模型和方法。
如果你对文档解析自动化感兴趣,不妨动手尝试一下这两种方法,体验AI带来的便利。如果你有任何问题或建议,欢迎在项目的GitHub页面提交issue或PR。
参考资料
- Transformers-Tutorials项目
- Donut: OCR-free Document Understanding Transformer
- LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding
- CORD Dataset
希望本文能帮助你快速上手文档信息抽取任务。如果你觉得有用,请点赞、收藏并关注项目,以便获取最新更新。下期我们将介绍如何使用这些模型构建一个完整的文档处理应用,敬请期待!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00