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.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00
ERNIE-ImageERNIE-Image 是由百度 ERNIE-Image 团队开发的开源文本到图像生成模型。它基于单流扩散 Transformer(DiT)构建,并配备了轻量级的提示增强器,可将用户的简短输入扩展为更丰富的结构化描述。凭借仅 80 亿的 DiT 参数,它在开源文本到图像模型中达到了最先进的性能。该模型的设计不仅追求强大的视觉质量,还注重实际生成场景中的可控性,在这些场景中,准确的内容呈现与美观同等重要。特别是,ERNIE-Image 在复杂指令遵循、文本渲染和结构化图像生成方面表现出色,使其非常适合商业海报、漫画、多格布局以及其他需要兼具视觉质量和精确控制的内容创作任务。它还支持广泛的视觉风格,包括写实摄影、设计导向图像以及更多风格化的美学输出。Jinja00