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
希望本文能帮助你快速上手文档信息抽取任务。如果你觉得有用,请点赞、收藏并关注项目,以便获取最新更新。下期我们将介绍如何使用这些模型构建一个完整的文档处理应用,敬请期待!
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
请把这个活动推给顶尖程序员😎本次活动专为懂行的顶尖程序员量身打造,聚焦AtomGit首发开源模型的实际应用与深度测评,拒绝大众化浅层体验,邀请具备扎实技术功底、开源经验或模型测评能力的顶尖开发者,深度参与模型体验、性能测评,通过发布技术帖子、提交测评报告、上传实践项目成果等形式,挖掘模型核心价值,共建AtomGit开源模型生态,彰显顶尖程序员的技术洞察力与实践能力。00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00