code: def _pymorphy_lemmatize(self, token: Token) -> List[str]:
      string = token.text
      univ_pos = token.pos_
      morphology = token.morph.to_dict()
      if univ_pos == "PUNCT":
          return [PUNCT_RULES.get(string, string)]
      if univ_pos not in (
          "ADJ",
          "DET",
          "NOUN",
          "NUM",
          "PRON",
          "PROPN",
          "VERB",
      ):
          return self._pymorphy_lookup_lemmatize(token)
      analyses = self._morph.parse(string)
      filtered_analyses = []
      for analysis in analyses:
          if not analysis.is_known:
              # Skip suggested parse variant for unknown word for pymorphy
              continue
          analysis_pos, _ = oc2ud(str(analysis.tag))
          if (
              analysis_pos == univ_pos
              or (
                  analysis_pos in ("NOUN", "PROPN")
                  and univ_pos in ("NOUN", "PROPN")
              )
              or ((analysis_pos == "PRON") and (univ_pos == "DET"))
          ):
              filtered_analyses.append(analysis)
      if not len(filtered_analyses):
          return [string.lower()]
      if morphology is None or (
          len(morphology) == 1 and POS in morphology
      ):
          return list(
              dict.fromkeys(
                  [
                      analysis.normal_form
                      for analysis in filtered_analyses
                  ]
              )
          )
      if univ_pos in ("ADJ", "DET", "NOUN", "PROPN"):
          features_to_compare = ["Case", "Number", "Gender"]
      elif univ_pos == "NUM":
          features_to_compare = ["Case", "Gender"]
      elif univ_pos == "PRON":
          features_to_compare = ["Case", "Number", "Gender", "Person"]
      else:  # VERB
          features_to_compare = [
              "Aspect",
              "Gender",
              "Mood",
              "Number",
              "Tense",
              "VerbForm",
              "Voice",
          ]
      analyses, filtered_analyses = filtered_analyses, []
      for analysis in analyses:
          _, analysis_morph = oc2ud(str(analysis.tag))
          for feature in features_to_compare:
              if (
                  feature in morphology
                  and feature in analysis_morph
                  and morphology[feature].lower()
                  != analysis_morph[feature].lower()
              ):
                  break
          else:
              filtered_analyses.append(analysis)
      if not len(filtered_analyses):
          return [string.lower()]
      return list(
          dict.fromkeys(
              [analysis.normal_form for analysis in filtered_analyses]
          )
      )
  
file_path: spaCy/spacy/lang/ru/lemmatizer.py
imports: from typing import Callable, Dict, List, Optional, Tuple
  from thinc.api import Model
  from ...pipeline import Lemmatizer
  from ...pipeline.lemmatizer import lemmatizer_score
  from ...symbols import POS
  from ...tokens import Token
  from ...vocab import Vocab
label_desc: Use image node_id 2 for calling the RussianLemmatizer obj's underlying member method code with example usage: obj._pymorphy_lemmatize(token) and returns: list, list, self, list, list, list