Identify that certain predicates are part of a multiword predicate
    (e.g., "decided to run") in which case, we don't need to return
    the embedded predicate ("run").

def consolidate_predictions(outputs: List[List[str]], sent_tokens: List[Token]) -> Dict[str, List[str]]:
    """
    Identify that certain predicates are part of a multiword predicate
    (e.g., "decided to run") in which case, we don't need to return
    the embedded predicate ("run").
    """
    pred_dict: Dict[str, List[str]] = {}
    merged_outputs = [join_mwp(output) for output in outputs]
    predicate_texts = [get_predicate_text(sent_tokens, tags)
                       for tags in merged_outputs]

    for pred1_text, tags1 in zip(predicate_texts, merged_outputs):
        # A flag indicating whether to add tags1 to predictions
        add_to_prediction = True

        #  Check if this predicate overlaps another predicate
        for pred2_text, tags2 in pred_dict.items():
            if predicates_overlap(tags1, tags2):
                # tags1 overlaps tags2
                pred_dict[pred2_text] = merge_overlapping_predictions(tags1, tags2)
                add_to_prediction = False

        # This predicate doesn't overlap - add as a new predicate
        if add_to_prediction:
            pred_dict[pred1_text] = tags1

    return pred_dict