input: Write a function to analyze the sentiment of a given text by tokenizing it, stemming the words, removing punctuation and stopwords, and then calculating the polarity score using the Vader Sentiment Analysis tool. If the input text is empty, return an empty dictionary.
  assert sentiment_analyzer("I love programming!")=={'neg': 0.0, 'neu': 0.254, 'pos': 0.746, 'compound': 0.8316}
  assert sentiment_analyzer("This is the worst day ever.")=={'neg': 0.607, 'neu': 0.393, 'pos': 0.0, 'compound': -0.6249}
  assert sentiment_analyzer("")=={}
  assert sentiment_analyzer("I am neutral.")=={'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}
  assert sentiment_analyzer("The movie was okay, but the music was great!")=={'neg': 0.0, 'neu': 0.76, 'pos': 0.24, 'compound': 0.6369}
output: from nltk.tokenize import word_tokenize
  from nltk.stem import PorterStemmer
  from nltk.corpus import stopwords
  from string import punctuation
  from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
  
  def sentiment_analyzer(text):
      if not text:
          return {}
      
      # Tokenize the text
      tokens = word_tokenize(text.lower())
      
      # Remove punctuation and stopwords
      stop_words = set(stopwords.words('english'))
      filtered_tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
      
      # Stem the words
      stemmer = PorterStemmer()
      stemmed_tokens = [stemmer.stem(word) for word in filtered_tokens]
      
      # Join the stemmed tokens back into a single string
      processed_text = ' '.join(stemmed_tokens)
      
      # Calculate the polarity score
      analyzer = SentimentIntensityAnalyzer()
      sentiment_scores = analyzer.polarity_scores(processed_text)
      
      return sentiment_scores