input: Write a function to analyze the sentiment of a text. The function should tokenize the text, remove stopwords and punctuation, stem the remaining words, and then calculate the sentiment polarity score using the VADER sentiment analysis tool. Return the polarity score.
  
  assert sentiment_analyzer("I love programming!")=={'neg': 0.0, 'neu': 0.5, 'pos': 0.5, 'compound': 0.6369}
  assert sentiment_analyzer("This is the worst day ever.")=={'neg': 0.76, 'neu': 0.24, 'pos': 0.0, 'compound': -0.8316}
  assert sentiment_analyzer("The weather is neutral today.")=={'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}
  assert sentiment_analyzer("")=={'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
output: from nltk.tokenize import word_tokenize
  from nltk.corpus import stopwords
  from nltk.stem import PorterStemmer
  from nltk.sentiment.vader import SentimentIntensityAnalyzer
  import string
  
  def sentiment_analyzer(text):
      if not text:
          return {'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
      
      tokens = word_tokenize(text.lower())
      stop_words = set(stopwords.words('english'))
      filtered_tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
      
      stemmer = PorterStemmer()
      stemmed_tokens = [stemmer.stem(word) for word in filtered_tokens]
      
      sia = SentimentIntensityAnalyzer()
      sentiment_score = sia.polarity_scores(' '.join(stemmed_tokens))
      
      return sentiment_score