code: def find_cconj_head(heads, upos, start, end):
      """
      Finds how far each word is from the head of a span, then uses the closest CCONJ to the head as the new head
  
      If no CCONJ is present, returns None
      """
      # use head information to extract parse depth
      dynamicDepth = DynamicDepth()
      depth = dynamicDepth.get_parse_depths(heads, start, end)
      depth_limit = 2
  
      # return first 'CCONJ' token above depth limit, if exists
      # unlike the original paper, we expect the parses to use UPOS, hence CCONJ instead of CC
      cc_indexes = [
          i
          for i in range(end - start)
          if upos[i + start] == "CCONJ" and depth[i] < depth_limit
      ]
      if cc_indexes:
          return cc_indexes[0] + start
      return None
  
file_path: stanza/stanza/utils/datasets/coref/convert_ontonotes.py
imports: from collections import defaultdict
  from functools import lru_cache
  import json
  import os
  import stanza
  from stanza.models.constituency import tree_reader
  from stanza.utils.default_paths import get_default_paths
  from stanza.utils.get_tqdm import get_tqdm
label_desc: Use image node_id 1 for calling a global function with example usage: find_cconj_head(heads, upos, start, end) and returns: None, unknown