如何用巴西葡语法律自定义数据集训练FLAN-T5完成摘要任务?
基于FLAN-T5训练巴西葡萄牙语法律文本摘要模型的实现步骤
一、数据预处理
- 配对与格式转换:将每份诉状文本和对应的摘要一一配对,整理成CSV或JSONL格式,每条数据包含
input_text(诉状内容)和target_text(摘要内容)。确保文件名对应(比如complaint_0001.txt对应summary_0001.txt),用Python批量读取并生成结构化数据集。 - 文本清洗:去除法律文本中的冗余格式(多余换行、空格、页眉页脚),统一编码为UTF-8避免乱码。可通过正则表达式
re.sub(r'\s+', ' ', text)合并多余空格,用strip()清理首尾空白。 - 数据集划分:按8:1:1的比例将2000对数据划分为训练集、验证集和测试集,确保三组数据的法律文本类型分布均衡,避免数据泄露。
二、环境与依赖准备
安装Hugging Face生态的核心依赖库:
pip install transformers datasets evaluate accelerate sentencepiece
选择基础模型:优先使用google/flan-t5-base(资源有限可选google/flan-t5-small,追求效果用google/flan-t5-large),FLAN-T5的多语言能力可直接适配葡萄牙语法律文本任务。
三、模型微调
加载数据集
用datasets库加载本地结构化数据:from datasets import load_dataset dataset = load_dataset("csv", data_files="legal_summarization_data.csv")或从Pandas DataFrame转换:
from datasets import Dataset import pandas as pd df = pd.read_csv("legal_summarization_data.csv") dataset = Dataset.from_pandas(df)分词与格式化
FLAN-T5依赖任务提示词提升效果,对输入文本添加summarize:前缀,然后进行分词处理:from transformers import AutoTokenizer model_name = "google/flan-t5-base" tokenizer = AutoTokenizer.from_pretrained(model_name) def preprocess_function(examples): inputs = [f"summarize: {text}" for text in examples["input_text"]] model_inputs = tokenizer(inputs, max_length=1024, truncation=True, padding="max_length") labels = tokenizer(text_target=examples["target_text"], max_length=150, truncation=True, padding="max_length") model_inputs["labels"] = labels["input_ids"] return model_inputs tokenized_dataset = dataset.map(preprocess_function, batched=True)配置训练参数
设置训练的核心参数,根据GPU显存调整批量大小:from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer training_args = Seq2SeqTrainingArguments( output_dir="./flan-t5-legal-summarizer", per_device_train_batch_size=4, per_device_eval_batch_size=4, num_train_epochs=4, logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", learning_rate=2e-5, weight_decay=0.01, predict_with_generate=True, fp16=True # 启用混合精度训练,加速训练过程 )添加评估指标
用ROUGE指标评估摘要质量:import evaluate import numpy as np rouge = evaluate.load("rouge") def compute_metrics(eval_pred): predictions, labels = eval_pred decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True) labels = np.where(labels != -100, labels, tokenizer.pad_token_id) decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True) result = rouge.compute(predictions=decoded_preds, references=decoded_labels, use_stemmer=True) return {k: round(v * 100, 2) for k, v in result.items()}启动训练
初始化训练器并开始训练:from transformers import AutoModelForSeq2SeqLM model = AutoModelForSeq2SeqLM.from_pretrained(model_name) trainer = Seq2SeqTrainer( model=model, args=training_args, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset["validation"], tokenizer=tokenizer, compute_metrics=compute_metrics ) trainer.train()
四、推理与测试
加载微调后的模型,对新的法律诉状生成摘要:
model = AutoModelForSeq2SeqLM.from_pretrained("./flan-t5-legal-summarizer/checkpoint-best") tokenizer = AutoTokenizer.from_pretrained("./flan-t5-legal-summarizer/checkpoint-best") def generate_summary(complaint_text): input_text = f"summarize: {complaint_text}" inputs = tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True).to("cuda") outputs = model.generate(**inputs, max_new_tokens=150, num_beams=4, early_stopping=True) return tokenizer.decode(outputs[0], skip_special_tokens=True) # 测试示例 sample_complaint = open("test_complaint.txt", "r", encoding="utf-8").read() print(generate_summary(sample_complaint))
关键注意事项
- GPU资源:若无GPU,可使用CPU训练但速度极慢,优先选择带CUDA的GPU(如Colab免费GPU)。
- 过拟合防控:若验证集ROUGE指标持续下降,可设置
early_stopping_patience=2提前终止训练,或降低训练轮数。 - 提示词优化:若效果未达预期,可将提示词改为更明确的法律场景描述,比如
"summarize the legal complaint in Brazilian Portuguese: " + input_text。
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

