| """Evaluate a summarization checkpoint with ROUGE and corpus BLEU.""" |
|
|
| import argparse |
| import json |
|
|
| import evaluate |
| from datasets import load_dataset |
| from transformers import pipeline |
|
|
| from train import DATASETS |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--model", default="sshleifer/distilbart-cnn-12-6") |
| parser.add_argument("--dataset", choices=DATASETS, default="cnn_dailymail") |
| parser.add_argument("--split", default="test") |
| parser.add_argument("--samples", type=int, default=100) |
| parser.add_argument("--batch-size", type=int, default=4) |
| parser.add_argument("--output", default="evaluation_results.json") |
| return parser.parse_args() |
|
|
|
|
| def main(): |
| args = parse_args() |
| config = DATASETS[args.dataset] |
| data = load_dataset(config["path"], config["name"], split=args.split) |
| data = data.select(range(min(args.samples, len(data)))) |
| summarizer = pipeline("summarization", model=args.model, device_map="auto") |
| predictions = [] |
|
|
| for start in range(0, len(data), args.batch_size): |
| texts = data[start : start + args.batch_size][config["text"]] |
| outputs = summarizer( |
| texts, |
| truncation=True, |
| max_length=128, |
| min_length=20, |
| num_beams=4, |
| ) |
| predictions.extend(item["summary_text"] for item in outputs) |
|
|
| references = list(data[config["summary"]]) |
| rouge = evaluate.load("rouge").compute( |
| predictions=predictions, |
| references=references, |
| use_stemmer=True, |
| ) |
| bleu = evaluate.load("bleu").compute( |
| predictions=predictions, |
| references=[[reference] for reference in references], |
| ) |
| results = { |
| **{key: round(value * 100, 4) for key, value in rouge.items()}, |
| "bleu": round(bleu["bleu"] * 100, 4), |
| "model": args.model, |
| "dataset": args.dataset, |
| "samples": len(data), |
| } |
| with open(args.output, "w", encoding="utf-8") as file: |
| json.dump(results, file, indent=2) |
| print(json.dumps(results, indent=2)) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|