From 38520c3b30c31f339633ebbf5ae1d864b17358a3 Mon Sep 17 00:00:00 2001
From: Franck Dary <franck.dary@lis-lab.fr>
Date: Tue, 26 Nov 2019 15:21:15 +0100
Subject: [PATCH] Updated print_result.py script to compute standard deviation

---
 UD_any/print_results.py | 34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/UD_any/print_results.py b/UD_any/print_results.py
index e4ac9ca..7b1abe3 100755
--- a/UD_any/print_results.py
+++ b/UD_any/print_results.py
@@ -2,29 +2,57 @@
 
 import glob
 import sys
+import math
 
 if __name__ == "__main__" :
 
   metrics = ["LAS","UAS","Tokens","Sentences","UPOS","UFeats","Lemmas"]
 
   output = []
+  outputByModelScore = dict()
 
   for pathToFile in glob.iglob("" + '*stdout') :
-    model = pathToFile.split(".")[0].split("_UD_")[0]
-    corpus = pathToFile.split(".")[0].split("_UD_")[1]
+    model = pathToFile.split("_UD_")[0]
+    corpus = pathToFile.split("_UD_")[1].split('.')[0]
 
     for line in open(pathToFile, "r") :
       for metric in metrics :
         if metric in line and metric[0] == line[0]:
           splited = line.strip().replace("|","").split()
-          output.append([corpus, splited[0], splited[3], model])
+
+          model = model.split('.')[0]
+
+          if model not in outputByModelScore :
+            outputByModelScore[model] = dict()
+          if splited[0] not in outputByModelScore[model] :
+            outputByModelScore[model][splited[0]] = []
+
+          outputByModelScore[model][splited[0]].append([corpus, splited[0], splited[3], model])
+
+  for model in outputByModelScore :
+    for metric in outputByModelScore[model] :
+      score = 0.0
+      standardDeviation = 0.0
+      for exp in outputByModelScore[model][metric] :
+        score += float(exp[2])
+      score /= len(outputByModelScore[model][metric])
+      for exp in outputByModelScore[model][metric] :
+        standardDeviation += (float(exp[2])-score)**2
+      standardDeviation /= len(outputByModelScore[model][metric])-1
+      standardDeviation = math.sqrt(standardDeviation)
+      score = "%.2f[±%.2f]%%"%(score,standardDeviation)
+      output.append(outputByModelScore[model][metric][0])
+      output[-1][2] = score
 
   maxColLens = [0 for _ in range(len(output[0]))]
 
+  output = [["Corpus","Metric","F1.score","Model"]] + output
+
   for line in output :
     for i in range(len(line)) :
       maxColLens[i] = max(maxColLens[i], len(line[i]))
 
+  output = output[1:]
   output.sort()
   output = [["Corpus","Metric","F1.score","Model"]] + output
 
-- 
GitLab