From c1c2761c7985b971cc60e36064928459249f50e6 Mon Sep 17 00:00:00 2001 From: Franck Dary <franck.dary@lis-lab.fr> Date: Thu, 18 Feb 2021 10:16:11 +0100 Subject: [PATCH] Added option mean to printResults --- UD_any/print_results.py | 54 ++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/UD_any/print_results.py b/UD_any/print_results.py index e1eeb68..21a4d94 100755 --- a/UD_any/print_results.py +++ b/UD_any/print_results.py @@ -1,12 +1,25 @@ #! /usr/bin/env python3 +import argparse import glob import sys import math +import copy ################################################################################ if __name__ == "__main__" : + parser = argparse.ArgumentParser() + parser.add_argument("dir", type=str, default="", + help="Directory containing the .stdout (scores) files.") + parser.add_argument("--score", "-s", type=str, default="F1", + help="Name of the score to report (F1,L1,L2,R2).") + parser.add_argument("--metrics", type=str, default="Sentences,LAS,UAS,Lemmas,UFeats,UPOS,Words,Tokens", + help="Comma separated list of metrics.") + parser.add_argument("--mean", "-m", default=False, action="store_true", + help="compute the mean of metrics.") + args = parser.parse_args() + scoreTypes = { "F1" : ["F1.score","%",-1,"%.2f"], "R2" : ["R²","",-3,"%.4f"], @@ -14,15 +27,17 @@ if __name__ == "__main__" : "L2" : ["L2","",-2,"%.2f"], } - scoreType = scoreTypes["F1"] if len(sys.argv) < 3 else scoreTypes[sys.argv[2].upper()] + scoreType = scoreTypes[args.score.upper()] - metrics = ["Sentences","LAS","UAS","Lemmas","UFeats","UPOS","Words","Tokens"] + metrics = args.metrics.split(',') + usedMetrics = [] + mean = args.mean output = [] outputByModelScore = dict() - filenamesErr = glob.iglob((sys.argv[1]+"/"if len(sys.argv) > 1 else "") + '*stderr') - filenamesOut = glob.iglob((sys.argv[1]+"/"if len(sys.argv) > 1 else "") + '*stdout') + filenamesErr = glob.iglob((args.dir+"/"if len(args.dir) > 1 else "") + '*stderr') + filenamesOut = glob.iglob((args.dir+"/"if len(args.dir) > 1 else "") + '*stdout') for pathToFile in filenamesErr : for line in open(pathToFile, "r") : @@ -46,10 +61,31 @@ if __name__ == "__main__" : if model not in outputByModelScore[corpus] : outputByModelScore[corpus][model] = dict() - if splited[0] not in outputByModelScore[corpus][model] : - outputByModelScore[corpus][model][splited[0]] = [] - - outputByModelScore[corpus][model][splited[0]].append([corpus, splited[0], splited[scoreType[2]], model]) + if metric not in outputByModelScore[corpus][model] : + outputByModelScore[corpus][model][metric] = [] + if metric not in usedMetrics : + usedMetrics.append(metric) + + outputByModelScore[corpus][model][metric].append([corpus, metric, splited[scoreType[2]], model]) + + for metric in metrics : + if metric not in usedMetrics : + print("WARNING : Unused metric '%s'"%metric, file=sys.stderr) + + if mean : + metricName = ",".join(metrics) + for corpus in outputByModelScore : + for model in outputByModelScore[corpus] : + nbRedo = len((list(outputByModelScore[corpus][model].values())[0])) + newMetrics = copy.deepcopy(list(outputByModelScore[corpus][model].values())[0]) + for elem in newMetrics : + elem[2] = 0 + elem[1] = metricName + for redo in range(nbRedo) : + for metric in outputByModelScore[corpus][model] : + newMetrics[redo][2] += float(outputByModelScore[corpus][model][metric][redo][2]) + newMetrics[redo][2] /= len(metrics) + outputByModelScore[corpus][model] = {metricName : newMetrics} for corpus in outputByModelScore : for model in outputByModelScore[corpus] : @@ -73,7 +109,7 @@ if __name__ == "__main__" : score = score.replace('-','') output.append(outputByModelScore[corpus][model][metric][0]) output[-1][2] = score - output[-1] = [output[-1][0]] + [metrics.index(output[-1][1])] + [output[-1][1]] + [baseScore] + output[-1][2:] + output[-1] = [output[-1][0]] + ([0] if mean else [metrics.index(output[-1][1])]) + [output[-1][1]] + [baseScore] + output[-1][2:] if len(output) == 0 : print("ERROR : Output length is 0", file=sys.stderr) -- GitLab