首页
/ 10分钟搞定文档信息抽取:Transformers-Tutorials的CORD数据集实战指南

10分钟搞定文档信息抽取:Transformers-Tutorials的CORD数据集实战指南

2026-02-05 05:11:47作者:丁柯新Fawn

你是否还在为合同、发票、简历等文档中的关键信息手动复制粘贴而烦恼?面对成百上千份文档,人工提取不仅耗时耗力,还容易出错。本文将带你使用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)文件。这里我们简要介绍关键步骤:

  1. 定义模型和分词器
  2. 数据预处理
  3. 定义训练器
  4. 开始训练

快速推理

如果你不想训练模型,也可以直接使用预训练模型进行推理。项目中提供了一个快速推理的示例: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

数据预处理的主要步骤包括:

  1. 加载CORD数据集
  2. 提取文本和边界框信息
  3. 将标签转换为IOB格式
  4. 保存为JSON文件

模型训练

使用LayoutLMv2进行Token分类的训练代码可以参考:Fine_tuning_LayoutLMv2ForTokenClassification_on_CORD.ipynb

关键步骤包括:

  1. 加载预处理后的数据
  2. 创建LabelEncoder
  3. 定义LayoutLMv2模型
  4. 使用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。

参考资料

希望本文能帮助你快速上手文档信息抽取任务。如果你觉得有用,请点赞、收藏并关注项目,以便获取最新更新。下期我们将介绍如何使用这些模型构建一个完整的文档处理应用,敬请期待!

登录后查看全文
热门项目推荐
相关项目推荐