deeppavlov/metrics/squad_metrics.py
def squad_v2_f1(y_true: List[List[str]], y_predicted: List[str]) -> float:
    """ Calculates F-1 score between y_true and y_predicted
        F-1 score uses the best matching y_true answer

    The same as in SQuAD-v2.0

    Args:
        y_true: list of correct answers (correct answers are represented by list of strings)
        y_predicted: list of predicted answers

    Returns:
        F-1 score : float
    """
    f1_total = 0.0
    for ground_truth, prediction in zip(y_true, y_predicted):
        prediction_tokens = normalize_answer(prediction).split()
        f1s = []
        for gt in ground_truth:
            gt_tokens = normalize_answer(gt).split()
            if len(gt_tokens) == 0 or len(prediction_tokens) == 0:
                f1s.append(float(gt_tokens == prediction_tokens))
                continue
            common = Counter(prediction_tokens) & Counter(gt_tokens)
            num_same = sum(common.values())
            if num_same == 0:
                f1s.append(0.0)
                continue
            precision = 1.0 * num_same / len(prediction_tokens)
            recall = 1.0 * num_same / len(gt_tokens)
            f1 = (2 * precision * recall) / (precision + recall)
            f1s.append(f1)
        f1_total += max(f1s)
    return 100 * f1_total / len(y_true) if len(y_true) > 0 else 0
def squad_v2_f1(y_true: List[List[str]], y_predicted: List[str]) -> float:
    f1_total = 0.0
    for ground_truth, prediction in zip(y_true, y_predicted):
        prediction_tokens = normalize_answer(prediction).split()
        f1s = []
        for gt in ground_truth:
            gt_tokens = normalize_answer(gt).split()
            if len(gt_tokens) == 0 or len(prediction_tokens) == 0:
                f1s.append(float(gt_tokens == prediction_tokens))
                continue
            common = Counter(prediction_tokens) & Counter(gt_tokens)
            num_same = sum(common.values())
            if num_same == 0:
                f1s.append(0.0)
                continue
            precision = 1.0 * num_same / len(prediction_tokens)
            recall = 1.0 * num_same / len(gt_tokens)
            f1 = (2 * precision * recall) / (precision + recall)
            f1s.append(f1)
        f1_total += max(f1s)
    return 100 * f1_total / len(y_true) if len(y_true) > 0 else 0
def squad_v2_f1 ( y_true : List [ List [ str ] ] , y_predicted : List [ str ] ) -> float : f1_total = 0.0 for ground_truth , prediction in zip ( y_true , y_predicted ) : prediction_tokens = normalize_answer ( prediction ) . split ( ) f1s = [ ] for gt in ground_truth : gt_tokens = normalize_answer ( gt ) . split ( ) if len ( gt_tokens ) == 0 or len ( prediction_tokens ) == 0 : f1s . append ( float ( gt_tokens == prediction_tokens ) ) continue common = Counter ( prediction_tokens ) & Counter ( gt_tokens ) num_same = sum ( common . values ( ) ) if num_same == 0 : f1s . append ( 0.0 ) continue precision = 1.0 * num_same / len ( prediction_tokens ) recall = 1.0 * num_same / len ( gt_tokens ) f1 = ( 2 * precision * recall ) / ( precision + recall ) f1s . append ( f1 ) f1_total += max ( f1s ) return 100 * f1_total / len ( y_true ) if len ( y_true ) > 0 else 0
Calculates F-1 score between y_true and y_predicted
        F-1 score uses the best matching y_true answer

    The same as in SQuAD-v2.0

    Args:
        y_true: list of correct answers (correct answers are represented by list of strings)
        y_predicted: list of predicted answers

    Returns:
        F-1 score : float
Calculates F - 1 score between y_true and y_predicted F - 1 score uses the best matching y_true answer