code: def get_vocab() -> Tuple[Dict[str, List[str]], Dict[str, List[str]]]:
      """All potential subjects for the facts and rules for sythetic_reasoning_natural as well as their categories.
      Subjects is a dictionary of subject categories like "person" and "animal" which correspond to
      a list of potential subjects.
  
      Attributes corresponds to an initial list of attributes which are only synonymous with themselves.
      Intially, we default to not including these attributes, but we leave this feature in for convenience.
  
      Attribute groups are a more general version of attributes, where a single attribute corresponds to a class of
      attributes e.g. if we know something is chilly, we know that it is cold (but not assuming the reverse).
      """
  
      # A list of subjects and their categories
      subjects: Dict[str, List[str]] = {
          "person": ["Alice", "Bob", "Carol", "Dan", "Erin", "Frank"],
          "animal": [
              "dog",
              "cat",
              "rabbit",
              "mouse",
              "tiger",
              "lion",
              "bear",
              "squirrel",
              "cow",
              "panda",
              "hedgehog",
              "elephant",
              "giraffe",
              "hippo",
          ],
          "plant": ["poppy", "dandelion", "tree", "rose", "sunflower"],
      }
  
      # Convert list of attributes into dictionary
      # A list of attributes and their overarching meaning (used in hard difficulty)
      attribute_groups = {
          "young": ["young"],
          "soft": ["soft"],
          "sad": ["sad"],
          "scary": ["scary"],
          "cold": ["cold", "chill", "cool"],
          "hot": ["hot", "warm"],
          "smart": ["smart", "clever", "wise", "intelligent"],
          "clean": ["clean", "tidy"],
          "small": ["small", "little", "tiny"],
          "big": ["big", "enormous", "giant", "huge"],
          "good": ["good", "kind", "nice"],
          "beautiful": ["beautiful", "pretty"],
          "red": ["red", "crimson"],
          "blue": ["blue", "cobalt"],
          "green": ["green", "viridian"],
          "purple": ["purple", "violet"],
          "boring": ["boring", "dull"],
          "old": ["old", "ancient", "antique"],
          "strong": ["strong", "powerful", "muscular"],
          "weak": ["weak", "frail", "fragile"],
          "fast": ["fast", "quick"],
          "slow": ["slow", "sluggish"],
          "bad": ["bad", "evil", "wicked", "mean"],
          "happy": ["happy", "elated", "glad", "cheerful"],
          "round": ["round", "circular", "spherical"],
      }
      # Remove any keys which duplicate subitems
      new_attribute_groups: Dict[str, List[str]] = copy(
          attribute_groups
      )
      for (
          general_attribute,
          specific_attributes,
      ) in attribute_groups.items():
          for specific_attribute in specific_attributes:
              if (general_attribute != specific_attribute) and (
                  specific_attribute in attribute_groups
              ):
                  del new_attribute_groups[specific_attribute]
  
      return new_attribute_groups, subjects
  
imports: import random
  import dataclasses
  from copy import copy
  from typing import List, Dict, Literal, Tuple
  from dataclasses import dataclass
  from .scenario import Scenario, Instance, Reference, TRAIN_SPLIT, VALID_SPLIT, TEST_SPLIT, CORRECT_TAG, Input, Output
label_desc: Use image node_id 1 for calling a global function with example usage: get_vocab() and returns: new_attribute_groups,  subjects