#!/usr/bin/env python3 # -*- coding: utf-8 -*- """P2 验收器: dsh 输出的答案 id 提取 → 本体机器对拍 (验收=句句可溯 + 判级词与对象一致, 非人读). 用法: .venv/bin/python scripts/ontology_p2_verify.py """ import json, pathlib, re, sys ROOT = pathlib.Path(__file__).resolve().parent.parent OBJ = json.loads((ROOT / 'outputs/rudong/ontology/objects.json').read_text(encoding='utf-8')) # 事实契约 id (claim/): 离线问答接契约后 (2026-09-06) 答案会引用它, 对象不在本体而在契约里. _CP = ROOT / 'outputs/rudong/guanlan/facts_contract_v0.json' CLAIMS = {c['claim_id']: c for c in json.loads(_CP.read_text(encoding='utf-8')).get('claims', [])} if _CP.is_file() else {} def _unit_aliases(): try: import re as _re from src.windscada.deid import unit_map ids = sorted(set(_re.findall(r'WTG(\d{2})', '\n'.join(OBJ.keys())))) return {alias: 'WTG' + raw for raw, alias in unit_map(ids).items()} except Exception: return {} UNIT_ALIAS = _unit_aliases() def _canonical_id(oid): out = oid for alias, raw in sorted(UNIT_ALIAS.items(), key=lambda kv: -len(kv[0])): out = re.sub(r'(? 2 else 'zh' r = verify(p.read_text(encoding='utf-8'), lang=lang) print(json.dumps(r, ensure_ascii=False, indent=1, default=str)) sys.exit(0 if r['全通过'] else 2)