def write_table(metrics1: MetricsDict, metrics2: MetricsDict,
                difference: MetricsDict, rel_difference: MetricsDict,
                output_path: str) -> None:
    # Put all of the data into tuples and sort by the relative difference
    data = []
    for key in rel_difference.keys():
        if 'f1' in rel_difference[key]:
            value1 = metrics1[key]['f1']
            value2 = metrics2[key]['f1']
            data.append((key, value1, value2, difference[key]['f1'],
                         rel_difference[key]['f1']))
    data.sort(key=lambda t: -t[4])

    # Prepare the lines for writing
    lines = []
    for category, value1, value2, diff, rel_diff in data:
        lines.append(' & '.join([
            category, f'{value1:.1f}', f'{value2:.1f}', f'{diff:.1f}',
            f'{rel_diff:.1f}'
        ]) + ' \\\\')

    dirname = os.path.dirname(output_path)
    if dirname:
        os.makedirs(dirname, exist_ok=True)
    with open(output_path, 'w') as out:
        out.write('\n'.join(lines))
Example #2
0
    def _combine_metrics(self, recall_metrics: MetricsDict,
                         precision_metrics: MetricsDict) -> MetricsDict:
        combined = MetricsDict()
        combined.update(recall_metrics)
        combined.update(precision_metrics)

        for key in combined.keys():
            if 'precision' and 'recall' in combined[key]:
                precision = combined[key]['precision']
                recall = combined[key]['recall']
                f1 = 0.0
                if precision + recall != 0.0:
                    f1 = 2 * (precision * recall) / (precision + recall)
                combined[key]['f1'] = f1

        return combined