code: def get_sentence_data(filename) -> List[Dict[str, Any]]:
      """
      Parses a sentence file from the Flickr30K Entities dataset
  
      input:
        filename - full file path to the sentence file to parse
  
      output:
        a list of dictionaries for each sentence with the following fields:
            sentence - the original sentence
            phrases - a list of dictionaries for each phrase with the
                      following fields:
                        phrase - the text of the annotated phrase
                        first_word_index - the position of the first word of
                                           the phrase in the sentence
                        phrase_id - an identifier for this phrase
                        phrase_type - a list of the coarse categories this
                                      phrase belongs to
  
      """
      with open(filename, "r") as f:
          sentences = f.read().split("\n")
  
      annotations = []
      for sentence in sentences:
          if not sentence:
              continue
  
          first_word = []
          phrases = []
          phrase_id = []
          phrase_type = []
          words = []
          current_phrase = []
          add_to_phrase = False
          for token in sentence.split():
              if add_to_phrase:
                  if token[-1] == "]":
                      add_to_phrase = False
                      token = token[:-1]
                      current_phrase.append(token)
                      phrases.append(" ".join(current_phrase))
                      current_phrase = []
                  else:
                      current_phrase.append(token)
  
                  words.append(token)
              else:
                  if token[0] == "[":
                      add_to_phrase = True
                      first_word.append(len(words))
                      parts = token.split("/")
                      phrase_id.append(parts[1][3:])
                      phrase_type.append(parts[2:])
                  else:
                      words.append(token)
  
          sentence_data = {"sentence": " ".join(words), "phrases": []}
          for index, phrase, p_id, p_type in zip(
              first_word, phrases, phrase_id, phrase_type
          ):
              sentence_data["phrases"].append(
                  {
                      "first_word_index": index,
                      "phrase": phrase,
                      "phrase_id": p_id,
                      "phrase_type": p_type,
                  }
              )
  
          annotations.append(sentence_data)
  
      return annotations
  
imports: import xml.etree.ElementTree
  from collections import defaultdict
  from pathlib import Path
  from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
  import numpy
  from prettytable import PrettyTable
  from tqdm import tqdm
  import json
  import os
  import re
label_desc: Use image node_id 4 for calling a global function with example usage: get_sentence_data(filename) and returns: annotations