extraction_metrics.py (2831B)
1 from typing import List 2 3 from extraction.event_schema import EventSchema 4 from extraction.predict_parser.predict_parser import Metric 5 from extraction.predict_parser.tree_predict_parser import TreePredictParser, ListPredictParser 6 from data_convert.ucdp_fields import UCDP_FIELDS 7 8 decoding_format_dict = { 9 'tree': TreePredictParser, 10 'list': ListPredictParser, 11 'treespan': TreePredictParser, 12 } 13 14 15 def get_predict_parser(format_name): 16 return decoding_format_dict[format_name] 17 18 19 def eval_pred(predict_parser, gold_list, pred_list, text_list=None, raw_list=None): 20 well_formed_list, counter = predict_parser.decode( 21 gold_list, pred_list, text_list, raw_list) 22 23 event_metric = Metric() 24 role_metric = Metric() 25 ucdp_metric = {role: 0 for role, _, _ in UCDP_FIELDS} 26 27 for instance in well_formed_list: 28 event_metric.count_instance(instance['gold_event'], 29 instance['pred_event']) 30 role_metric.count_instance(instance['gold_role'], 31 instance['pred_role'], 32 verbose=False) 33 gold_dict = {role: argument for etype, role, argument in instance["gold_role"]} 34 pred_dict = {role: argument for etype, role, argument in instance["pred_role"]} 35 for role, _, _ in UCDP_FIELDS: 36 if role not in gold_dict: 37 continue 38 if gold_dict[role] == pred_dict.get(role): 39 ucdp_metric[role] += 1 40 41 for role, count in ucdp_metric.items(): 42 ucdp_metric[role] = count / len(well_formed_list) 43 ucdp_agg = {category: 0 for _, _, category in UCDP_FIELDS} 44 for role, _, category in UCDP_FIELDS: 45 ucdp_agg[category] += ucdp_metric[role] 46 for category, total in ucdp_agg.items(): 47 ucdp_agg[category] = total / [category for _, _, category in UCDP_FIELDS].count(category) 48 aggregate = sum(ucdp_agg.values()) / len(ucdp_agg) 49 ucdp_metric.update(ucdp_agg) 50 ucdp_metric["aggregate"] = aggregate 51 52 53 trigger_result = event_metric.compute_f1(prefix='trigger-') 54 role_result = role_metric.compute_f1(prefix='role-') 55 56 result = dict() 57 result.update(trigger_result) 58 result.update(role_result) 59 result['AVG-F1'] = trigger_result.get('trigger-F1', 0.) + \ 60 role_result.get('role-F1', 0.) 61 result.update(counter) 62 63 for role, accuracy in ucdp_metric.items(): 64 result["UCDP-" + role + "-acc"] = accuracy 65 66 return result 67 68 69 def get_extract_metrics(pred_lns: List[str], tgt_lns: List[str], label_constraint: EventSchema, decoding_format='tree'): 70 predict_parser = get_predict_parser(format_name=decoding_format)( 71 label_constraint=label_constraint) 72 return eval_pred( 73 predict_parser=predict_parser, 74 gold_list=tgt_lns, 75 pred_list=pred_lns 76 )