class_docstr: Vocabulary class that handles parsing and printing composite values such as
  compositional XPOS and universal morphological features (UFeats).
  
  Two key options are `keyed` and `sep`. `sep` specifies the separator used between
  different parts of the composite values, which is `|` for UFeats, for example.
  If `keyed` is `True`, then the incoming value is treated similarly to UFeats, where
  each part is a key/value pair separated by an equal sign (`=`). There are no inherit
  order to the keys, and we sort them alphabetically for serialization and deserialization.
  Whenever a part is absent, its internal value is a special `<EMPTY>` symbol that will
  be treated accordingly when generating the output. If `keyed` is `False`, then the parts
  are treated as positioned values, and `<EMPTY>` is used to pad parts at the end when the
  incoming value is not long enough.
code: def unit2id(self, unit):
      parts = self.unit2parts(unit)
      if self.keyed:
          # treat multi-valued properties as singletons
          return [
              self._unit2id[k].get(parts[k], UNK_ID)
              if k in parts
              else EMPTY_ID
              for k in self._unit2id
          ]
      else:
          return [
              self._unit2id[i].get(parts[i], UNK_ID)
              if i < len(parts)
              else EMPTY_ID
              for i in range(len(self._unit2id))
          ]
  
imports: from copy import copy
  from collections import Counter, OrderedDict
  from collections.abc import Iterable
  import os
  import pickle
label_desc: Use image node_id 3 for calling the CompositeVocab obj's underlying member method code with example usage: obj.unit2id(unit) and returns: unknown, unknown