predict_parser.py (2779B)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from copy import deepcopy 4 from typing import List, Counter, Tuple 5 6 EVENT_EXTRACTION_KEYS = ["trigger-P", "trigger-R", "trigger-F1", 7 "role-P", "role-R", "role-F1"] 8 9 10 class PredictParser: 11 def __init__(self, label_constraint): 12 self.predicate_set = label_constraint.type_list 13 self.role_set = label_constraint.role_list 14 15 def decode(self, gold_list, pred_list, text_list=None, raw_list=None) -> Tuple[List, Counter]: 16 """ 17 18 :param gold_list: 19 :param pred_list: 20 :param text_list: 21 :param raw_list: 22 :return: 23 dict: 24 pred_event -> [(type1, trigger1), (type2, trigger2), ...] 25 gold_event -> [(type1, trigger1), (type2, trigger2), ...] 26 pred_role -> [(type1, role1, argument1), (type2, role2, argument2), ...] 27 gold_role -> [(type1, role1, argument1), (type2, role2, argument2), ...] 28 Counter: 29 """ 30 pass 31 32 @staticmethod 33 def count_multi_event_role_in_instance(instance, counter): 34 if len(instance['gold_event']) != len(set(instance['gold_event'])): 35 counter.update(['multi-same-event-gold']) 36 37 if len(instance['gold_role']) != len(set(instance['gold_role'])): 38 counter.update(['multi-same-role-gold']) 39 40 if len(instance['pred_event']) != len(set(instance['pred_event'])): 41 counter.update(['multi-same-event-pred']) 42 43 if len(instance['pred_role']) != len(set(instance['pred_role'])): 44 counter.update(['multi-same-role-pred']) 45 46 47 class Metric: 48 def __init__(self): 49 self.tp = 0. 50 self.gold_num = 0. 51 self.pred_num = 0. 52 53 @staticmethod 54 def safe_div(a, b): 55 if b == 0.: 56 return 0. 57 else: 58 return a / b 59 60 def compute_f1(self, prefix=''): 61 tp = self.tp 62 pred_num = self.pred_num 63 gold_num = self.gold_num 64 p, r = self.safe_div(tp, pred_num), self.safe_div(tp, gold_num) 65 return {prefix + 'tp': tp, 66 prefix + 'gold': gold_num, 67 prefix + 'pred': pred_num, 68 prefix + 'P': p * 100, 69 prefix + 'R': r * 100, 70 prefix + 'F1': self.safe_div(2 * p * r, p + r) * 100 71 } 72 73 def count_instance(self, gold_list, pred_list, verbose=False): 74 if verbose: 75 print("Gold:", gold_list) 76 print("Pred:", pred_list) 77 self.gold_num += len(gold_list) 78 self.pred_num += len(pred_list) 79 80 dup_gold_list = deepcopy(gold_list) 81 for pred in pred_list: 82 if pred in dup_gold_list: 83 self.tp += 1 84 dup_gold_list.remove(pred)