input: Write a python function to normalize a given text by removing punctuation and lemmatizing the tokens.
  assert LemNormalize("The quick brown foxes were jumping over the lazy dogs!") == ['the', 'quick', 'brown', 'fox', 'were', 'jump', 'over', 'the', 'lazy', 'dog']
  assert LemNormalize("Running faster than the wind, she managed to win!") == ['run', 'faster', 'than', 'the', 'wind', 'she', 'manage', 'to', 'win']
  assert LemNormalize("Cats and dogs, living together in harmony.") == ['cat', 'and', 'dog', 'live', 'together', 'in', 'harmony']
output: import nltk
  import string
  from nltk.corpus import wordnet
  from nltk.stem import WordNetLemmatizer
  
  nltk.download('punkt')
  nltk.download('wordnet')
  nltk.download('averaged_perceptron_tagger')
  
  def get_wordnet_pos(treebank_tag):
      if treebank_tag.startswith('J'):
          return wordnet.ADJ
      elif treebank_tag.startswith('V'):
          return wordnet.VERB
      elif treebank_tag.startswith('N'):
          return wordnet.NOUN
      elif treebank_tag.startswith('R'):
          return wordnet.ADV
      else:
          return None
  
  def LemNormalize(text):
      lemmatizer = WordNetLemmatizer()
      tokens = nltk.word_tokenize(text)
      pos_tags = nltk.pos_tag(tokens)
      lemmatized_tokens = []
  
      for token, pos in pos_tags:
          wordnet_pos = get_wordnet_pos(pos) or wordnet.NOUN
          lemmatized_token = lemmatizer.lemmatize(token.lower(), pos=wordnet_pos)
          if lemmatized_token not in string.punctuation:
              lemmatized_tokens.append(lemmatized_token)
  
      return lemmatized_tokens