code: def __call__(self, text: str) -> Doc:
      dtokens = list(self.detailed_tokens(text))
      surfaces = [dt["surface"] for dt in dtokens]
      doc = Doc(
          self.vocab,
          words=surfaces,
          spaces=list(check_spaces(text, surfaces)),
      )
      for token, dtoken in zip(doc, dtokens):
          first_tag, sep, eomi_tags = dtoken["tag"].partition("+")
          token.tag_ = first_tag  # stem(어간) or pre-final(선어말 어미)
          if token.tag_ in TAG_MAP:
              token.pos = TAG_MAP[token.tag_][POS]
          else:
              token.pos = X
          token.lemma_ = dtoken["lemma"]
      doc.user_data["full_tags"] = [dt["tag"] for dt in dtokens]
      return doc
  
imports: from typing import Any, Dict, Iterator
  from ...language import BaseDefaults, Language
  from ...scorer import Scorer
  from ...symbols import POS, X
  from ...tokens import Doc
  from ...training import validate_examples
  from ...util import DummyTokenizer, load_config_from_str, registry
  from ...vocab import Vocab
  from .lex_attrs import LEX_ATTRS
  from .punctuation import TOKENIZER_INFIXES
  from .stop_words import STOP_WORDS
  from .tag_map import TAG_MAP
label_desc: Use image node_id 4 for calling the KoreanTokenizer obj's underlying member method code with example usage: obj.__call__(text) and returns: doc