diff --git a/scorer.py b/scorer.py index 5c4ce1f8320e8ac1d072026c22e965953b4f8c89..569dfaebeb35b2eff6f36fa91ffedeb4741367d6 100644 --- a/scorer.py +++ b/scorer.py @@ -24,9 +24,9 @@ class ODRL: graph.parse(odrl_fname) odrl_ns = "http://www.w3.org/ns/odrl/2/" ccrel_ns = "http://creativecommons.org/ns#" - perm_node = None - obl_node = None - proh_node = None + perm_nodes = [] + obl_nodes = [] + proh_nodes = [] actions = {} # action listing for every blank node # List actions and modalities @@ -34,22 +34,22 @@ class ODRL: src, prop, tgt = str(src), str(prop), str(tgt) if prop == odrl_ns + "permission": self.has_perm = True - perm_node = tgt + perm_nodes.append(tgt) elif prop == odrl_ns + "obligation": self.has_obl = True - obl_node = tgt + obl_nodes.append(tgt) elif prop == odrl_ns + "prohibition": self.has_proh = True - proh_node = tgt + proh_nodes.append(tgt) elif prop == odrl_ns + "action": if src not in actions: actions[src] = [] actions[src].append(tgt) # Link modalities with actions for node in actions: - if node == perm_node: mod = self.perm - elif node == obl_node: mod = self.obl - elif node == proh_node: mod = self.proh + if node in perm_nodes: mod = self.perm + elif node in obl_nodes: mod = self.obl + elif node in proh_nodes: mod = self.proh else: print("Warning: ill-formed ODRL") for act in actions[node]: mod.append(act) @@ -100,10 +100,18 @@ class Scores: self.scores[crit]["fn"] += 1 def get_precision(self, crit): - return self.scores[crit]["tp"]/(self.scores[crit]["tp"] + self.scores[crit]["fp"]) + tp = self.scores[crit]["tp"] + fp = self.scores[crit]["fp"] + if tp + fp != 0: + return tp/(tp + fp) + else: return None def get_recall(self, crit): - return self.scores[crit]["tp"]/(self.scores[crit]["tp"] + self.scores[crit]["fn"]) + tp = self.scores[crit]["tp"] + fn = self.scores[crit]["fn"] + if tp + fn != 0: + return tp/(tp + fn) + else: return None def get_total_precision(self): tot_tp = 0 @@ -111,7 +119,9 @@ class Scores: for crit in self.scores: tot_tp += self.scores[crit]["tp"] tot_fp += self.scores[crit]["fp"] - return tot_tp/(tot_tp + tot_fp) + if tot_tp + tot_fp != 0: + return tot_tp/(tot_tp + tot_fp) + else: return None def get_total_recall(self): tot_tp = 0 @@ -119,7 +129,9 @@ class Scores: for crit in self.scores: tot_tp += self.scores[crit]["tp"] tot_fn += self.scores[crit]["fn"] - return tot_tp/(tot_tp + tot_fn) + if tot_tp + tot_fn != 0: + return tot_tp/(tot_tp + tot_fn) + else: return None def __str__(self): s = ""