class_docstr: Text Processor class implement NER, POS tag, lexical tree parsing.
  EnProcessor is designed by single instance mode.
docstr: Convert tokens to sentence.
  
  Untokenizing a text undoes the tokenizing operation, restoring
  punctuation and spaces to the places that people expect them to be.
  Ideally, `untokenize(tokenize(text))` should be identical to `text`,
  except for line breaks.
  
  Watch out!
  Default punctuation add to the word before its index,
  it may raise inconsistency bug.
  
  :param list[str]r tokens: target token list
  :return: str
docstr_tok: ["Convert","tokens","to","sentence",".","Untokenizing","a","text","undoes","the","tokenizing","operation",",","restoring","punctuation","and","spaces","to","the","places","that","people","expect","them","to","be",".","Ideally",",","`","untokenize","(","tokenize","(","text",")",")","`","should","be","identical","to","`","text","`",",","except","for","line","breaks",".","Watch","out","!","Default","punctuation","add","to","the","word","before","its","index",",","it","may","raise","inconsistency","bug",".",":","param","list","[","str","]","r","tokens",":","target","token","list",":","return",":","str"]
code: def inverse_tokenize(tokens):
      r"""
      Convert tokens to sentence.
  
      Untokenizing a text undoes the tokenizing operation, restoring
      punctuation and spaces to the places that people expect them to be.
      Ideally, `untokenize(tokenize(text))` should be identical to `text`,
      except for line breaks.
  
      Watch out!
      Default punctuation add to the word before its index,
      it may raise inconsistency bug.
  
      :param list[str]r tokens: target token list
      :return: str
  
      """
      assert isinstance(tokens, list)
      text = " ".join(tokens)
      step1 = (
          text.replace("`` ", '"')
          .replace(" ''", '"')
          .replace(". . .", "...")
      )
      step2 = step1.replace(" ( ", " (").replace(" ) ", ") ")
      step3 = re.sub(r' ([.,:;?!%]+)([ \'"`])', r"\1\2", step2)
      step4 = re.sub(r" ([.,:;?!%]+)$", r"\1", step3)
      step5 = (
          step4.replace(" '", "'")
          .replace(" n't", "n't")
          .replace("can not", "cannot")
      )
      step6 = step5.replace(" ` ", " '")
      step7 = step6.replace("do nt", "dont").replace("Do nt", "Dont")
      step8 = step7.replace(" - ", "-")
      return step8.strip()
  
imports: import re
  import nltk
  import spacy
  import threading
  from functools import reduce
  from spacy.tokens import Doc
  from .nltk_res_load import *
  from ..settings import *
label_desc: Use image node_id 8 for calling the EnProcessor obj's underlying member method code with example usage: obj.inverse_tokenize(tokens) and returns: step8