def evaluate(insts: List[Instance],
             predictions: List[List[str]],
             print_details: bool = False) -> None:
    """
        Evaluation
    """
    p_dict = defaultdict(int)
    total_entity_dict = defaultdict(int)
    total_predict_dict = defaultdict(int)
    for i, inst in enumerate(insts):
        ground_truth = inst.ground_truth
        prediction = predictions[i]
        inst.prediction = prediction
        output_spans = set()
        start = -1
        for i in range(len(ground_truth)):
            if ground_truth[i].startswith("B-"):
                start = i
            if ground_truth[i].startswith("E-"):
                end = i
                output_spans.add(Span(start, end, ground_truth[i][2:]))
                total_entity_dict[ground_truth[i][2:]] += 1
            if ground_truth[i].startswith("S-"):
                output_spans.add(Span(i, i, ground_truth[i][2:]))
                total_entity_dict[ground_truth[i][2:]] += 1
        predict_spans = set()
        start = -1
        for i in range(len(prediction)):
            if prediction[i].startswith("B-"):
                start = i
            if prediction[i].startswith("E-"):
                end = i
                predict_spans.add(Span(start, end, prediction[i][2:]))
                total_predict_dict[prediction[i][2:]] += 1
            if prediction[i].startswith("S-"):
                predict_spans.add(Span(i, i, prediction[i][2:]))
                total_predict_dict[prediction[i][2:]] += 1

        correct_spans = predict_spans.intersection(output_spans)
        for span in correct_spans:
            p_dict[span.type] += 1

    if print_details:
        for key in total_entity_dict:
            precision, recall, fscore = get_metric(
                p_num=p_dict[key],
                total_predicted_num=total_predict_dict[key],
                total_num=total_entity_dict[key])
            print("[%s] Prec.: %.2f, Rec.: %.2f, F1: %.2f" %
                  (key, precision, recall, fscore))

    total_p = sum(list(p_dict.values()))
    total_predict = sum(list(total_predict_dict.values()))
    total_entity = sum(list(total_entity_dict.values()))
    precision, recall, fscore = get_metric(p_num=total_p,
                                           total_predicted_num=total_predict,
                                           total_num=total_entity)
    print("[Total] Prec.: %.2f, Rec.: %.2f, F1: %.2f" %
          (precision, recall, fscore),
          flush=True)
Esempio n. 2
0
def get_spans(output):
    output_spans = set()
    start = -1
    for i in range(len(output)):
        if output[i].startswith("B-"):
            start = i
        if output[i].startswith("E-"):
            end = i
            output_spans.add(Span(start, end, output[i][2:]))
        if output[i].startswith("S-"):
            output_spans.add(Span(i, i, output[i][2:]))
    return output_spans