evaluate_extraction.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import json
  2. from pathlib import Path
  3. def safe_set(value):
  4. if value is None:
  5. return set()
  6. if isinstance(value, list):
  7. return set(map(str, value))
  8. return {str(value)}
  9. def prf1(tp: int, fp: int, fn: int):
  10. p = tp / (tp + fp) if tp + fp else 0.0
  11. r = tp / (tp + fn) if tp + fn else 0.0
  12. f1 = 2 * p * r / (p + r) if p + r else 0.0
  13. return p, r, f1
  14. def evaluate(dataset_path: str):
  15. data = json.loads(Path(dataset_path).read_text(encoding="utf-8"))
  16. # 数据格式示例:
  17. # [{"gold": {"laws": [...]}, "pred": {"laws": [...]}}]
  18. total_tp, total_fp, total_fn = 0, 0, 0
  19. for item in data:
  20. gold = safe_set(item["gold"].get("laws", []))
  21. pred = safe_set(item["pred"].get("laws", []))
  22. total_tp += len(gold & pred)
  23. total_fp += len(pred - gold)
  24. total_fn += len(gold - pred)
  25. p, r, f1 = prf1(total_tp, total_fp, total_fn)
  26. print(
  27. json.dumps(
  28. {"precision": round(p, 4), "recall": round(r, 4), "f1": round(f1, 4)},
  29. ensure_ascii=False,
  30. indent=2,
  31. )
  32. )
  33. if __name__ == "__main__":
  34. import argparse
  35. parser = argparse.ArgumentParser()
  36. parser.add_argument("--dataset", required=True, help="标注评估集 json 路径")
  37. args = parser.parse_args()
  38. evaluate(args.dataset)