code: def parse_sentence(sentence_blob: str) -> Tuple[List[Dict[str, str]], List[Tuple[int, int]], List[str]]:
      
      annotated_sentence = []
      arc_indices = []
      arc_tags = []
      predicates = []
  
      lines = [line.split("\t") for line in sentence_blob.split("\n")
               if line and not line.strip().startswith("#")]
      for line_idx, line in enumerate(lines):
          annotated_token = {k:v for k, v in zip(FIELDS, line)}
          if annotated_token['pred'] == "+":
              predicates.append(line_idx)
          annotated_sentence.append(annotated_token)
  
      for line_idx, line in enumerate(lines):
          for predicate_idx, arg in enumerate(line[len(FIELDS):]):
              if arg != "_":
                  arc_indices.append((line_idx, predicates[predicate_idx]))
                  arc_tags.append(arg)
      return annotated_sentence, arc_indices, arc_tags
docs: Parses a chunk of text in the SemEval SDP format.
  
      Each word in the sentence is returned as a dictionary with the following
      format:
      'id': '1',
      'form': 'Pierre',
      'lemma': 'Pierre',
      'pos': 'NNP',
      'head': '2',   # Note that this is the `syntactic` head.
      'deprel': 'nn',
      'top': '-',
      'pred': '+',
      'frame': 'named:x-c'
  
      Along with a list of arcs and their corresponding tags. Note that
      in semantic dependency parsing words can have more than one head
      (it is not a tree), meaning that the list of arcs and tags are
      not tied to the length of the sentence.