diff --git a/utils/relation_eval.py b/utils/relation_eval.py index 2f76c8ab2c7a779e8da312c362729c1679faeafc..7c5faba56cf941623b797a8c6b9c405c8367d0e2 100755 --- a/utils/relation_eval.py +++ b/utils/relation_eval.py @@ -67,36 +67,39 @@ class RelStats : #if there was a hit on both sides of relation (dir_from, dir_to) then update counters def update_stats(self, both, chun, head) : - if chun == 2 : - self.any_hits += 1 - if head == 2 : - self.both_hits += 1 - else : - self.chun_hits += 1 - elif head == 2 : - self.any_hits += 1 + if chun == 2 : + self.chun_hits+=1 + if head == 2 : self.head_hits += 1 + if chun == 2 and head == 2 : + self.both_hits += 1 + if chun == 2 or head == 2: + self.any_hits+=1 - def print_stats(self,ref_rels_count, target_rels_count): + def print_stats(self,ref_rels_count, target_rels_count, stat_mode): p = 0.0 if target_rels_count == 0 else 100.0 * self.any_hits / target_rels_count r = 0.0 if ref_rels_count == 0 else 100.0 * self.any_hits / ref_rels_count f = 0.0 if p + r == 0.0 else 2.0 * p * r / (p + r) - print ('Any chunk or head match:\t') + if not stat_mode : + print ('Any chunk or head match:\t') print '%.2f\t%.2f\t%.2f' % (p, r, f) p = 0.0 if target_rels_count == 0 else 100.0 * self.both_hits / target_rels_count r = 0.0 if ref_rels_count == 0 else 100.0 * self.both_hits / ref_rels_count f = 0.0 if p + r == 0.0 else 2.0 * p * r / (p + r) - print ('Chunk and head match:\t') + if not stat_mode : + print ('Chunk and head match:\t') print '%.2f\t%.2f\t%.2f' % (p, r, f) p = 0.0 if target_rels_count == 0 else 100.0 * self.chun_hits / target_rels_count r = 0.0 if ref_rels_count == 0 else 100.0 * self.chun_hits / ref_rels_count f = 0.0 if p + r == 0.0 else 2.0 * p * r / (p + r) - print ('Chunk match:\t') + if not stat_mode : + print ('Chunk match:\t') print '%.2f\t%.2f\t%.2f' % (p, r, f) p = 0.0 if target_rels_count == 0 else 100.0 * self.head_hits / target_rels_count r = 0.0 if ref_rels_count == 0 else 100.0 * self.head_hits / ref_rels_count f = 0.0 if p + r == 0.0 else 2.0 * p * r / (p + r) - print ('Head match:\t') + if not stat_mode : + print ('Head match:\t') print '%.2f\t%.2f\t%.2f' % (p, r, f) def compare(rel1, rel2) : @@ -137,15 +140,19 @@ def go(): parser.add_option('-t', '--tagset', type='string', action='store', dest='tagset', default='nkjp', help='set the tagset used in input; default: nkjp') + parser.add_option('-s', '--stat', action='store_true', + dest='stat_mode', + help='output P,R,f with no text labels, order like in normal mode: \n Chunks or heads \n Chunks and heads \n Chunks match \n Heads match') (options, args) = parser.parse_args() + stat_mode = options.stat_mode + if len(args) != 3: sys.stderr.write('No args. See --help\n') sys.exit(1) batch_ref, batch_target, rel_name = args - rel_stats = RelStats() corpus_type = "document" @@ -198,7 +205,7 @@ def go(): line_ref = ref_file.readline() line_target = target_file.readline() - rel_stats.print_stats(ref_count, target_count) + rel_stats.print_stats(ref_count, target_count, stat_mode) if __name__ == '__main__': go()