class_docstr: Compute evaluation scores.
class_docstr_tok: ["Compute","evaluation","scores","."]
docstr: Return micro PRF and PRF scores per feat for a token attribute in
  UFEATS format.
  
  examples (Iterable[Example]): Examples to score
  attr (str): The attribute to score.
  getter (Callable[[Token, str], Any]): Defaults to getattr. If provided,
      getter(token, attr) should return the value of the attribute for an
      individual token.
  missing_values (Set[Any]): Attribute values to treat as missing
      annotation in the reference annotation.
  RETURNS (dict): A dictionary containing the micro PRF scores under the
      key attr_micro_p/r/f and the per-feat PRF scores under
      attr_per_feat.
docstr_tok: ["Return","micro","PRF","and","PRF","scores","per","feat","for","a","token","attribute","in","UFEATS","format",".","examples","(","Iterable","[","Example","]",")",":","Examples","to","score","attr","(","str",")",":","The","attribute","to","score",".","getter","(","Callable","[","[","Token",",","str","]",",","Any","]",")",":","Defaults","to","getattr",".","If","provided",",","getter","(","token",",","attr",")","should","return","the","value","of","the","attribute","for","an","individual","token",".","missing_values","(","Set","[","Any","]",")",":","Attribute","values","to","treat","as","missing","annotation","in","the","reference","annotation",".","RETURNS","(","dict",")",":","A","dictionary","containing","the","micro","PRF","scores","under","the","key","attr_micro_p\/r\/f","and","the","per-feat","PRF","scores","under","attr_per_feat","."]
code: def score_token_attr_per_feat(
      examples: Iterable[Example],
      attr: str,
      *,
      getter: Callable[[Token, str], Any] = getattr,
      missing_values: Set[Any] = MISSING_VALUES,  # type: ignore[assignment]
      **cfg,
  ) -> Dict[str, Any]:
      """Return micro PRF and PRF scores per feat for a token attribute in
      UFEATS format.
  
      examples (Iterable[Example]): Examples to score
      attr (str): The attribute to score.
      getter (Callable[[Token, str], Any]): Defaults to getattr. If provided,
          getter(token, attr) should return the value of the attribute for an
          individual token.
      missing_values (Set[Any]): Attribute values to treat as missing
          annotation in the reference annotation.
      RETURNS (dict): A dictionary containing the micro PRF scores under the
          key attr_micro_p/r/f and the per-feat PRF scores under
          attr_per_feat.
      """
      micro_score = PRFScore()
      per_feat = {}
      for example in examples:
          pred_doc = example.predicted
          gold_doc = example.reference
          align = example.alignment
          gold_per_feat: Dict[str, Set] = {}
          missing_indices = set()
          for gold_i, token in enumerate(gold_doc):
              value = getter(token, attr)
              morph = gold_doc.vocab.strings[value]
              if (
                  value not in missing_values
                  and morph != Morphology.EMPTY_MORPH
              ):
                  for feat in morph.split(Morphology.FEATURE_SEP):
                      field, values = feat.split(Morphology.FIELD_SEP)
                      if field not in per_feat:
                          per_feat[field] = PRFScore()
                      if field not in gold_per_feat:
                          gold_per_feat[field] = set()
                      gold_per_feat[field].add((gold_i, feat))
              else:
                  missing_indices.add(gold_i)
          pred_per_feat: Dict[str, Set] = {}
          for token in pred_doc:
              if token.orth_.isspace():
                  continue
              if align.x2y.lengths[token.i] == 1:
                  gold_i = align.x2y[token.i][0]
                  if gold_i not in missing_indices:
                      value = getter(token, attr)
                      morph = gold_doc.vocab.strings[value]
                      if (
                          value not in missing_values
                          and morph != Morphology.EMPTY_MORPH
                      ):
                          for feat in morph.split(
                              Morphology.FEATURE_SEP
                          ):
                              field, values = feat.split(
                                  Morphology.FIELD_SEP
                              )
                              if field not in per_feat:
                                  per_feat[field] = PRFScore()
                              if field not in pred_per_feat:
                                  pred_per_feat[field] = set()
                              pred_per_feat[field].add((gold_i, feat))
          for field in per_feat:
              micro_score.score_set(
                  pred_per_feat.get(field, set()),
                  gold_per_feat.get(field, set()),
              )
              per_feat[field].score_set(
                  pred_per_feat.get(field, set()),
                  gold_per_feat.get(field, set()),
              )
      result: Dict[str, Any] = {}
      if len(micro_score) > 0:
          result[f"{attr}_micro_p"] = micro_score.precision
          result[f"{attr}_micro_r"] = micro_score.recall
          result[f"{attr}_micro_f"] = micro_score.fscore
          result[f"{attr}_per_feat"] = {
              k: v.to_dict() for k, v in per_feat.items()
          }
      else:
          result[f"{attr}_micro_p"] = None
          result[f"{attr}_micro_r"] = None
          result[f"{attr}_micro_f"] = None
          result[f"{attr}_per_feat"] = None
      return result
  
imports: from collections import defaultdict
  from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, List, Optional, Set, Tuple
  import numpy
  from .errors import Errors
  from .morphology import Morphology
  from .tokens import Doc, Span, Token
  from .training import Example
  from .util import SimpleFrozenList, get_lang_class
label_desc: Use image node_id 5 for calling the Scorer obj's underlying member method code with example usage: obj.score_token_attr_per_feat(examples, attr) and returns: result