input: Write a function to analyze the sentiment of a given text using NLTK's SentimentIntensityAnalyzer. The function should tokenize the text, stem each word, remove punctuation and stopwords, and then compute the polarity score. If the given text is empty, return the neutral sentiment score of zero.
  
  assert sentiment_analyzer("I love programming!")=={'neg': 0.0, 'neu': 0.476, 'pos': 0.524, 'compound': 0.6369}
  assert sentiment_analyzer("This is a terrible day.")=={'neg': 0.625, 'neu': 0.375, 'pos': 0.0, 'compound': -0.5423}
  assert sentiment_analyzer("")=={'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
output: from nltk.sentiment 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': 0.0, 'pos': 0.0, 'compound': 0.0}
      
      sia = SentimentIntensityAnalyzer()
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      tokens = word_tokenize(text.lower())
      filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalnum() and word not in stop_words]
      filtered_text = ' '.join(filtered_tokens)
      sentiment_scores = sia.polarity_scores(filtered_text)
      return sentiment_scores