input: Write a function to analyze the sentiment of a given text using NLTK and VADER sentiment analysis. The function should tokenize the text, stem the tokens, remove punctuation and stopwords, and then return the polarity score of the text. If the text is empty, the function should return a polarity score of {'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}.
  assert sentiment_analyzer("This is a great day!")=={'neg': 0.0, 'neu': 0.4, 'pos': 0.6, 'compound': 0.6249}
  assert sentiment_analyzer("I hate this weather.")=={'neg': 0.6, 'neu': 0.4, 'pos': 0.0, 'compound': -0.5719}
  assert sentiment_analyzer("This is a neutral sentence.")=={'neg': 0.0, 'neu': 0.657, 'pos': 0.343, 'compound': 0.2100}
  assert sentiment_analyzer("")=={'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}
output: 
  from nltk.sentiment.vader import SentimentIntensityAnalyzer
  from nltk.tokenize import word_tokenize
  from nltk.stem import PorterStemmer
  from nltk.corpus import stopwords
  import string
  
  def sentiment_analyzer(text):
      if not text:
          return {'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}
      
      analyzer = SentimentIntensityAnalyzer()
      tokens = word_tokenize(text.lower())
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalnum() and word not in stop_words]
      filtered_text = ' '.join(filtered_tokens)
      
      return analyzer.polarity_scores(filtered_text)
  