docs: def get_pubtator(pmid):
      """Get Pubtator Bioconcepts from Pubmed Abstract
  
      Re-configure the denotations into an annotation dictionary format
      and collapse duplicate terms so that their spans are in a list.
      """
      r = get_url(PUBTATOR_TMPL.replace("PMID", pmid), timeout=10)
      if r and r.status_code == 200:
          pubtator = r.json()[0]
      else:
          log.error(
              f"Cannot access Pubtator, status: {r.status_code} url: {PUBTATOR_TMPL.replace('PMID', pmid)}"
          )
          return None
  
      known_types = ["CHEBI", "Chemical", "Disease", "Gene", "Species"]
  
      for idx, anno in enumerate(pubtator["denotations"]):
          s_match = re.match(r"(\w+):(\w+)", anno["obj"])
          c_match = re.match(r"(\w+):(\w+):(\w+)", anno["obj"])
          if c_match:
              (ctype, namespace, cid) = (
                  c_match.group(1),
                  c_match.group(2),
                  c_match.group(3),
              )
  
              if ctype not in known_types:
                  log.info(f"{ctype} not in known_types for Pubtator")
              if namespace not in known_types:
                  log.info(f"{namespace} not in known_types for Pubtator")
  
              pubtator["denotations"][idx][
                  "obj"
              ] = f'{pubtator_ns_convert.get(namespace, "UNKNOWN")}:{cid}'
              pubtator["denotations"][idx]["entity_type"] = pubtator_entity_convert.get(
                  ctype, None
              )
              pubtator["denotations"][idx][
                  "annotation_type"
              ] = pubtator_annotation_convert.get(ctype, None)
          elif s_match:
              (ctype, cid) = (s_match.group(1), s_match.group(2))
  
              if ctype not in known_types:
                  log.info(f"{ctype} not in known_types for Pubtator")
  
              pubtator["denotations"][idx][
                  "obj"
              ] = f'{pubtator_ns_convert.get(ctype, "UNKNOWN")}:{cid}'
              pubtator["denotations"][idx]["entity_type"] = pubtator_entity_convert.get(
                  ctype, None
              )
              pubtator["denotations"][idx][
                  "annotation_type"
              ] = pubtator_annotation_convert.get(ctype, None)
  
      annotations = {}
      for anno in pubtator["denotations"]:
          log.info(anno)
          if anno["obj"] not in annotations:
              annotations[anno["obj"]] = {"spans": [anno["span"]]}
              annotations[anno["obj"]]["entity_types"] = [anno.get("entity_type", [])]
              annotations[anno["obj"]]["annotation_types"] = [
                  anno.get("annotation_type", [])
              ]
  
          else:
              annotations[anno["obj"]]["spans"].append(anno["span"])
  
      del pubtator["denotations"]
      pubtator["annotations"] = copy.deepcopy(annotations)
  
      return pubtator