input: Write a function that performs sentiment analysis on a given text. The function should tokenize the text, apply stemming, remove stopwords and punctuation, and then compute a sentiment polarity score. If the input text is empty, the function should return a neutral sentiment score. The function should be named `sentiment_analyzer` and take one parameter which is the text to be analyzed.
  
  `def sentiment_analyzer(text):`
  
  assert sentiment_analyzer("I love programming")=={'neg': 0.0, 'neu': 0.0, 'pos': 1.0, 'compound': 0.6369}
  assert sentiment_analyzer("This is a terrible experience")=={'neg': 0.702, 'neu': 0.298, 'pos': 0.0, 'compound': -0.8271}
  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 and word not in string.punctuation]
      filtered_text = ' '.join(filtered_tokens)
      
      sentiment = sia.polarity_scores(filtered_text)
      return sentiment
  