input: Write a function to analyze the sentiment of a given text using tokenization, stemming, removing punctuation and stopwords, and finally calculating the polarity score. If the input text is empty or only contains punctuation and stopwords, the function should return a polarity score of 0 for all sentiments.
  assert sentiment_analyzer("I love programming")=={'neg': 0.0, 'neu': 0.304, 'pos': 0.696, 'compound': 0.6369}
  assert sentiment_analyzer("Why is this so hard?")=={'neg': 0.454, 'neu': 0.546, 'pos': 0.0, 'compound': -0.296)
  assert sentiment_analyzer("^^^^^")=={'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
  assert sentiment_analyzer("\"\"\"")=={'neg': 0.0, 'neu': 0.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.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):
      sia = SentimentIntensityAnalyzer()
      stemmer = PorterStemmer()
      stop_words = set(stopwords.words('english'))
      punctuation = set(string.punctuation)
      
      if not text or all(char in punctuation for char in text):
          return {'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
      
      tokens = word_tokenize(text.lower())
      filtered_tokens = [stemmer.stem(word) for word in tokens if word.isalpha() and word not in stop_words]
      
      if not filtered_tokens:
          return {'neg': 0.0, 'neu': 0.0, 'pos': 0.0, 'compound': 0.0}
      
      filtered_text = ' '.join(filtered_tokens)
      sentiment = sia.polarity_scores(filtered_text)
      
      return sentiment
  