UCDP-AEC

Models and data for the UCDP Abstractive Event analysis Corpus paper
git clone https://esimon.eu/repos/UCDP-AEC.git
Log | Files | Refs | README | LICENSE

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)